@enclave-run/sdk 0.0.0-dev.5 → 0.0.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/index.js CHANGED
@@ -127,7 +127,7 @@ var import_openapi_fetch = __toESM(require("openapi-fetch"));
127
127
  var import_platform2 = __toESM(require("platform"));
128
128
 
129
129
  // package.json
130
- var version = "0.0.0-dev.5";
130
+ var version = "0.0.0";
131
131
 
132
132
  // src/utils.ts
133
133
  var import_platform = __toESM(require("platform"));
@@ -353,11 +353,11 @@ function formatLog(log) {
353
353
  return JSON.parse(JSON.stringify(log));
354
354
  }
355
355
  function createRpcLogger(logger) {
356
- function logEach(stream) {
356
+ function logEach(stream2) {
357
357
  return __asyncGenerator(this, null, function* () {
358
358
  var _a3;
359
359
  try {
360
- for (var iter = __forAwait(stream), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
360
+ for (var iter = __forAwait(stream2), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
361
361
  const m = temp.value;
362
362
  (_a3 = logger.debug) == null ? void 0 : _a3.call(logger, "Response stream:", formatLog(m));
363
363
  yield m;
@@ -4479,6 +4479,10 @@ var SandboxRegionScope = class {
4479
4479
  }
4480
4480
  };
4481
4481
 
4482
+ // src/template/buildApi.ts
4483
+ var import_node_fs2 = __toESM(require("fs"));
4484
+ var import_node_stream = __toESM(require("stream"));
4485
+
4482
4486
  // src/template/logger.ts
4483
4487
  var import_chalk = __toESM(require("chalk"));
4484
4488
  var LogEntry = class {
@@ -4600,11 +4604,13 @@ function defaultBuildLogger(options) {
4600
4604
  // src/template/utils.ts
4601
4605
  var import_node_crypto = __toESM(require("crypto"));
4602
4606
  var import_node_fs = __toESM(require("fs"));
4607
+ var import_node_os = __toESM(require("os"));
4603
4608
  var import_node_path = __toESM(require("path"));
4604
4609
  var import_node_url = __toESM(require("url"));
4605
4610
 
4606
4611
  // src/template/consts.ts
4607
4612
  var FINALIZE_STEP_NAME = "finalize";
4613
+ var FILE_UPLOAD_TIMEOUT_MS = 36e5;
4608
4614
  var BASE_STEP_NAME = "base";
4609
4615
  var STACK_TRACE_DEPTH = 3;
4610
4616
  var RESOLVE_SYMLINKS = false;
@@ -4756,7 +4762,7 @@ function getCallerDirectory(depth) {
4756
4762
  function padOctal(mode) {
4757
4763
  return mode.toString(8).padStart(4, "0");
4758
4764
  }
4759
- async function tarFileStream(fileName, fileContextPath, ignorePatterns, resolveSymlinks) {
4765
+ async function getTarArchiveInputs(fileName, fileContextPath, ignorePatterns) {
4760
4766
  const { create } = await dynamicImport("tar");
4761
4767
  const allFiles = await getAllFilesInPath(
4762
4768
  fileName,
@@ -4764,24 +4770,40 @@ async function tarFileStream(fileName, fileContextPath, ignorePatterns, resolveS
4764
4770
  ignorePatterns,
4765
4771
  true
4766
4772
  );
4767
- const filePaths = allFiles.map((file) => file.relativePosix());
4768
- return create(
4769
- {
4770
- gzip: true,
4771
- cwd: fileContextPath,
4772
- follow: resolveSymlinks,
4773
- noDirRecurse: true
4774
- },
4775
- filePaths
4776
- );
4773
+ return {
4774
+ create,
4775
+ filePaths: allFiles.map((file) => file.relativePosix())
4776
+ };
4777
4777
  }
4778
- async function tarFileStreamUpload(fileName, fileContextPath, ignorePatterns, resolveSymlinks) {
4779
- return tarFileStream(
4778
+ async function spoolTarArchive(fileName, fileContextPath, ignorePatterns, resolveSymlinks) {
4779
+ const { create, filePaths } = await getTarArchiveInputs(
4780
4780
  fileName,
4781
4781
  fileContextPath,
4782
- ignorePatterns,
4783
- resolveSymlinks
4782
+ ignorePatterns
4784
4783
  );
4784
+ const tmpDir = await import_node_fs.default.promises.mkdtemp(
4785
+ import_node_path.default.join(import_node_os.default.tmpdir(), "enclave-template-")
4786
+ );
4787
+ const tarPath = import_node_path.default.join(tmpDir, "context.tar.gz");
4788
+ const cleanup = () => import_node_fs.default.promises.rm(tmpDir, { recursive: true, force: true }).catch(() => {
4789
+ });
4790
+ try {
4791
+ await create(
4792
+ {
4793
+ gzip: true,
4794
+ cwd: fileContextPath,
4795
+ follow: resolveSymlinks,
4796
+ noDirRecurse: true,
4797
+ file: tarPath
4798
+ },
4799
+ filePaths
4800
+ );
4801
+ const { size } = await import_node_fs.default.promises.stat(tarPath);
4802
+ return { path: tarPath, size, cleanup };
4803
+ } catch (error) {
4804
+ await cleanup();
4805
+ throw error;
4806
+ }
4785
4807
  }
4786
4808
  function getBuildStepIndex(step, stackTracesLength) {
4787
4809
  if (step === BASE_STEP_NAME) {
@@ -4841,22 +4863,34 @@ async function getFileUploadLink(client, { templateID, filesHash }, stackTrace)
4841
4863
  }
4842
4864
  async function uploadFile(options, stackTrace) {
4843
4865
  const { fileName, url: url2, fileContextPath, ignorePatterns, resolveSymlinks } = options;
4866
+ let cleanup;
4867
+ let bodyStream;
4844
4868
  try {
4845
- const uploadStream = await tarFileStreamUpload(
4869
+ const archive = await spoolTarArchive(
4846
4870
  fileName,
4847
4871
  fileContextPath,
4848
4872
  ignorePatterns,
4849
4873
  resolveSymlinks
4850
4874
  );
4875
+ cleanup = archive.cleanup;
4876
+ bodyStream = import_node_fs2.default.createReadStream(archive.path);
4851
4877
  const res = await fetch(url2, {
4852
4878
  method: "PUT",
4853
- // @ts-expect-error
4854
- body: uploadStream,
4879
+ body: import_node_stream.default.Readable.toWeb(bodyStream),
4880
+ headers: {
4881
+ "Content-Length": archive.size.toString()
4882
+ },
4883
+ signal: AbortSignal.timeout(FILE_UPLOAD_TIMEOUT_MS),
4884
+ // Node fetch requires duplex for a streaming request body, but the DOM
4885
+ // RequestInit type does not expose it.
4886
+ // @ts-expect-error Node fetch extension
4855
4887
  duplex: "half"
4856
4888
  });
4857
4889
  if (!res.ok) {
4890
+ const responseDetails = (await res.text().catch(() => "")).slice(0, 4096);
4891
+ const status = `${res.status} ${res.statusText}`.trim();
4858
4892
  throw new FileUploadError(
4859
- `Failed to upload file: ${res.statusText}`,
4893
+ `Failed to upload file: ${status}${responseDetails ? ` - ${responseDetails}` : ""}`,
4860
4894
  stackTrace
4861
4895
  );
4862
4896
  }
@@ -4865,6 +4899,14 @@ async function uploadFile(options, stackTrace) {
4865
4899
  throw error;
4866
4900
  }
4867
4901
  throw new FileUploadError(`Failed to upload file: ${error}`, stackTrace);
4902
+ } finally {
4903
+ if (bodyStream && !bodyStream.closed) {
4904
+ await new Promise((resolve) => {
4905
+ bodyStream == null ? void 0 : bodyStream.once("close", resolve);
4906
+ bodyStream == null ? void 0 : bodyStream.destroy();
4907
+ });
4908
+ }
4909
+ await (cleanup == null ? void 0 : cleanup());
4868
4910
  }
4869
4911
  }
4870
4912
  async function triggerBuild(client, { templateID, buildID, template }) {
@@ -5051,7 +5093,7 @@ async function getTemplateTags(client, { templateID }) {
5051
5093
 
5052
5094
  // src/template/dockerfileParser.ts
5053
5095
  var import_dockerfile_ast = require("dockerfile-ast");
5054
- var import_node_fs2 = __toESM(require("fs"));
5096
+ var import_node_fs3 = __toESM(require("fs"));
5055
5097
 
5056
5098
  // src/template/readycmd.ts
5057
5099
  var ReadyCmd = class {
@@ -5088,8 +5130,8 @@ function waitForTimeout(timeout) {
5088
5130
  function parseDockerfile(dockerfileContentOrPath, templateBuilder) {
5089
5131
  let dockerfileContent;
5090
5132
  try {
5091
- if (import_node_fs2.default.existsSync(dockerfileContentOrPath) && import_node_fs2.default.statSync(dockerfileContentOrPath).isFile()) {
5092
- dockerfileContent = import_node_fs2.default.readFileSync(dockerfileContentOrPath, "utf-8");
5133
+ if (import_node_fs3.default.existsSync(dockerfileContentOrPath) && import_node_fs3.default.statSync(dockerfileContentOrPath).isFile()) {
5134
+ dockerfileContent = import_node_fs3.default.readFileSync(dockerfileContentOrPath, "utf-8");
5093
5135
  } else {
5094
5136
  dockerfileContent = dockerfileContentOrPath;
5095
5137
  }