@remotion/cloudrun 4.1.0-alpha10

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 (189) hide show
  1. package/.turbo/turbo-build.log +13 -0
  2. package/LICENSE.md +41 -0
  3. package/dist/admin/bundle-installer.d.ts +1 -0
  4. package/dist/admin/bundle-installer.js +32 -0
  5. package/dist/admin/bundle-renderLogic.d.ts +1 -0
  6. package/dist/admin/bundle-renderLogic.js +39 -0
  7. package/dist/api/check-if-service-exists.d.ts +18 -0
  8. package/dist/api/check-if-service-exists.js +49 -0
  9. package/dist/api/create-bucket.d.ts +13 -0
  10. package/dist/api/create-bucket.js +18 -0
  11. package/dist/api/delete-service.d.ts +12 -0
  12. package/dist/api/delete-service.js +19 -0
  13. package/dist/api/delete-site.d.ts +13 -0
  14. package/dist/api/delete-site.js +30 -0
  15. package/dist/api/deploy-service.d.ts +28 -0
  16. package/dist/api/deploy-service.js +90 -0
  17. package/dist/api/deploy-site.d.ts +35 -0
  18. package/dist/api/deploy-site.js +78 -0
  19. package/dist/api/download-file.d.ts +13 -0
  20. package/dist/api/download-file.js +30 -0
  21. package/dist/api/get-buckets.d.ts +10 -0
  22. package/dist/api/get-buckets.js +23 -0
  23. package/dist/api/get-or-create-bucket.d.ts +17 -0
  24. package/dist/api/get-or-create-bucket.js +42 -0
  25. package/dist/api/get-regions.d.ts +7 -0
  26. package/dist/api/get-regions.js +13 -0
  27. package/dist/api/get-service-info.d.ts +23 -0
  28. package/dist/api/get-service-info.js +34 -0
  29. package/dist/api/get-services.d.ts +14 -0
  30. package/dist/api/get-services.js +49 -0
  31. package/dist/api/get-sites.d.ts +23 -0
  32. package/dist/api/get-sites.js +49 -0
  33. package/dist/api/helpers/IService.d.ts +2 -0
  34. package/dist/api/helpers/IService.js +2 -0
  35. package/dist/api/helpers/construct-service-deploy-request.d.ts +32 -0
  36. package/dist/api/helpers/construct-service-deploy-request.js +36 -0
  37. package/dist/api/helpers/extract-mem-from-url.d.ts +1 -0
  38. package/dist/api/helpers/extract-mem-from-url.js +9 -0
  39. package/dist/api/helpers/extract-time-from-url.d.ts +1 -0
  40. package/dist/api/helpers/extract-time-from-url.js +13 -0
  41. package/dist/api/helpers/get-auth-client-for-url.d.ts +1 -0
  42. package/dist/api/helpers/get-auth-client-for-url.js +15 -0
  43. package/dist/api/helpers/get-cloud-logging-client.d.ts +1 -0
  44. package/dist/api/helpers/get-cloud-logging-client.js +15 -0
  45. package/dist/api/helpers/get-cloud-run-client.d.ts +2 -0
  46. package/dist/api/helpers/get-cloud-run-client.js +15 -0
  47. package/dist/api/helpers/get-cloud-storage-client.d.ts +2 -0
  48. package/dist/api/helpers/get-cloud-storage-client.js +14 -0
  49. package/dist/api/helpers/get-cloudrun-endpoint.d.ts +14 -0
  50. package/dist/api/helpers/get-cloudrun-endpoint.js +36 -0
  51. package/dist/api/helpers/get-resource-manager-client.d.ts +2 -0
  52. package/dist/api/helpers/get-resource-manager-client.js +15 -0
  53. package/dist/api/helpers/parse-service-name.d.ts +8 -0
  54. package/dist/api/helpers/parse-service-name.js +24 -0
  55. package/dist/api/iam-validation/testPermissions.d.ts +20 -0
  56. package/dist/api/iam-validation/testPermissions.js +48 -0
  57. package/dist/api/render-media-on-cloudrun.d.ts +78 -0
  58. package/dist/api/render-media-on-cloudrun.js +144 -0
  59. package/dist/api/render-still-on-cloudrun.d.ts +49 -0
  60. package/dist/api/render-still-on-cloudrun.js +76 -0
  61. package/dist/api/speculate-service-name.d.ts +13 -0
  62. package/dist/api/speculate-service-name.js +20 -0
  63. package/dist/api/test/service-names.test.d.ts +1 -0
  64. package/dist/api/test/service-names.test.js +28 -0
  65. package/dist/api/upload-dir.d.ts +18 -0
  66. package/dist/api/upload-dir.js +81 -0
  67. package/dist/cli/args.d.ts +19 -0
  68. package/dist/cli/args.js +11 -0
  69. package/dist/cli/commands/permissions.d.ts +2 -0
  70. package/dist/cli/commands/permissions.js +23 -0
  71. package/dist/cli/commands/regions.d.ts +2 -0
  72. package/dist/cli/commands/regions.js +10 -0
  73. package/dist/cli/commands/render/helpers/renderArgsCheck.d.ts +9 -0
  74. package/dist/cli/commands/render/helpers/renderArgsCheck.js +75 -0
  75. package/dist/cli/commands/render/index.d.ts +2 -0
  76. package/dist/cli/commands/render/index.js +228 -0
  77. package/dist/cli/commands/services/deploy.d.ts +2 -0
  78. package/dist/cli/commands/services/deploy.js +129 -0
  79. package/dist/cli/commands/services/index.d.ts +5 -0
  80. package/dist/cli/commands/services/index.js +64 -0
  81. package/dist/cli/commands/services/ls.d.ts +2 -0
  82. package/dist/cli/commands/services/ls.js +40 -0
  83. package/dist/cli/commands/services/rm.d.ts +2 -0
  84. package/dist/cli/commands/services/rm.js +63 -0
  85. package/dist/cli/commands/services/rmall.d.ts +2 -0
  86. package/dist/cli/commands/services/rmall.js +52 -0
  87. package/dist/cli/commands/sites/create.d.ts +2 -0
  88. package/dist/cli/commands/sites/create.js +138 -0
  89. package/dist/cli/commands/sites/index.d.ts +4 -0
  90. package/dist/cli/commands/sites/index.js +60 -0
  91. package/dist/cli/commands/sites/ls.d.ts +2 -0
  92. package/dist/cli/commands/sites/ls.js +40 -0
  93. package/dist/cli/commands/sites/rm.d.ts +2 -0
  94. package/dist/cli/commands/sites/rm.js +59 -0
  95. package/dist/cli/commands/sites/rmall.d.ts +2 -0
  96. package/dist/cli/commands/sites/rmall.js +38 -0
  97. package/dist/cli/commands/still.d.ts +2 -0
  98. package/dist/cli/commands/still.js +129 -0
  99. package/dist/cli/get-gcp-region.d.ts +2 -0
  100. package/dist/cli/get-gcp-region.js +19 -0
  101. package/dist/cli/help.d.ts +1 -0
  102. package/dist/cli/help.js +38 -0
  103. package/dist/cli/helpers/confirm.d.ts +4 -0
  104. package/dist/cli/helpers/confirm.js +12 -0
  105. package/dist/cli/helpers/date-string.d.ts +1 -0
  106. package/dist/cli/helpers/date-string.js +9 -0
  107. package/dist/cli/helpers/progress-bar.d.ts +23 -0
  108. package/dist/cli/helpers/progress-bar.js +81 -0
  109. package/dist/cli/helpers/quit.d.ts +1 -0
  110. package/dist/cli/helpers/quit.js +7 -0
  111. package/dist/cli/helpers/yes-or-no.d.ts +4 -0
  112. package/dist/cli/helpers/yes-or-no.js +44 -0
  113. package/dist/cli/index.d.ts +1 -0
  114. package/dist/cli/index.js +56 -0
  115. package/dist/cli/log.d.ts +26 -0
  116. package/dist/cli/log.js +5 -0
  117. package/dist/defaults.d.ts +1 -0
  118. package/dist/defaults.js +17 -0
  119. package/dist/functions/helpers/get-composition-from-body.d.ts +2 -0
  120. package/dist/functions/helpers/get-composition-from-body.js +27 -0
  121. package/dist/functions/helpers/io.d.ts +11 -0
  122. package/dist/functions/helpers/io.js +17 -0
  123. package/dist/functions/helpers/payloads.d.ts +300 -0
  124. package/dist/functions/helpers/payloads.js +104 -0
  125. package/dist/functions/index.d.ts +3 -0
  126. package/dist/functions/index.js +39 -0
  127. package/dist/functions/render-media-single-thread.d.ts +3 -0
  128. package/dist/functions/render-media-single-thread.js +103 -0
  129. package/dist/functions/render-still-single-thread.d.ts +3 -0
  130. package/dist/functions/render-still-single-thread.js +82 -0
  131. package/dist/index.d.ts +20 -0
  132. package/dist/index.js +31 -0
  133. package/dist/internals.d.ts +3 -0
  134. package/dist/internals.js +7 -0
  135. package/dist/pricing/gcp-regions.d.ts +5 -0
  136. package/dist/pricing/gcp-regions.js +77 -0
  137. package/dist/regions.d.ts +2 -0
  138. package/dist/regions.js +5 -0
  139. package/dist/shared/bundle-site.d.ts +2 -0
  140. package/dist/shared/bundle-site.js +5 -0
  141. package/dist/shared/constants.d.ts +13 -0
  142. package/dist/shared/constants.js +18 -0
  143. package/dist/shared/convert-to-serve-url.d.ts +4 -0
  144. package/dist/shared/convert-to-serve-url.js +14 -0
  145. package/dist/shared/docs-url.d.ts +1 -0
  146. package/dist/shared/docs-url.js +4 -0
  147. package/dist/shared/generate-service-name.d.ts +5 -0
  148. package/dist/shared/generate-service-name.js +20 -0
  149. package/dist/shared/get-etag.d.ts +1 -0
  150. package/dist/shared/get-etag.js +24 -0
  151. package/dist/shared/get-storage-operations.d.ts +10 -0
  152. package/dist/shared/get-storage-operations.js +36 -0
  153. package/dist/shared/make-storage-key.d.ts +1 -0
  154. package/dist/shared/make-storage-key.js +11 -0
  155. package/dist/shared/make-storage-url.d.ts +4 -0
  156. package/dist/shared/make-storage-url.js +7 -0
  157. package/dist/shared/random-hash.d.ts +3 -0
  158. package/dist/shared/random-hash.js +14 -0
  159. package/dist/shared/read-dir.d.ts +9 -0
  160. package/dist/shared/read-dir.js +57 -0
  161. package/dist/shared/sa-permissions.json +64 -0
  162. package/dist/shared/service-version-string.d.ts +1 -0
  163. package/dist/shared/service-version-string.js +8 -0
  164. package/dist/shared/validate-bucketname.d.ts +8 -0
  165. package/dist/shared/validate-bucketname.js +35 -0
  166. package/dist/shared/validate-cloudrun-url.d.ts +1 -0
  167. package/dist/shared/validate-cloudrun-url.js +10 -0
  168. package/dist/shared/validate-gcp-codec.d.ts +4 -0
  169. package/dist/shared/validate-gcp-codec.js +29 -0
  170. package/dist/shared/validate-gcp-region.d.ts +2 -0
  171. package/dist/shared/validate-gcp-region.js +10 -0
  172. package/dist/shared/validate-image-remotion-version.d.ts +1 -0
  173. package/dist/shared/validate-image-remotion-version.js +26 -0
  174. package/dist/shared/validate-privacy.d.ts +2 -0
  175. package/dist/shared/validate-privacy.js +12 -0
  176. package/dist/shared/validate-project-id.d.ts +1 -0
  177. package/dist/shared/validate-project-id.js +17 -0
  178. package/dist/shared/validate-region.d.ts +1 -0
  179. package/dist/shared/validate-region.js +15 -0
  180. package/dist/shared/validate-retries.d.ts +1 -0
  181. package/dist/shared/validate-retries.js +21 -0
  182. package/dist/shared/validate-serveurl.d.ts +1 -0
  183. package/dist/shared/validate-serveurl.js +30 -0
  184. package/dist/shared/validate-service-name.d.ts +1 -0
  185. package/dist/shared/validate-service-name.js +9 -0
  186. package/dist/shared/validate-site-name.d.ts +1 -0
  187. package/dist/shared/validate-site-name.js +17 -0
  188. package/package.json +57 -0
  189. package/readme.md +3 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderArgsCheck = void 0;
4
+ const get_or_create_bucket_1 = require("../../../../api/get-or-create-bucket");
5
+ const get_service_info_1 = require("../../../../api/get-service-info");
6
+ const get_services_1 = require("../../../../api/get-services");
7
+ const constants_1 = require("../../../../shared/constants");
8
+ const convert_to_serve_url_1 = require("../../../../shared/convert-to-serve-url");
9
+ const validate_privacy_1 = require("../../../../shared/validate-privacy");
10
+ const args_1 = require("../../../args");
11
+ const get_gcp_region_1 = require("../../../get-gcp-region");
12
+ const quit_1 = require("../../../helpers/quit");
13
+ const log_1 = require("../../../log");
14
+ const services_1 = require("../../services");
15
+ const deploy_1 = require("../../services/deploy");
16
+ const renderArgsCheck = async (subcommand, args) => {
17
+ var _a, _b, _c, _d;
18
+ let region = (0, get_gcp_region_1.getGcpRegion)();
19
+ let remotionBucket;
20
+ let serveUrl = args[0];
21
+ if (!serveUrl) {
22
+ log_1.Log.error('No serve URL passed.');
23
+ log_1.Log.info('Pass an additional argument specifying a URL where your Remotion project is hosted.');
24
+ log_1.Log.info();
25
+ log_1.Log.info(`${constants_1.BINARY_NAME} ${subcommand} <serve-url> <composition-id> [output-location]`);
26
+ (0, quit_1.quit)(1);
27
+ }
28
+ if (!serveUrl.startsWith('https://') && !serveUrl.startsWith('http://')) {
29
+ const siteName = serveUrl;
30
+ log_1.Log.verbose('Remotion site-name passed, constructing serve url...');
31
+ region = region !== null && region !== void 0 ? region : (0, get_gcp_region_1.getGcpRegion)();
32
+ remotionBucket = (await (0, get_or_create_bucket_1.getOrCreateBucket)({ region })).bucketName;
33
+ serveUrl = (0, convert_to_serve_url_1.convertToServeUrl)({
34
+ urlOrId: siteName,
35
+ bucketName: remotionBucket,
36
+ });
37
+ }
38
+ const outName = args_1.parsedCloudrunCli['out-name'];
39
+ const downloadName = (_a = args[2]) !== null && _a !== void 0 ? _a : null;
40
+ const privacy = (_b = args_1.parsedCloudrunCli.privacy) !== null && _b !== void 0 ? _b : constants_1.DEFAULT_OUTPUT_PRIVACY;
41
+ (0, validate_privacy_1.validatePrivacy)(privacy);
42
+ const forceBucketName = (_d = (_c = args_1.parsedCloudrunCli['force-bucket-name']) !== null && _c !== void 0 ? _c : remotionBucket) !== null && _d !== void 0 ? _d : (await (0, get_or_create_bucket_1.getOrCreateBucket)({ region })).bucketName;
43
+ let cloudRunUrl = args_1.parsedCloudrunCli['cloud-run-url'];
44
+ let serviceName = args_1.parsedCloudrunCli['service-name'];
45
+ if (cloudRunUrl && serviceName) {
46
+ log_1.Log.error('Both a Cloud Run URL and a Service Name was provided. Specify only one.');
47
+ (0, quit_1.quit)(1);
48
+ }
49
+ if (!cloudRunUrl && !serviceName) {
50
+ const services = await (0, get_services_1.getServices)({ region, compatibleOnly: true });
51
+ if (services.length === 0) {
52
+ // TODO: Log if there is an incompatible service
53
+ log_1.Log.error('No compatible services found. Please create a service first:');
54
+ log_1.Log.info();
55
+ log_1.Log.info(` ${constants_1.BINARY_NAME} ${services_1.SERVICES_COMMAND} ${deploy_1.CLOUD_RUN_DEPLOY_SUBCOMMAND}`);
56
+ (0, quit_1.quit)(1);
57
+ }
58
+ serviceName = services[0].serviceName;
59
+ cloudRunUrl = services[0].uri;
60
+ }
61
+ if (serviceName && !cloudRunUrl) {
62
+ const { uri } = await (0, get_service_info_1.getServiceInfo)({ serviceName, region });
63
+ cloudRunUrl = uri;
64
+ }
65
+ return {
66
+ serveUrl,
67
+ cloudRunUrl,
68
+ outName,
69
+ forceBucketName,
70
+ privacy,
71
+ downloadName,
72
+ region,
73
+ };
74
+ };
75
+ exports.renderArgsCheck = renderArgsCheck;
@@ -0,0 +1,2 @@
1
+ export declare const RENDER_COMMAND = "render";
2
+ export declare const renderCommand: (args: string[], remotionRoot: string) => Promise<void>;
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderCommand = exports.RENDER_COMMAND = void 0;
4
+ const cli_1 = require("@remotion/cli");
5
+ const render_media_on_cloudrun_1 = require("../../../api/render-media-on-cloudrun");
6
+ // import {validateMaxRetries} from '../../../shared/validate-retries';
7
+ const config_1 = require("@remotion/cli/config");
8
+ const renderer_1 = require("@remotion/renderer");
9
+ const remotion_1 = require("remotion");
10
+ const download_file_1 = require("../../../api/download-file");
11
+ const extract_mem_from_url_1 = require("../../../api/helpers/extract-mem-from-url");
12
+ const extract_time_from_url_1 = require("../../../api/helpers/extract-time-from-url");
13
+ const get_cloud_logging_client_1 = require("../../../api/helpers/get-cloud-logging-client");
14
+ const validate_serveurl_1 = require("../../../shared/validate-serveurl");
15
+ const args_1 = require("../../args");
16
+ const log_1 = require("../../log");
17
+ const renderArgsCheck_1 = require("./helpers/renderArgsCheck");
18
+ exports.RENDER_COMMAND = 'render';
19
+ const renderCommand = async (args, remotionRoot) => {
20
+ var _a, _b;
21
+ const { serveUrl, cloudRunUrl, outName, forceBucketName, downloadName, privacy, region, } = await (0, renderArgsCheck_1.renderArgsCheck)(exports.RENDER_COMMAND, args);
22
+ const { codec, reason: codecReason } = cli_1.CliInternals.getFinalOutputCodec({
23
+ cliFlag: cli_1.CliInternals.parsedCli.codec,
24
+ downloadName,
25
+ outName: outName !== null && outName !== void 0 ? outName : null,
26
+ configFile: (_a = config_1.ConfigInternals.getOutputCodecOrUndefined()) !== null && _a !== void 0 ? _a : null,
27
+ uiCodec: null,
28
+ });
29
+ const imageFormat = args_1.parsedCloudrunCli['image-format'];
30
+ const audioCodec = args_1.parsedCloudrunCli['audio-codec'];
31
+ const { chromiumOptions, crf, envVariables, frameRange, inputProps, logLevel, puppeteerTimeout, pixelFormat, proResProfile, jpegQuality, scale, everyNthFrame, numberOfGifLoops, muted, audioBitrate, videoBitrate, height, width, browserExecutable, port, enforceAudioTrack, } = await cli_1.CliInternals.getCliOptions({
32
+ type: 'series',
33
+ isLambda: true,
34
+ remotionRoot,
35
+ });
36
+ let composition = args[1];
37
+ if (!composition) {
38
+ log_1.Log.info('No compositions passed. Fetching compositions...');
39
+ (0, validate_serveurl_1.validateServeUrl)(serveUrl);
40
+ const server = renderer_1.RenderInternals.prepareServer({
41
+ concurrency: 1,
42
+ indent: false,
43
+ port,
44
+ remotionRoot,
45
+ logLevel,
46
+ webpackConfigOrServeUrl: serveUrl,
47
+ });
48
+ const { compositionId } = await cli_1.CliInternals.getCompositionWithDimensionOverride({
49
+ args,
50
+ compositionIdFromUi: null,
51
+ browserExecutable,
52
+ chromiumOptions,
53
+ envVariables,
54
+ height,
55
+ indent: false,
56
+ port,
57
+ puppeteerInstance: undefined,
58
+ serveUrlOrWebpackUrl: serveUrl,
59
+ timeoutInMilliseconds: puppeteerTimeout,
60
+ logLevel,
61
+ width,
62
+ server: await server,
63
+ serializedInputPropsWithCustomSchema: remotion_1.Internals.serializeJSONWithDate({
64
+ data: inputProps,
65
+ indent: undefined,
66
+ staticBase: null,
67
+ }).serializedString,
68
+ });
69
+ composition = compositionId;
70
+ }
71
+ // Todo: Check cloudRunUrl is valid, as the error message is obtuse
72
+ cli_1.CliInternals.Log.info(cli_1.CliInternals.chalk.gray(`
73
+ Cloud Run Service URL = ${cloudRunUrl}
74
+ Region = ${region}
75
+ Type = media
76
+ Composition = ${composition}
77
+ Codec = ${codec}
78
+ Output Bucket = ${forceBucketName}
79
+ Output File = ${outName !== null && outName !== void 0 ? outName : 'out.mp4'}
80
+ Output File Privacy = ${privacy}
81
+ ${downloadName ? ` Downloaded File = ${downloadName}` : ''}
82
+ `.trim()));
83
+ log_1.Log.info();
84
+ const renderStart = Date.now();
85
+ const progressBar = cli_1.CliInternals.createOverwriteableCliOutput({
86
+ quiet: cli_1.CliInternals.quietFlagProvided(),
87
+ cancelSignal: null,
88
+ updatesDontOverwrite: false,
89
+ indent: false,
90
+ });
91
+ const renderProgress = {
92
+ doneIn: null,
93
+ progress: 0,
94
+ };
95
+ const updateProgress = () => {
96
+ progressBar.update([
97
+ `Rendering on Cloud Run: `,
98
+ cli_1.CliInternals.makeProgressBar(renderProgress.progress),
99
+ `${renderProgress.doneIn === null ? 'Rendering' : 'Rendered'}`,
100
+ renderProgress.doneIn === null
101
+ ? `${Math.round(renderProgress.progress * 100)}%`
102
+ : cli_1.CliInternals.chalk.gray(`${renderProgress.doneIn}ms`),
103
+ ].join(' '), false);
104
+ };
105
+ const updateRenderProgress = (progress, error) => {
106
+ if (error) {
107
+ // exiting progress and adding space
108
+ log_1.Log.info(`
109
+
110
+ `);
111
+ }
112
+ else {
113
+ renderProgress.progress = progress;
114
+ updateProgress();
115
+ }
116
+ };
117
+ const res = await (0, render_media_on_cloudrun_1.renderMediaOnCloudrun)({
118
+ cloudRunUrl,
119
+ serveUrl,
120
+ region,
121
+ inputProps,
122
+ codec: codec,
123
+ imageFormat,
124
+ crf: crf !== null && crf !== void 0 ? crf : undefined,
125
+ envVariables,
126
+ pixelFormat,
127
+ proResProfile,
128
+ jpegQuality,
129
+ composition,
130
+ privacy,
131
+ frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : undefined,
132
+ outName,
133
+ chromiumOptions,
134
+ scale,
135
+ numberOfGifLoops,
136
+ everyNthFrame,
137
+ muted,
138
+ audioBitrate,
139
+ videoBitrate,
140
+ forceHeight: height,
141
+ forceWidth: width,
142
+ audioCodec,
143
+ forceBucketName,
144
+ updateRenderProgress,
145
+ logLevel: config_1.ConfigInternals.Logging.getLogLevel(),
146
+ // Special case: Should not use default local concurrency, or from
147
+ // config file, just when explicitly set
148
+ concurrency: (_b = cli_1.CliInternals.parsedCli.concurrency) !== null && _b !== void 0 ? _b : null,
149
+ delayRenderTimeoutInMilliseconds: puppeteerTimeout,
150
+ enforceAudioTrack,
151
+ preferLossless: false,
152
+ });
153
+ if (res.status === 'crash') {
154
+ let timeoutPreMsg = '';
155
+ const timeout = (0, extract_time_from_url_1.extractTimeoutFromURL)(res.cloudRunEndpoint);
156
+ const memoryLimit = (0, extract_mem_from_url_1.extractMemoryFromURL)(res.cloudRunEndpoint);
157
+ if (timeout && res.requestElapsedTimeInSeconds + 10 > timeout) {
158
+ timeoutPreMsg = `Render call likely timed out. Service timeout is ${timeout} seconds, and render took at least ${res.requestElapsedTimeInSeconds.toFixed(1)} seconds.\n`;
159
+ }
160
+ else {
161
+ timeoutPreMsg = `Crash unlikely due to timeout. Render took ${res.requestElapsedTimeInSeconds.toFixed(1)} seconds, below the timeout of ${timeout} seconds.\n`;
162
+ }
163
+ log_1.Log.error(`Error rendering on Cloud Run. The Cloud Run service did not return a response.\n
164
+ ${timeoutPreMsg}The crash may be due to the service exceeding its memory limit of ${memoryLimit}.
165
+ Full logs are available at https://console.cloud.google.com/run?project=${process.env.REMOTION_GCP_PROJECT_ID}\n`);
166
+ const cloudLoggingClient = (0, get_cloud_logging_client_1.getCloudLoggingClient)();
167
+ const listLogEntriesRequest = {
168
+ resourceNames: [`projects/${process.env.REMOTION_GCP_PROJECT_ID}`],
169
+ filter: `logName=projects/${process.env.REMOTION_GCP_PROJECT_ID}/logs/run.googleapis.com%2Fvarlog%2Fsystem AND (severity=WARNING OR severity=ERROR) AND timestamp >= "${res.requestStartTime}"`,
170
+ };
171
+ const logCheckCountdown = cli_1.CliInternals.createOverwriteableCliOutput({
172
+ quiet: cli_1.CliInternals.quietFlagProvided(),
173
+ cancelSignal: null,
174
+ updatesDontOverwrite: false,
175
+ indent: false,
176
+ });
177
+ await (() => {
178
+ return new Promise((resolve) => {
179
+ let timeLeft = 30;
180
+ const intervalId = setInterval(() => {
181
+ logCheckCountdown.update(`GCP Cloud Logging takes time to ingest and index logs.\nFetching recent error/warning logs in ${timeLeft} seconds`, false);
182
+ timeLeft--;
183
+ if (timeLeft < 0) {
184
+ logCheckCountdown.update('Fetching logs...\n\n', false);
185
+ clearInterval(intervalId);
186
+ resolve();
187
+ }
188
+ }, 1000);
189
+ });
190
+ })();
191
+ const iterableLogListEntries = await cloudLoggingClient.listLogEntriesAsync(listLogEntriesRequest);
192
+ for await (const logResponse of iterableLogListEntries) {
193
+ const responseDate = new Date(Number(logResponse.timestamp.seconds) * 1000 +
194
+ Number(logResponse.timestamp.nanos) / 1000000);
195
+ const convertedDate = responseDate.toLocaleString();
196
+ log_1.Log.info(convertedDate);
197
+ log_1.Log.info(logResponse.textPayload);
198
+ log_1.Log.info();
199
+ }
200
+ }
201
+ else if (res.status === 'success') {
202
+ renderProgress.doneIn = Date.now() - renderStart;
203
+ updateProgress();
204
+ log_1.Log.info(`
205
+
206
+ `);
207
+ log_1.Log.info(cli_1.CliInternals.chalk.blueBright(`
208
+ ${res.publicUrl ? `Public URL = ${decodeURIComponent(res.publicUrl)}` : ``}
209
+ Cloud Storage Uri = ${res.cloudStorageUri}
210
+ Size (KB) = ${Math.round(Number(res.size) / 1000)}
211
+ Bucket Name = ${res.bucketName}
212
+ Privacy = ${res.privacy}
213
+ Render ID = ${res.renderId}
214
+ Codec = ${codec} (${codecReason})
215
+ `.trim()));
216
+ if (downloadName) {
217
+ log_1.Log.info('');
218
+ log_1.Log.info('downloading file...');
219
+ const destination = await (0, download_file_1.downloadFile)({
220
+ bucketName: res.bucketName,
221
+ gsutilURI: res.cloudStorageUri,
222
+ downloadName,
223
+ });
224
+ log_1.Log.info(cli_1.CliInternals.chalk.blueBright(`Downloaded file to ${destination}!`));
225
+ }
226
+ }
227
+ };
228
+ exports.renderCommand = renderCommand;
@@ -0,0 +1,2 @@
1
+ export declare const CLOUD_RUN_DEPLOY_SUBCOMMAND = "deploy";
2
+ export declare const cloudRunDeploySubcommand: () => Promise<void>;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cloudRunDeploySubcommand = exports.CLOUD_RUN_DEPLOY_SUBCOMMAND = void 0;
4
+ const cli_1 = require("@remotion/cli");
5
+ const version_1 = require("remotion/version");
6
+ const _1 = require(".");
7
+ const deploy_service_1 = require("../../../api/deploy-service");
8
+ const constants_1 = require("../../../shared/constants");
9
+ const generate_service_name_1 = require("../../../shared/generate-service-name");
10
+ const validate_gcp_region_1 = require("../../../shared/validate-gcp-region");
11
+ const validate_image_remotion_version_1 = require("../../../shared/validate-image-remotion-version");
12
+ const args_1 = require("../../args");
13
+ const get_gcp_region_1 = require("../../get-gcp-region");
14
+ const quit_1 = require("../../helpers/quit");
15
+ const log_1 = require("../../log");
16
+ exports.CLOUD_RUN_DEPLOY_SUBCOMMAND = 'deploy';
17
+ const cloudRunDeploySubcommand = async () => {
18
+ var _a, _b, _c, _d, _e;
19
+ const region = (0, get_gcp_region_1.getGcpRegion)();
20
+ const projectID = process.env.REMOTION_GCP_PROJECT_ID;
21
+ const memoryLimit = String((_a = args_1.parsedCloudrunCli.memoryLimit) !== null && _a !== void 0 ? _a : '2Gi');
22
+ const cpuLimit = String((_b = args_1.parsedCloudrunCli.cpuLimit) !== null && _b !== void 0 ? _b : '1.0');
23
+ const minInstances = String((_c = args_1.parsedCloudrunCli.minInstances) !== null && _c !== void 0 ? _c : constants_1.DEFAULT_MIN_INSTANCES);
24
+ const maxInstances = String((_d = args_1.parsedCloudrunCli.maxInstances) !== null && _d !== void 0 ? _d : constants_1.DEFAULT_MAX_INSTANCES);
25
+ const timeoutSeconds = (_e = args_1.parsedCloudrunCli.timeoutSeconds) !== null && _e !== void 0 ? _e : constants_1.DEFAULT_TIMEOUT;
26
+ if (!cli_1.CliInternals.quietFlagProvided()) {
27
+ log_1.Log.info(cli_1.CliInternals.chalk.gray(`
28
+ Validating Deployment of Cloud Run Service:
29
+
30
+ ${[
31
+ 'Remotion Version: '.padEnd(_1.LEFT_COL, ' ') + ' ' + version_1.VERSION,
32
+ 'Memory Limit: '.padEnd(_1.LEFT_COL, ' ') + ' ' + memoryLimit,
33
+ 'CPU Limit: '.padEnd(_1.LEFT_COL, ' ') + ' ' + cpuLimit,
34
+ 'Minimum Instances: '.padEnd(_1.LEFT_COL, ' ') + ' ' + minInstances,
35
+ 'Maximum Instances: '.padEnd(_1.LEFT_COL, ' ') + ' ' + maxInstances,
36
+ 'CPU Limit: '.padEnd(_1.LEFT_COL, ' ') + ' ' + cpuLimit,
37
+ 'Timeout: '.padEnd(_1.LEFT_COL, ' ') + ' ' + timeoutSeconds,
38
+ 'Project Name: '.padEnd(_1.LEFT_COL, ' ') + ' ' + projectID,
39
+ 'Region: '.padEnd(_1.LEFT_COL, ' ') + ' ' + region,
40
+ ].join('\n')}
41
+ `.trim()));
42
+ log_1.Log.info();
43
+ }
44
+ (0, validate_gcp_region_1.validateGcpRegion)(region);
45
+ await (0, validate_image_remotion_version_1.validateImageRemotionVersion)();
46
+ if (projectID === undefined) {
47
+ log_1.Log.error(`REMOTION_GCP_PROJECT_ID not found in the .env file.`);
48
+ (0, quit_1.quit)(0);
49
+ }
50
+ // if no existing service, deploy new service
51
+ if (!cli_1.CliInternals.quietFlagProvided()) {
52
+ log_1.Log.info(cli_1.CliInternals.chalk.white('\nDeploying Cloud Run Service...'));
53
+ }
54
+ try {
55
+ const deployResult = await (0, deploy_service_1.deployService)({
56
+ performImageVersionValidation: false,
57
+ memoryLimit,
58
+ cpuLimit,
59
+ timeoutSeconds,
60
+ projectID,
61
+ region,
62
+ });
63
+ if (!deployResult.fullName) {
64
+ log_1.Log.error('full service name not returned from Cloud Run API.');
65
+ throw new Error(JSON.stringify(deployResult));
66
+ }
67
+ if (!deployResult.shortName) {
68
+ log_1.Log.error('short service name not returned from Cloud Run API.');
69
+ throw new Error(JSON.stringify(deployResult));
70
+ }
71
+ if (!deployResult.alreadyExists && !deployResult.uri) {
72
+ log_1.Log.error('service uri not returned from Cloud Run API.');
73
+ }
74
+ const consoleUrl = `https://console.cloud.google.com/run/detail/${region}/${deployResult.shortName}/logs`;
75
+ if (deployResult.alreadyExists) {
76
+ log_1.Log.info();
77
+ if (cli_1.CliInternals.quietFlagProvided()) {
78
+ cli_1.CliInternals.Log.info(deployResult.shortName);
79
+ }
80
+ else {
81
+ log_1.Log.info(cli_1.CliInternals.chalk.blueBright(`
82
+ Service already exists, skipping deployment;
83
+
84
+ ${(0, _1.displayServiceInfo)({
85
+ serviceName: deployResult.shortName,
86
+ timeoutInSeconds: timeoutSeconds,
87
+ memoryLimit,
88
+ cpuLimit,
89
+ remotionVersion: version_1.VERSION,
90
+ uri: deployResult.uri,
91
+ region,
92
+ consoleUrl,
93
+ })}
94
+ `.trim()));
95
+ }
96
+ }
97
+ else {
98
+ log_1.Log.info();
99
+ if (cli_1.CliInternals.quietFlagProvided()) {
100
+ cli_1.CliInternals.Log.info(deployResult.shortName);
101
+ }
102
+ else {
103
+ log_1.Log.info(cli_1.CliInternals.chalk.blueBright(`
104
+ Cloud Run Deployed!
105
+
106
+ ${(0, _1.displayServiceInfo)({
107
+ serviceName: deployResult.shortName,
108
+ timeoutInSeconds: timeoutSeconds,
109
+ memoryLimit,
110
+ cpuLimit,
111
+ remotionVersion: version_1.VERSION,
112
+ uri: deployResult.uri,
113
+ region,
114
+ consoleUrl,
115
+ })}
116
+ `.trim()));
117
+ }
118
+ }
119
+ }
120
+ catch (e) {
121
+ log_1.Log.error(cli_1.CliInternals.chalk.red(`Failed to deploy service - ${(0, generate_service_name_1.generateServiceName)({
122
+ memoryLimit,
123
+ cpuLimit,
124
+ timeoutSeconds,
125
+ })}.`));
126
+ throw e;
127
+ }
128
+ };
129
+ exports.cloudRunDeploySubcommand = cloudRunDeploySubcommand;
@@ -0,0 +1,5 @@
1
+ import type { ServiceInfo } from '../../../api/get-service-info';
2
+ export declare const SERVICES_COMMAND = "services";
3
+ export declare const LEFT_COL = 20;
4
+ export declare const displayServiceInfo: (service: ServiceInfo) => string;
5
+ export declare const servicesCommand: (args: string[]) => Promise<void> | undefined;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.servicesCommand = exports.displayServiceInfo = exports.LEFT_COL = exports.SERVICES_COMMAND = void 0;
4
+ const cli_1 = require("@remotion/cli");
5
+ const constants_1 = require("../../../shared/constants");
6
+ const quit_1 = require("../../helpers/quit");
7
+ const log_1 = require("../../log");
8
+ const deploy_1 = require("./deploy");
9
+ const ls_1 = require("./ls");
10
+ const rm_1 = require("./rm");
11
+ const rmall_1 = require("./rmall");
12
+ exports.SERVICES_COMMAND = 'services';
13
+ exports.LEFT_COL = 20;
14
+ const displayServiceInfo = (service) => {
15
+ return [
16
+ 'Service name: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.serviceName,
17
+ 'Version: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.remotionVersion,
18
+ 'CPU Limit: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.cpuLimit,
19
+ 'Memory Limit: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.memoryLimit,
20
+ 'Timeout: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.timeoutInSeconds + 'sec',
21
+ 'Region: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.region,
22
+ 'Service URL: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.uri,
23
+ 'GCP Console URL: '.padEnd(exports.LEFT_COL, ' ') + ' ' + service.consoleUrl,
24
+ ].join('\n');
25
+ };
26
+ exports.displayServiceInfo = displayServiceInfo;
27
+ const printCloudRunHelp = () => {
28
+ log_1.Log.info(`${constants_1.BINARY_NAME} ${exports.SERVICES_COMMAND} <subcommand>`);
29
+ log_1.Log.info();
30
+ log_1.Log.info('Available subcommands:');
31
+ cli_1.CliInternals.Log.info('');
32
+ cli_1.CliInternals.Log.info(`${constants_1.BINARY_NAME} ${exports.SERVICES_COMMAND} ${ls_1.SERVICES_LS_SUBCOMMAND}`);
33
+ cli_1.CliInternals.Log.info(cli_1.CliInternals.chalk.gray('Lists the services currently deployed'));
34
+ log_1.Log.info('');
35
+ log_1.Log.info(`${constants_1.BINARY_NAME} ${exports.SERVICES_COMMAND} ${deploy_1.CLOUD_RUN_DEPLOY_SUBCOMMAND}`);
36
+ log_1.Log.info(cli_1.CliInternals.chalk.gray('Deploy a new Cloud Run service'));
37
+ cli_1.CliInternals.Log.info('');
38
+ cli_1.CliInternals.Log.info(`${constants_1.BINARY_NAME} ${exports.SERVICES_COMMAND} ${rm_1.SERVICES_RM_SUBCOMMAND} <service-name>`);
39
+ cli_1.CliInternals.Log.info(cli_1.CliInternals.chalk.gray('Delete a Cloud Run service'));
40
+ cli_1.CliInternals.Log.info('');
41
+ cli_1.CliInternals.Log.info(`${constants_1.BINARY_NAME} ${exports.SERVICES_COMMAND} ${rmall_1.SERVICES_RMALL_SUBCOMMAND}`);
42
+ cli_1.CliInternals.Log.info(cli_1.CliInternals.chalk.gray('Delete all services in selected region'));
43
+ };
44
+ const servicesCommand = (args) => {
45
+ if (args[0] === ls_1.SERVICES_LS_SUBCOMMAND) {
46
+ return (0, ls_1.servicesLsCommand)();
47
+ }
48
+ if (args[0] === rm_1.SERVICES_RM_SUBCOMMAND) {
49
+ return (0, rm_1.servicesRmCommand)(args.slice(1));
50
+ }
51
+ if (args[0] === rmall_1.SERVICES_RMALL_SUBCOMMAND) {
52
+ return (0, rmall_1.servicesRmallCommand)();
53
+ }
54
+ if (args[0] === deploy_1.CLOUD_RUN_DEPLOY_SUBCOMMAND) {
55
+ return (0, deploy_1.cloudRunDeploySubcommand)();
56
+ }
57
+ if (args[0]) {
58
+ log_1.Log.error(`Subcommand ${args[0]} not found.`);
59
+ printCloudRunHelp();
60
+ (0, quit_1.quit)(1);
61
+ }
62
+ printCloudRunHelp();
63
+ };
64
+ exports.servicesCommand = servicesCommand;
@@ -0,0 +1,2 @@
1
+ export declare const SERVICES_LS_SUBCOMMAND = "ls";
2
+ export declare const servicesLsCommand: () => Promise<void>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.servicesLsCommand = exports.SERVICES_LS_SUBCOMMAND = void 0;
4
+ const cli_1 = require("@remotion/cli");
5
+ const _1 = require(".");
6
+ const get_services_1 = require("../../../api/get-services");
7
+ const get_gcp_region_1 = require("../../get-gcp-region");
8
+ const log_1 = require("../../log");
9
+ exports.SERVICES_LS_SUBCOMMAND = 'ls';
10
+ const servicesLsCommand = async () => {
11
+ const region = (0, get_gcp_region_1.getGcpRegion)();
12
+ const fetchingOutput = cli_1.CliInternals.createOverwriteableCliOutput({
13
+ quiet: cli_1.CliInternals.quietFlagProvided(),
14
+ cancelSignal: null,
15
+ updatesDontOverwrite: false,
16
+ indent: false,
17
+ });
18
+ fetchingOutput.update(`Getting services in ${region}...`, false);
19
+ const services = await (0, get_services_1.getServices)({
20
+ region,
21
+ compatibleOnly: false,
22
+ });
23
+ if (cli_1.CliInternals.quietFlagProvided()) {
24
+ if (services.length === 0) {
25
+ log_1.Log.info('()');
26
+ return;
27
+ }
28
+ log_1.Log.info(services.map((f) => f.serviceName).join(' '));
29
+ return;
30
+ }
31
+ fetchingOutput.update('Getting service info...', false);
32
+ const pluralized = services.length === 1 ? 'service' : 'services';
33
+ fetchingOutput.update(`${services.length} ${pluralized} in ${region}`, false);
34
+ log_1.Log.info();
35
+ for (const service of services) {
36
+ log_1.Log.info();
37
+ log_1.Log.info((0, _1.displayServiceInfo)(service));
38
+ }
39
+ };
40
+ exports.servicesLsCommand = servicesLsCommand;
@@ -0,0 +1,2 @@
1
+ export declare const SERVICES_RM_SUBCOMMAND = "rm";
2
+ export declare const servicesRmCommand: (args: string[]) => Promise<void>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.servicesRmCommand = exports.SERVICES_RM_SUBCOMMAND = void 0;
4
+ const cli_1 = require("@remotion/cli");
5
+ const delete_service_1 = require("../../../api/delete-service");
6
+ const get_service_info_1 = require("../../../api/get-service-info");
7
+ const constants_1 = require("../../../shared/constants");
8
+ const get_gcp_region_1 = require("../../get-gcp-region");
9
+ const confirm_1 = require("../../helpers/confirm");
10
+ const quit_1 = require("../../helpers/quit");
11
+ const log_1 = require("../../log");
12
+ const index_1 = require("./index");
13
+ const ls_1 = require("./ls");
14
+ exports.SERVICES_RM_SUBCOMMAND = 'rm';
15
+ const servicesRmCommand = async (args) => {
16
+ if (args.length === 0) {
17
+ log_1.Log.error('No service name passed.');
18
+ log_1.Log.error('Pass another argument which is the name of the service you would like to remove.');
19
+ log_1.Log.info(`You can run \`${constants_1.BINARY_NAME} ${index_1.SERVICES_COMMAND} ${ls_1.SERVICES_LS_SUBCOMMAND}\` to see a list of deployed Cloud Run services.`);
20
+ (0, quit_1.quit)(1);
21
+ }
22
+ if (args[0] === '()') {
23
+ log_1.Log.info('No services to remove.');
24
+ return;
25
+ }
26
+ const region = (0, get_gcp_region_1.getGcpRegion)();
27
+ for (const serviceName of args) {
28
+ const infoOutput = cli_1.CliInternals.createOverwriteableCliOutput({
29
+ quiet: cli_1.CliInternals.quietFlagProvided(),
30
+ cancelSignal: null,
31
+ updatesDontOverwrite: false,
32
+ indent: false,
33
+ });
34
+ infoOutput.update('Getting service info...', false);
35
+ const info = await (0, get_service_info_1.getServiceInfo)({
36
+ region,
37
+ serviceName,
38
+ });
39
+ infoOutput.update((0, index_1.displayServiceInfo)(info), false);
40
+ log_1.Log.info();
41
+ const confirmDelete = await (0, confirm_1.confirmCli)({
42
+ delMessage: 'Delete? (Y/n)',
43
+ allowForceFlag: true,
44
+ });
45
+ if (!confirmDelete) {
46
+ log_1.Log.info(`Skipping service - ${info.serviceName}.`);
47
+ continue;
48
+ }
49
+ const output = cli_1.CliInternals.createOverwriteableCliOutput({
50
+ quiet: cli_1.CliInternals.quietFlagProvided(),
51
+ cancelSignal: null,
52
+ updatesDontOverwrite: false,
53
+ indent: false,
54
+ });
55
+ output.update('Deleting...', false);
56
+ await (0, delete_service_1.deleteService)({
57
+ serviceName,
58
+ region,
59
+ });
60
+ output.update('Deleted!\n', false);
61
+ }
62
+ };
63
+ exports.servicesRmCommand = servicesRmCommand;
@@ -0,0 +1,2 @@
1
+ export declare const SERVICES_RMALL_SUBCOMMAND = "rmall";
2
+ export declare const servicesRmallCommand: () => Promise<void>;