@solarisdk/daytona-compat 0.0.0-stage → 0.1.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 (65) hide show
  1. package/COMPAT.md +118 -0
  2. package/LICENSE +17 -0
  3. package/NOTICE +8 -0
  4. package/README.md +51 -2
  5. package/dist/client.d.ts +37 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +157 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/conn.d.ts +55 -0
  10. package/dist/conn.d.ts.map +1 -0
  11. package/dist/conn.js +190 -0
  12. package/dist/conn.js.map +1 -0
  13. package/dist/context.d.ts +47 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +236 -0
  16. package/dist/context.js.map +1 -0
  17. package/dist/dockerfile.d.ts +36 -0
  18. package/dist/dockerfile.d.ts.map +1 -0
  19. package/dist/dockerfile.js +361 -0
  20. package/dist/dockerfile.js.map +1 -0
  21. package/dist/errors.d.ts +25 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +79 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/fs.d.ts +32 -0
  26. package/dist/fs.d.ts.map +1 -0
  27. package/dist/fs.js +196 -0
  28. package/dist/fs.js.map +1 -0
  29. package/dist/git.d.ts +34 -0
  30. package/dist/git.d.ts.map +1 -0
  31. package/dist/git.js +204 -0
  32. package/dist/git.js.map +1 -0
  33. package/dist/image-ref.d.ts +35 -0
  34. package/dist/image-ref.d.ts.map +1 -0
  35. package/dist/image-ref.js +97 -0
  36. package/dist/image-ref.js.map +1 -0
  37. package/dist/image.d.ts +45 -0
  38. package/dist/image.d.ts.map +1 -0
  39. package/dist/image.js +126 -0
  40. package/dist/image.js.map +1 -0
  41. package/dist/index.d.ts +17 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +15 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/mapping.d.ts +55 -0
  46. package/dist/mapping.d.ts.map +1 -0
  47. package/dist/mapping.js +176 -0
  48. package/dist/mapping.js.map +1 -0
  49. package/dist/process.d.ts +35 -0
  50. package/dist/process.d.ts.map +1 -0
  51. package/dist/process.js +223 -0
  52. package/dist/process.js.map +1 -0
  53. package/dist/sandbox.d.ts +89 -0
  54. package/dist/sandbox.d.ts.map +1 -0
  55. package/dist/sandbox.js +388 -0
  56. package/dist/sandbox.js.map +1 -0
  57. package/dist/snapshot.d.ts +68 -0
  58. package/dist/snapshot.d.ts.map +1 -0
  59. package/dist/snapshot.js +255 -0
  60. package/dist/snapshot.js.map +1 -0
  61. package/dist/types.d.ts +177 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +3 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +46 -4
package/dist/conn.js ADDED
@@ -0,0 +1,190 @@
1
+ // Connection layer shared by every Daytona-shaped object: one Solari client, a cached control-channel handle per
2
+ // sandbox, and the shell / $HOME helpers. Modelled on the runloop-compat client.
3
+ import { ConnectionError, GatewayError, HttpTransport, SolariError } from "@solarisdk/core";
4
+ import { SandboxClient } from "@solarisdk/sandbox";
5
+ import { DaytonaError, SolariCompatUnsupported, translateError } from "./errors.js";
6
+ export const DEFAULT_BASE_URL = "https://api.getsolari.com";
7
+ export const DEFAULT_HOME = "/root";
8
+ /** A non-login bash when the image has one, else sh. The command is "$1", so the wrapper never re-parses it. */
9
+ export const NATIVE_SHELL_SCRIPT = 'if [ -x /bin/bash ]; then exec /bin/bash -c "$1"; else exec /bin/sh -c "$1"; fi';
10
+ export function shellArgs(native, command) {
11
+ return native ? ["/bin/sh", ["-c", NATIVE_SHELL_SCRIPT, "sh", command]] : ["/bin/bash", ["-lc", command]];
12
+ }
13
+ /** Whether an inherited base URL may receive a Solari key: https on getsolari.com or a subdomain, or loopback. */
14
+ export function isSolariBaseUrl(raw) {
15
+ let u;
16
+ try {
17
+ u = new URL(raw);
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ const host = u.hostname.toLowerCase().replace(/\.$/, "");
23
+ if (u.protocol === "https:" && (host === "getsolari.com" || host.endsWith(".getsolari.com")))
24
+ return true;
25
+ const loopback = host === "localhost" || host === "[::1]" || /^127(\.\d{1,3}){3}$/.test(host);
26
+ return loopback && (u.protocol === "http:" || u.protocol === "https:");
27
+ }
28
+ function describeHost(raw) {
29
+ try {
30
+ return new URL(raw).hostname || "unparsable URL";
31
+ }
32
+ catch {
33
+ return "unparsable URL";
34
+ }
35
+ }
36
+ export const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
37
+ const PKG = "@solarisdk/daytona-compat";
38
+ export class Conn {
39
+ apiKey;
40
+ baseURL;
41
+ solari;
42
+ http;
43
+ /** Snapshot names this client created → ids, so a name resolves without listing the whole org. */
44
+ snapshotNames = new Map();
45
+ handles = new Map();
46
+ natives = new Map();
47
+ homes = new Map();
48
+ constructor(cfg = {}) {
49
+ const env = (k) => (typeof process !== "undefined" ? process.env[k] : undefined) || undefined;
50
+ if (cfg.jwtToken || cfg.organizationId)
51
+ throw new SolariCompatUnsupported("jwtToken / organizationId", "use a Solari API key (slr_…)");
52
+ if (env("DAYTONA_JWT_TOKEN") && !cfg.apiKey && !env("SOLARI_API_KEY") && !env("DAYTONA_API_KEY")) {
53
+ throw new SolariCompatUnsupported("DAYTONA_JWT_TOKEN", "use a Solari API key (slr_…)");
54
+ }
55
+ // Only Solari keys are ever used or sent. A Daytona key (the DAYTONA_API_KEY a Daytona-targeting program already has) is
56
+ // skipped with a warning and never sent anywhere.
57
+ const candidates = [
58
+ ["the apiKey option", cfg.apiKey],
59
+ ["SOLARI_API_KEY", env("SOLARI_API_KEY")],
60
+ ["DAYTONA_API_KEY", env("DAYTONA_API_KEY")],
61
+ ];
62
+ let key;
63
+ for (const [source, value] of candidates) {
64
+ if (!value)
65
+ continue;
66
+ if (value.startsWith("slr_")) {
67
+ key = value;
68
+ break;
69
+ }
70
+ console.warn(`${PKG}: ignoring ${source}: it is not a Solari API key (slr_…). It is not sent anywhere.`);
71
+ }
72
+ if (!key) {
73
+ throw new DaytonaError("No Solari API key. Set SOLARI_API_KEY, or pass new Daytona({ apiKey: 'slr_live_…' }). A Daytona key (DAYTONA_API_KEY) is never sent to Solari and cannot be used here.");
74
+ }
75
+ if (cfg.target || env("DAYTONA_TARGET")) {
76
+ console.warn(`${PKG}: Solari has no regions; target ${JSON.stringify(cfg.target ?? env("DAYTONA_TARGET"))} is ignored.`);
77
+ }
78
+ this.apiKey = key;
79
+ // DAYTONA_API_URL is usually https://app.daytona.io/api. Using it blindly would send the slr_ key to Daytona, so it
80
+ // is only honoured when it points at Solari (or loopback). The apiUrl option and SOLARI_BASE_URL stay as given.
81
+ const daytonaUrl = env("DAYTONA_API_URL");
82
+ let inherited;
83
+ if (daytonaUrl) {
84
+ if (isSolariBaseUrl(daytonaUrl))
85
+ inherited = daytonaUrl;
86
+ else if (!cfg.apiUrl && !env("SOLARI_BASE_URL")) {
87
+ console.warn(`${PKG}: ignoring DAYTONA_API_URL (${describeHost(daytonaUrl)}): it does not point at Solari, and your Solari API key is never sent anywhere else. Using ${DEFAULT_BASE_URL}.`);
88
+ }
89
+ }
90
+ this.baseURL = (cfg.apiUrl ?? env("SOLARI_BASE_URL") ?? inherited ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
91
+ this.solari = new SandboxClient({ apiKey: key, baseUrl: this.baseURL, ...(cfg.fetch ? { fetch: cfg.fetch } : {}) });
92
+ this.http = new HttpTransport({ apiKey: key, baseUrl: this.baseURL, ...(cfg.fetch ? { fetch: cfg.fetch } : {}) });
93
+ }
94
+ /** Live control handle for a sandbox, cached per id. */
95
+ handle(id) {
96
+ let h = this.handles.get(id);
97
+ if (!h) {
98
+ h = this.solari.connect(id).then(async (sb) => {
99
+ await sb.connect();
100
+ return sb;
101
+ });
102
+ h.catch(() => this.handles.delete(id));
103
+ this.handles.set(id, h);
104
+ }
105
+ return h;
106
+ }
107
+ adopt(id, sb) {
108
+ const p = sb.connect().then(() => sb);
109
+ this.handles.set(id, p);
110
+ p.catch(() => this.handles.delete(id));
111
+ }
112
+ setHandle(id, sb) {
113
+ this.handles.set(id, Promise.resolve(sb));
114
+ }
115
+ dropHandle(id) {
116
+ const h = this.handles.get(id);
117
+ this.handles.delete(id);
118
+ h?.then((s) => s.close()).catch(() => undefined);
119
+ }
120
+ /** Run `fn` on the live handle. If the control channel was closed under us (typically the first call after a resume), reconnect and retry. */
121
+ async on(id, fn) {
122
+ for (let attempt = 0;; attempt++) {
123
+ try {
124
+ return await fn(await this.handle(id));
125
+ }
126
+ catch (e) {
127
+ const closed = e instanceof SolariError && !(e instanceof GatewayError) && (e instanceof ConnectionError || /closed|not connected|disconnect|websocket/i.test(e.message));
128
+ if (!closed || attempt >= 2)
129
+ throw translateError(e);
130
+ this.dropHandle(id);
131
+ await sleep(500 * (attempt + 1));
132
+ }
133
+ }
134
+ }
135
+ /** Retry a gateway call that answered a transient, explicitly retryable 503 (for about 40 s). */
136
+ async retry(fn) {
137
+ for (let attempt = 0;; attempt++) {
138
+ try {
139
+ return await fn();
140
+ }
141
+ catch (e) {
142
+ const retryable = e instanceof GatewayError && e.status === 503 && e.body?.retryable !== false;
143
+ if (!retryable || attempt >= 12)
144
+ throw e;
145
+ await sleep(1500 + attempt * 300);
146
+ }
147
+ }
148
+ }
149
+ /** Is this a native `FROM <image>` sandbox? Commands there use a non-login shell (a login shell resets PATH on Debian). */
150
+ isNative(id) {
151
+ let h = this.natives.get(id);
152
+ if (!h) {
153
+ h = this.solari.get(id).then((v) => Boolean(v.fromImage));
154
+ h.catch(() => this.natives.delete(id));
155
+ this.natives.set(id, h);
156
+ }
157
+ return h;
158
+ }
159
+ async shellFor(id, command) {
160
+ return shellArgs(await this.isNative(id), command);
161
+ }
162
+ /** The guest's $HOME, created if missing (commands and relative paths start there). */
163
+ home(id) {
164
+ let h = this.homes.get(id);
165
+ if (!h) {
166
+ h = (async () => {
167
+ const [sh, args] = await this.shellFor(id, 'printf %s "$HOME"');
168
+ const r = await this.on(id, (sb) => sb.commands.run(sh, { args }));
169
+ const home = r.stdout.trim() || DEFAULT_HOME;
170
+ await this.on(id, (sb) => sb.commands.run("/bin/mkdir", { args: ["-p", home] }));
171
+ return home;
172
+ })();
173
+ h.catch(() => this.homes.delete(id));
174
+ this.homes.set(id, h);
175
+ }
176
+ return h;
177
+ }
178
+ forget(id) {
179
+ this.dropHandle(id);
180
+ this.natives.delete(id);
181
+ this.homes.delete(id);
182
+ }
183
+ async abs(id, p) {
184
+ if (p.startsWith("/"))
185
+ return p;
186
+ const home = await this.home(id);
187
+ return `${home.replace(/\/+$/, "")}/${p.replace(/^\.\//, "")}`;
188
+ }
189
+ }
190
+ //# sourceMappingURL=conn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conn.js","sourceRoot":"","sources":["../src/conn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /** The gateway's template body limit is 1 MiB; base64 inflates by a third, so keep the compressed context under this. */
2
+ export declare const MAX_CONTEXT_BYTES: number;
3
+ /** One compiled .dockerignore rule. */
4
+ interface Rule {
5
+ re: RegExp;
6
+ negate: boolean;
7
+ }
8
+ export declare function parseDockerignore(text: string): Rule[];
9
+ /** Is `rel` (posix, relative to the context) excluded? A match on any parent directory excludes it too; the last matching rule wins. */
10
+ export declare function isIgnored(rules: Rule[], rel: string): boolean;
11
+ /** Deterministic tar.gz of `dir`. */
12
+ export declare function tarGzDir(dir: string): Buffer;
13
+ /** A "storage object" that is really a client-held build context. */
14
+ export declare class StorageObject {
15
+ readonly id: string;
16
+ readonly name: string;
17
+ readonly size: number;
18
+ private readonly registry;
19
+ constructor(id: string, name: string, size: number, registry: Map<string, Uint8Array>);
20
+ /** The value to pass as `build_context` to `blueprint.create`. */
21
+ asBuildContext(): {
22
+ type: "object";
23
+ object_id: string;
24
+ };
25
+ delete(): Promise<void>;
26
+ }
27
+ export declare class StorageObjectOps {
28
+ private readonly registry;
29
+ constructor(registry: Map<string, Uint8Array>);
30
+ /** Build a context from a local directory (honours .dockerignore). */
31
+ uploadFromDir(dir: string, params?: {
32
+ name?: string;
33
+ ttl_ms?: number;
34
+ }): Promise<StorageObject>;
35
+ /** Wrap an existing tar.gz. */
36
+ uploadFromBytes(data: Uint8Array, params?: {
37
+ name?: string;
38
+ }): Promise<StorageObject>;
39
+ fromId(id: string): StorageObject;
40
+ }
41
+ /** Deterministic tar.gz of explicit items: each `src` (a file or directory) is stored under `name`. */
42
+ export declare function tarGzPaths(items: Array<{
43
+ src: string;
44
+ name: string;
45
+ }>): Buffer;
46
+ export {};
47
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAUA,yHAAyH;AACzH,eAAO,MAAM,iBAAiB,QAAa,CAAC;AAE5C,uCAAuC;AACvC,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAqBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAetD;AAED,wIAAwI;AACxI,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAmED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAuB5C;AAED,qEAAqE;AACrE,qBAAa,aAAa;IAEtB,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAHhB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACJ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAEpD,kEAAkE;IAClE,cAAc,IAAI;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAGjD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAC9D,sEAAsE;IAChE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAMzG,+BAA+B;IACzB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAM/F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;CAKlC;AAED,uGAAuG;AACvG,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CA+B9E"}
@@ -0,0 +1,236 @@
1
+ // Build contexts for COPY / ADD: a deterministic tar.gz of a local directory (honouring .dockerignore), held by this client
2
+ // and embedded in the build recipe (mirrors solari_runloop/_context.py). It is not a real storage object: capped at
3
+ // MAX_CONTEXT_BYTES compressed, and only visible to the client instance that created it.
4
+ import { createHash } from "node:crypto";
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import zlib from "node:zlib";
8
+ import { SolariCompatUnsupported } from "./errors.js";
9
+ /** The gateway's template body limit is 1 MiB; base64 inflates by a third, so keep the compressed context under this. */
10
+ export const MAX_CONTEXT_BYTES = 700 * 1024;
11
+ function globToRegex(pattern) {
12
+ let re = "";
13
+ for (let i = 0; i < pattern.length; i++) {
14
+ const c = pattern[i];
15
+ if (c === "*") {
16
+ if (pattern[i + 1] === "*") {
17
+ i++;
18
+ if (pattern[i + 1] === "/") {
19
+ i++;
20
+ re += "(?:.*/)?";
21
+ }
22
+ else
23
+ re += ".*";
24
+ }
25
+ else
26
+ re += "[^/]*";
27
+ }
28
+ else if (c === "?")
29
+ re += "[^/]";
30
+ else if (".+^${}()|[]\\".includes(c))
31
+ re += "\\" + c;
32
+ else
33
+ re += c;
34
+ }
35
+ return new RegExp(`^${re}$`);
36
+ }
37
+ export function parseDockerignore(text) {
38
+ const rules = [];
39
+ for (const raw of text.split(/\r?\n/)) {
40
+ let line = raw.trim();
41
+ if (!line || line.startsWith("#"))
42
+ continue;
43
+ let negate = false;
44
+ if (line.startsWith("!")) {
45
+ negate = true;
46
+ line = line.slice(1).trim();
47
+ }
48
+ line = path.posix.normalize(line.replace(/^\/+/, "")).replace(/\/+$/, "");
49
+ if (!line || line === ".")
50
+ continue;
51
+ rules.push({ re: globToRegex(line), negate });
52
+ }
53
+ return rules;
54
+ }
55
+ /** Is `rel` (posix, relative to the context) excluded? A match on any parent directory excludes it too; the last matching rule wins. */
56
+ export function isIgnored(rules, rel) {
57
+ const parts = rel.split("/");
58
+ let ignored = false;
59
+ for (let i = 1; i <= parts.length; i++) {
60
+ const p = parts.slice(0, i).join("/");
61
+ for (const r of rules)
62
+ if (r.re.test(p))
63
+ ignored = !r.negate;
64
+ }
65
+ return ignored;
66
+ }
67
+ function walk(root, rules) {
68
+ const out = [];
69
+ const rec = (dir, rel) => {
70
+ const names = fs.readdirSync(dir).sort();
71
+ for (const n of names) {
72
+ const r = rel ? `${rel}/${n}` : n;
73
+ if (isIgnored(rules, r))
74
+ continue;
75
+ const full = path.join(dir, n);
76
+ const st = fs.lstatSync(full);
77
+ if (st.isDirectory()) {
78
+ out.push({ name: r, type: "dir", mode: st.mode & 0o777 });
79
+ rec(full, r);
80
+ }
81
+ else if (st.isSymbolicLink()) {
82
+ out.push({ name: r, type: "symlink", mode: 0o777, link: fs.readlinkSync(full) });
83
+ }
84
+ else if (st.isFile()) {
85
+ out.push({ name: r, type: "file", mode: st.mode & 0o777, data: fs.readFileSync(full) });
86
+ }
87
+ }
88
+ };
89
+ rec(root, "");
90
+ return out;
91
+ }
92
+ function octal(n, len) {
93
+ return n.toString(8).padStart(len - 1, "0") + "\0";
94
+ }
95
+ function header(e) {
96
+ const b = Buffer.alloc(512);
97
+ let name = e.type === "dir" ? e.name + "/" : e.name;
98
+ let prefix = "";
99
+ if (Buffer.byteLength(name) > 100) {
100
+ const i = name.lastIndexOf("/", name.length - 2);
101
+ if (i < 0 || Buffer.byteLength(name.slice(i + 1)) > 100 || Buffer.byteLength(name.slice(0, i)) > 155) {
102
+ throw new SolariCompatUnsupported(`build context path ${JSON.stringify(e.name)}`, "path is too long for the tar format used");
103
+ }
104
+ prefix = name.slice(0, i);
105
+ name = name.slice(i + 1);
106
+ }
107
+ b.write(name, 0, "utf8");
108
+ b.write(octal(e.mode, 8), 100);
109
+ b.write(octal(0, 8), 108); // uid
110
+ b.write(octal(0, 8), 116); // gid
111
+ b.write(octal(e.type === "file" ? (e.data?.length ?? 0) : 0, 12), 124);
112
+ b.write(octal(0, 12), 136); // mtime 0: deterministic
113
+ b.write(" ", 148); // checksum placeholder
114
+ b.write(e.type === "dir" ? "5" : e.type === "symlink" ? "2" : "0", 156);
115
+ if (e.link)
116
+ b.write(e.link, 157, "utf8");
117
+ b.write("ustar\0", 257);
118
+ b.write("00", 263);
119
+ if (prefix)
120
+ b.write(prefix, 345, "utf8");
121
+ let sum = 0;
122
+ for (const x of b)
123
+ sum += x;
124
+ b.write(sum.toString(8).padStart(6, "0") + "\0 ", 148);
125
+ return b;
126
+ }
127
+ /** Deterministic tar.gz of `dir`. */
128
+ export function tarGzDir(dir) {
129
+ const root = path.resolve(dir);
130
+ if (!fs.statSync(root).isDirectory())
131
+ throw new SolariCompatUnsupported(`build context ${dir}`, "not a directory");
132
+ const ignoreFile = path.join(root, ".dockerignore");
133
+ const rules = fs.existsSync(ignoreFile) ? parseDockerignore(fs.readFileSync(ignoreFile, "utf8")) : [];
134
+ const chunks = [];
135
+ for (const e of walk(root, rules)) {
136
+ chunks.push(header(e));
137
+ if (e.type === "file" && e.data && e.data.length) {
138
+ chunks.push(e.data);
139
+ const pad = (512 - (e.data.length % 512)) % 512;
140
+ if (pad)
141
+ chunks.push(Buffer.alloc(pad));
142
+ }
143
+ }
144
+ chunks.push(Buffer.alloc(1024));
145
+ const gz = zlib.gzipSync(Buffer.concat(chunks), { level: 9 });
146
+ if (gz.length > MAX_CONTEXT_BYTES) {
147
+ throw new SolariCompatUnsupported("a build context this large", `${gz.length} bytes compressed; the limit is ${MAX_CONTEXT_BYTES}. Trim it with a .dockerignore, or fetch big files with RUN.`);
148
+ }
149
+ return gz;
150
+ }
151
+ /** A "storage object" that is really a client-held build context. */
152
+ export class StorageObject {
153
+ id;
154
+ name;
155
+ size;
156
+ registry;
157
+ constructor(id, name, size, registry) {
158
+ this.id = id;
159
+ this.name = name;
160
+ this.size = size;
161
+ this.registry = registry;
162
+ }
163
+ /** The value to pass as `build_context` to `blueprint.create`. */
164
+ asBuildContext() {
165
+ return { type: "object", object_id: this.id };
166
+ }
167
+ async delete() {
168
+ this.registry.delete(this.id);
169
+ }
170
+ }
171
+ export class StorageObjectOps {
172
+ registry;
173
+ constructor(registry) {
174
+ this.registry = registry;
175
+ }
176
+ /** Build a context from a local directory (honours .dockerignore). */
177
+ async uploadFromDir(dir, params = {}) {
178
+ const gz = tarGzDir(dir);
179
+ const id = "ctx_" + createHash("sha256").update(gz).digest("hex").slice(0, 24);
180
+ this.registry.set(id, gz);
181
+ return new StorageObject(id, params.name ?? path.basename(path.resolve(dir)), gz.length, this.registry);
182
+ }
183
+ /** Wrap an existing tar.gz. */
184
+ async uploadFromBytes(data, params = {}) {
185
+ if (data.length > MAX_CONTEXT_BYTES)
186
+ throw new SolariCompatUnsupported("a build context this large", `the limit is ${MAX_CONTEXT_BYTES} bytes compressed`);
187
+ const id = "ctx_" + createHash("sha256").update(data).digest("hex").slice(0, 24);
188
+ this.registry.set(id, data);
189
+ return new StorageObject(id, params.name ?? "context", data.length, this.registry);
190
+ }
191
+ fromId(id) {
192
+ const d = this.registry.get(id);
193
+ if (!d)
194
+ throw new SolariCompatUnsupported("a storage object from another process", "build contexts are held by the client that created them");
195
+ return new StorageObject(id, id, d.length, this.registry);
196
+ }
197
+ }
198
+ /** Deterministic tar.gz of explicit items: each `src` (a file or directory) is stored under `name`. */
199
+ export function tarGzPaths(items) {
200
+ const chunks = [];
201
+ const emit = (e) => {
202
+ chunks.push(header(e));
203
+ if (e.type === "file" && e.data && e.data.length) {
204
+ chunks.push(e.data);
205
+ const pad = (512 - (e.data.length % 512)) % 512;
206
+ if (pad)
207
+ chunks.push(Buffer.alloc(pad));
208
+ }
209
+ };
210
+ for (const it of items) {
211
+ const src = path.resolve(it.src);
212
+ if (!fs.existsSync(src))
213
+ throw new SolariCompatUnsupported(`local path ${JSON.stringify(it.src)}`, "does not exist");
214
+ const st = fs.statSync(src);
215
+ if (st.isDirectory()) {
216
+ emit({ name: it.name, type: "dir", mode: st.mode & 0o777 });
217
+ const ignoreFile = path.join(src, ".dockerignore");
218
+ const rules = fs.existsSync(ignoreFile) ? parseDockerignore(fs.readFileSync(ignoreFile, "utf8")) : [];
219
+ for (const e of walk(src, rules))
220
+ emit({ ...e, name: `${it.name}/${e.name}` });
221
+ }
222
+ else if (st.isFile()) {
223
+ emit({ name: it.name, type: "file", mode: st.mode & 0o777, data: fs.readFileSync(src) });
224
+ }
225
+ else {
226
+ throw new SolariCompatUnsupported(`local path ${JSON.stringify(it.src)}`, "not a regular file or directory");
227
+ }
228
+ }
229
+ chunks.push(Buffer.alloc(1024));
230
+ const gz = zlib.gzipSync(Buffer.concat(chunks), { level: 9 });
231
+ if (gz.length > MAX_CONTEXT_BYTES) {
232
+ throw new SolariCompatUnsupported("a build context this large", `${gz.length} bytes compressed; the limit is ${MAX_CONTEXT_BYTES}. Fetch big files with RUN instead.`);
233
+ }
234
+ return gz;
235
+ }
236
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface CompiledRecipe {
2
+ kind: "sandbox";
3
+ base?: string;
4
+ fromTemplate?: string;
5
+ fromImage?: string;
6
+ packages: string[];
7
+ steps: Array<Record<string, unknown>>;
8
+ fragment: string;
9
+ localFiles: unknown[];
10
+ }
11
+ /** `build_args` switch that forces native image import even for ubuntu/debian images. */
12
+ export declare const IMPORT_ARG = "SOLARI_IMPORT";
13
+ export declare const CONTEXT_DIR = "/tmp/solari-context";
14
+ /** Join `\` continuations, drop comments and blank lines, split into [INSTRUCTION, rest]. */
15
+ export declare function logicalLines(text: string): Array<[string, string]>;
16
+ /** Docker's default PATH, so `ENV PATH=/opt/x/bin:$PATH` expands to a usable value (an unknown $VAR is ""). */
17
+ export declare const DEFAULT_PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
18
+ /** POSIX-ish word splitting with single quotes, double quotes and backslashes (enough for ENV / COPY lines). */
19
+ export declare function shellSplit(s: string): string[];
20
+ export declare function shq(s: string): string;
21
+ /** Steps that unpack the tar.gz build context into CONTEXT_DIR (chunked so no exec argument is huge). */
22
+ export declare function contextSteps(ctx: Uint8Array): Array<Record<string, unknown>>;
23
+ export interface CompileInputs {
24
+ dockerfile?: string | null;
25
+ system_setup_commands?: string[] | null;
26
+ file_mounts?: Record<string, string> | null;
27
+ base_blueprint_name?: string | null;
28
+ /** A resolved template id / name for `base_blueprint_id` (the caller resolves it). */
29
+ base_template?: string | null;
30
+ build_args?: Record<string, string> | null;
31
+ /** tar.gz build context for COPY / ADD. */
32
+ context?: Uint8Array | null;
33
+ warn?: (m: string) => void;
34
+ }
35
+ export declare function compileDockerfile(input: CompileInputs): CompiledRecipe;
36
+ //# sourceMappingURL=dockerfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile.d.ts","sourceRoot":"","sources":["../src/dockerfile.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,EAAE,CAAC;CACvB;AAID,yFAAyF;AACzF,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAC1C,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAIjD,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuBlE;AAED,+GAA+G;AAC/G,eAAO,MAAM,YAAY,iEAAiE,CAAC;AAwB3F,gHAAgH;AAChH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA6B9C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAErC;AAwDD,yGAAyG;AACzG,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAM5E;AA2DD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,2CAA2C;IAC3C,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAgGtE"}