fc-sandbox-sdk 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ComputeSDK
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # fc-sandbox-sdk
2
+
3
+ TypeScript SDK for the `fc-spawn` control plane API.
4
+
5
+ ```ts
6
+ import { FcClient } from "fc-sandbox-sdk";
7
+
8
+ const fc = new FcClient({
9
+ apiKey: process.env.FC_API_KEY,
10
+ baseUrl: "https://fc-spawn.bhautik.in",
11
+ });
12
+
13
+ const sandbox = await fc.createSandbox({
14
+ shape: "s-1vcpu-256mb",
15
+ rootfs: "devbox:1",
16
+ });
17
+
18
+ const result = await fc.execSandbox(sandbox.id, {
19
+ cmd: "node",
20
+ args: ["--version"],
21
+ });
22
+
23
+ console.log(result.result.stdout);
24
+ ```
25
+
26
+ ## Streaming exec
27
+
28
+ ```ts
29
+ for await (const event of fc.execSandboxStream(sandbox.id, {
30
+ cmd: "bash",
31
+ args: ["-lc", "for i in 1 2 3; do echo $i; sleep 1; done"],
32
+ })) {
33
+ if (event.stdout) process.stdout.write(event.stdout);
34
+ if (event.stderr) process.stderr.write(event.stderr);
35
+ if (event.exit_code !== undefined) console.log("exit", event.exit_code);
36
+ }
37
+ ```
38
+
39
+ ## Files
40
+
41
+ ```ts
42
+ await fc.uploadFile(
43
+ sandbox.id,
44
+ "/tmp/hello.txt",
45
+ new TextEncoder().encode("hello"),
46
+ );
47
+
48
+ const bytes = await fc.downloadFile(sandbox.id, "/tmp/hello.txt");
49
+ console.log(new TextDecoder().decode(bytes));
50
+ ```
51
+
52
+ ## API surface
53
+
54
+ The client covers the OpenAPI gist endpoints:
55
+
56
+ - health and readiness: `healthz`, `readyz`
57
+ - catalog: `whoami`, `listShapes`, `listRootfs`, `listHosts`
58
+ - sandboxes: create, list, get, patch, destroy, pause, resume, fork, lookup by IP
59
+ - exec: buffered and NDJSON streaming
60
+ - files: upload and download
61
+ - egress, bandwidth, and disk resize
62
+ - templates and template log streaming
63
+ - networks and sandbox network attachment
64
+
65
+ ## Errors
66
+
67
+ Non-2xx API responses throw `FcApiError`. The original `Response`, status code,
68
+ and parsed JSend `fail` or `error` envelope are available on the error.
69
+
70
+ ## Publishing
71
+
72
+ The safest release flow is:
73
+
74
+ ```sh
75
+ npm whoami
76
+ npm version patch
77
+ npm run pack:dry
78
+ npm run publish:dry
79
+ npm run publish:npm
80
+ git push --follow-tags
81
+ ```
82
+
83
+ `prepublishOnly` runs the test and typecheck gates automatically before a real
84
+ `npm publish`.
85
+
86
+ If publish fails with `E401`, the local npm token is invalid; run
87
+ `npm login --registry=https://registry.npmjs.org/` and try again.
@@ -0,0 +1,46 @@
1
+ import type { BandwidthView, CreateSandboxRequest, CreateSandboxResponse, DestroyedResponse, EgressView, ExecRequest, ExecResponse, ExecStreamEvent, FcClientOptions, ForkSandboxRequest, GetTemplateLogsOptions, GetTemplateOptions, HealthzResponse, HostPublic, Network, NetworkCreateRequest, NetworkEntry, OKResponse, PatchSandboxRequest, PauseAck, ReadyzResponse, RechargeBandwidthRequest, ResumeAck, RequestOptions, ResizeSandboxRequest, ResizeSandboxResponse, RootfsData, SandboxView, SetEgressRequest, ShapesData, TemplateCreateRequest, TemplateLogEvent, TemplatesListResponse, TemplateView, WhoAmIView } from "./types.js";
2
+ export declare class FcClient {
3
+ private readonly http;
4
+ constructor(options: FcClientOptions);
5
+ get baseUrl(): string;
6
+ healthz(options?: RequestOptions): Promise<HealthzResponse>;
7
+ readyz(options?: RequestOptions): Promise<ReadyzResponse>;
8
+ whoami(options?: RequestOptions): Promise<WhoAmIView>;
9
+ listShapes(options?: RequestOptions): Promise<ShapesData>;
10
+ listRootfs(options?: RequestOptions): Promise<RootfsData>;
11
+ listHosts(options?: RequestOptions): Promise<HostPublic[]>;
12
+ listSandboxes(options?: {
13
+ limit?: number;
14
+ status?: string;
15
+ } & RequestOptions): Promise<SandboxView[]>;
16
+ createSandbox(body: CreateSandboxRequest, options?: RequestOptions): Promise<CreateSandboxResponse>;
17
+ getSandbox(id: string, options?: RequestOptions): Promise<SandboxView>;
18
+ destroySandbox(id: string, options?: RequestOptions): Promise<DestroyedResponse>;
19
+ patchSandbox(id: string, body: PatchSandboxRequest, options?: RequestOptions): Promise<SandboxView>;
20
+ pauseSandbox(id: string, options?: RequestOptions): Promise<PauseAck>;
21
+ resumeSandbox(id: string, options?: RequestOptions): Promise<ResumeAck>;
22
+ forkSandbox(id: string, body?: ForkSandboxRequest, options?: RequestOptions): Promise<SandboxView>;
23
+ getSandboxByIP(ip: string, options?: RequestOptions): Promise<SandboxView>;
24
+ execSandbox(id: string, body: ExecRequest, options?: RequestOptions): Promise<ExecResponse>;
25
+ execSandboxStream(id: string, body: Omit<ExecRequest, "stream">, options?: RequestOptions): AsyncGenerator<ExecStreamEvent>;
26
+ uploadFile(id: string, path: string, bytes: BodyInit, options?: RequestOptions): Promise<unknown>;
27
+ downloadFile(id: string, path: string, options?: RequestOptions): Promise<ArrayBuffer>;
28
+ getEgress(id: string, options?: RequestOptions): Promise<EgressView>;
29
+ setEgress(id: string, body: SetEgressRequest, options?: RequestOptions): Promise<EgressView>;
30
+ getBandwidth(id: string, options?: RequestOptions): Promise<BandwidthView>;
31
+ rechargeBandwidth(id: string, body: RechargeBandwidthRequest, options?: RequestOptions): Promise<BandwidthView>;
32
+ resizeSandbox(id: string, body: ResizeSandboxRequest, options?: RequestOptions): Promise<ResizeSandboxResponse>;
33
+ listTemplates(options?: RequestOptions): Promise<TemplatesListResponse>;
34
+ submitTemplate(body: TemplateCreateRequest, options?: RequestOptions): Promise<TemplateView>;
35
+ getTemplate(id: string, options?: GetTemplateOptions): Promise<TemplateView>;
36
+ deleteTemplate(id: string, options?: RequestOptions): Promise<DestroyedResponse>;
37
+ getTemplateLogs(id: string, options?: GetTemplateLogsOptions): AsyncGenerator<TemplateLogEvent>;
38
+ listNetworks(options?: RequestOptions): Promise<Network[]>;
39
+ createNetwork(body: NetworkCreateRequest, options?: RequestOptions): Promise<Network>;
40
+ getNetwork(id: string, options?: RequestOptions): Promise<Network>;
41
+ deleteNetwork(id: string, options?: RequestOptions): Promise<OKResponse>;
42
+ attachNetwork(id: string, body: NetworkEntry, options?: RequestOptions): Promise<OKResponse>;
43
+ detachNetwork(id: string, network: string, options?: RequestOptions): Promise<OKResponse>;
44
+ }
45
+ export declare function createClient(options: FcClientOptions): FcClient;
46
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,160 @@
1
+ import { FcHttp, encodePath } from "./http.js";
2
+ export class FcClient {
3
+ http;
4
+ constructor(options) {
5
+ this.http = new FcHttp(options);
6
+ }
7
+ get baseUrl() {
8
+ return this.http.baseUrl;
9
+ }
10
+ healthz(options) {
11
+ return this.http.request("GET", "/healthz", { ...options, auth: false });
12
+ }
13
+ readyz(options) {
14
+ return this.http.request("GET", "/readyz", { ...options, auth: false });
15
+ }
16
+ whoami(options) {
17
+ return this.http.request("GET", "/v1/whoami", options);
18
+ }
19
+ listShapes(options) {
20
+ return this.http.request("GET", "/v1/shapes", options);
21
+ }
22
+ listRootfs(options) {
23
+ return this.http.request("GET", "/v1/rootfs", options);
24
+ }
25
+ listHosts(options) {
26
+ return this.http.request("GET", "/v1/hosts", options);
27
+ }
28
+ listSandboxes(options = {}) {
29
+ const { limit, status, ...requestOptions } = options;
30
+ return this.http.request("GET", "/v1/sandboxes", {
31
+ ...requestOptions,
32
+ query: { limit, status }
33
+ });
34
+ }
35
+ createSandbox(body, options) {
36
+ return this.http.request("POST", "/v1/sandboxes", { ...options, body });
37
+ }
38
+ getSandbox(id, options) {
39
+ return this.http.request("GET", `/v1/sandboxes/${encodePath(id)}`, options);
40
+ }
41
+ destroySandbox(id, options) {
42
+ return this.http.request("DELETE", `/v1/sandboxes/${encodePath(id)}`, options);
43
+ }
44
+ patchSandbox(id, body, options) {
45
+ return this.http.request("PATCH", `/v1/sandboxes/${encodePath(id)}`, { ...options, body });
46
+ }
47
+ pauseSandbox(id, options) {
48
+ return this.http.requestWithEmptyFallback("POST", `/v1/sandboxes/${encodePath(id)}/pause`, {
49
+ options,
50
+ fallback: { id, status: "paused" }
51
+ });
52
+ }
53
+ resumeSandbox(id, options) {
54
+ return this.http.requestWithEmptyFallback("POST", `/v1/sandboxes/${encodePath(id)}/resume`, {
55
+ options,
56
+ fallback: { id, status: "running" }
57
+ });
58
+ }
59
+ forkSandbox(id, body = {}, options) {
60
+ return this.http.request("POST", `/v1/sandboxes/${encodePath(id)}/fork`, { ...options, body });
61
+ }
62
+ getSandboxByIP(ip, options) {
63
+ return this.http.request("GET", `/v1/sandboxes/by-ip/${encodePath(ip)}`, options);
64
+ }
65
+ execSandbox(id, body, options) {
66
+ const { stream: _stream, ...bufferedBody } = body;
67
+ return this.http.request("POST", `/v1/sandboxes/${encodePath(id)}/exec`, {
68
+ ...options,
69
+ body: bufferedBody
70
+ });
71
+ }
72
+ execSandboxStream(id, body, options) {
73
+ return this.http.stream("POST", `/v1/sandboxes/${encodePath(id)}/exec`, {
74
+ ...options,
75
+ query: { stream: true },
76
+ body: { ...body, stream: true }
77
+ });
78
+ }
79
+ async uploadFile(id, path, bytes, options) {
80
+ return this.http.request("PUT", `/v1/sandboxes/${encodePath(id)}/files`, {
81
+ ...options,
82
+ query: { path },
83
+ rawBody: bytes,
84
+ contentType: "application/octet-stream"
85
+ });
86
+ }
87
+ async downloadFile(id, path, options) {
88
+ const response = await this.http.fetchRaw("GET", `/v1/sandboxes/${encodePath(id)}/files`, {
89
+ ...options,
90
+ query: { path }
91
+ });
92
+ if (!response.ok) {
93
+ await this.http.throwApiError(response);
94
+ }
95
+ return response.arrayBuffer();
96
+ }
97
+ getEgress(id, options) {
98
+ return this.http.request("GET", `/v1/sandboxes/${encodePath(id)}/egress`, options);
99
+ }
100
+ setEgress(id, body, options) {
101
+ return this.http.request("PUT", `/v1/sandboxes/${encodePath(id)}/egress`, { ...options, body });
102
+ }
103
+ getBandwidth(id, options) {
104
+ return this.http.request("GET", `/v1/sandboxes/${encodePath(id)}/bandwidth`, options);
105
+ }
106
+ rechargeBandwidth(id, body, options) {
107
+ return this.http.request("POST", `/v1/sandboxes/${encodePath(id)}/bandwidth/recharge`, {
108
+ ...options,
109
+ body
110
+ });
111
+ }
112
+ resizeSandbox(id, body, options) {
113
+ return this.http.request("POST", `/v1/sandboxes/${encodePath(id)}/resize`, { ...options, body });
114
+ }
115
+ listTemplates(options) {
116
+ return this.http.request("GET", "/v1/templates", options);
117
+ }
118
+ submitTemplate(body, options) {
119
+ return this.http.request("POST", "/v1/templates", { ...options, body });
120
+ }
121
+ getTemplate(id, options = {}) {
122
+ const { include, ...requestOptions } = options;
123
+ return this.http.request("GET", `/v1/templates/${encodePath(id)}`, {
124
+ ...requestOptions,
125
+ query: { include }
126
+ });
127
+ }
128
+ deleteTemplate(id, options) {
129
+ return this.http.request("DELETE", `/v1/templates/${encodePath(id)}`, options);
130
+ }
131
+ getTemplateLogs(id, options = {}) {
132
+ const { attempt, limit, ...requestOptions } = options;
133
+ return this.http.stream("GET", `/v1/templates/${encodePath(id)}/logs`, {
134
+ ...requestOptions,
135
+ query: { attempt, limit }
136
+ });
137
+ }
138
+ listNetworks(options) {
139
+ return this.http.request("GET", "/v1/networks", options);
140
+ }
141
+ createNetwork(body, options) {
142
+ return this.http.request("POST", "/v1/networks", { ...options, body });
143
+ }
144
+ getNetwork(id, options) {
145
+ return this.http.request("GET", `/v1/networks/${encodePath(id)}`, options);
146
+ }
147
+ deleteNetwork(id, options) {
148
+ return this.http.request("DELETE", `/v1/networks/${encodePath(id)}`, options);
149
+ }
150
+ attachNetwork(id, body, options) {
151
+ return this.http.request("POST", `/v1/sandboxes/${encodePath(id)}/networks`, { ...options, body });
152
+ }
153
+ detachNetwork(id, network, options) {
154
+ return this.http.request("DELETE", `/v1/sandboxes/${encodePath(id)}/networks/${encodePath(network)}`, options);
155
+ }
156
+ }
157
+ export function createClient(options) {
158
+ return new FcClient(options);
159
+ }
160
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ErrorEnvelope, FailEnvelope } from "./types.js";
2
+ export declare class FcApiError extends Error {
3
+ readonly statusCode: number;
4
+ readonly envelope: FailEnvelope | ErrorEnvelope | undefined;
5
+ readonly response: Response;
6
+ constructor(message: string, response: Response, envelope?: FailEnvelope | ErrorEnvelope);
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,aAAa;CAOzF"}
package/dist/errors.js ADDED
@@ -0,0 +1,13 @@
1
+ export class FcApiError extends Error {
2
+ statusCode;
3
+ envelope;
4
+ response;
5
+ constructor(message, response, envelope) {
6
+ super(message);
7
+ this.name = "FcApiError";
8
+ this.statusCode = response.status;
9
+ this.response = response;
10
+ this.envelope = envelope;
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,UAAU,CAAS;IACnB,QAAQ,CAA2C;IACnD,QAAQ,CAAW;IAE5B,YAAY,OAAe,EAAE,QAAkB,EAAE,QAAuC;QACtF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import type { FcClientOptions, RequestOptions } from "./types.js";
2
+ export type QueryValue = string | number | boolean | null | undefined;
3
+ export type Query = Record<string, QueryValue>;
4
+ export interface HttpRequestOptions extends RequestOptions {
5
+ query?: Query;
6
+ body?: unknown;
7
+ rawBody?: BodyInit;
8
+ contentType?: string;
9
+ auth?: boolean;
10
+ }
11
+ export declare class FcHttp {
12
+ readonly baseUrl: string;
13
+ private readonly apiKey;
14
+ private readonly fetchFn;
15
+ private readonly defaultHeaders;
16
+ constructor(options: FcClientOptions);
17
+ request<T>(method: string, path: string, options?: HttpRequestOptions): Promise<T>;
18
+ requestWithEmptyFallback<T>(method: string, path: string, input: {
19
+ options: RequestOptions | undefined;
20
+ fallback: T;
21
+ }): Promise<T>;
22
+ stream<T>(method: string, path: string, options?: HttpRequestOptions): AsyncGenerator<T>;
23
+ fetchRaw(method: string, path: string, options?: HttpRequestOptions): Promise<Response>;
24
+ throwApiError(response: Response): Promise<never>;
25
+ private buildHeaders;
26
+ private buildUrl;
27
+ }
28
+ export declare function encodePath(value: string): string;
29
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAiB,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AACtE,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAE/C,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,MAAM;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;gBAEjC,OAAO,EAAE,eAAe;IAgB9B,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC;IAUtF,wBAAwB,CAAC,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;QAAE,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAA;KAAE,GAC1D,OAAO,CAAC,CAAC,CAAC;IAcN,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAAC,CAAC,CAAC;IAcnG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBrF,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAqBvD,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,QAAQ;CAajB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
package/dist/http.js ADDED
@@ -0,0 +1,135 @@
1
+ import { FcApiError } from "./errors.js";
2
+ import { readNdjson } from "./ndjson.js";
3
+ export class FcHttp {
4
+ baseUrl;
5
+ apiKey;
6
+ fetchFn;
7
+ defaultHeaders;
8
+ constructor(options) {
9
+ const fetchFn = options.fetch ?? globalThis.fetch;
10
+ if (!fetchFn) {
11
+ throw new Error("A fetch implementation is required.");
12
+ }
13
+ if (!options.baseUrl?.trim()) {
14
+ throw new Error("baseUrl is required.");
15
+ }
16
+ this.apiKey = options.apiKey;
17
+ this.baseUrl = normalizeBaseUrl(options.baseUrl);
18
+ this.fetchFn = fetchFn;
19
+ this.defaultHeaders = options.headers ?? {};
20
+ }
21
+ async request(method, path, options = {}) {
22
+ const response = await this.fetchRaw(method, path, options);
23
+ if (!response.ok) {
24
+ await this.throwApiError(response);
25
+ }
26
+ return readSuccessEnvelope(response);
27
+ }
28
+ async requestWithEmptyFallback(method, path, input) {
29
+ const response = await this.fetchRaw(method, path, input.options);
30
+ if (!response.ok) {
31
+ await this.throwApiError(response);
32
+ }
33
+ if (!hasJsonBody(response)) {
34
+ return input.fallback;
35
+ }
36
+ return readSuccessEnvelope(response);
37
+ }
38
+ async *stream(method, path, options = {}) {
39
+ const response = await this.fetchRaw(method, path, options);
40
+ if (!response.ok) {
41
+ await this.throwApiError(response);
42
+ }
43
+ if (!response.body) {
44
+ throw new FcApiError("fc-spawn API returned an empty stream.", response);
45
+ }
46
+ yield* readNdjson(response.body);
47
+ }
48
+ fetchRaw(method, path, options = {}) {
49
+ const headers = this.buildHeaders(options);
50
+ const body = buildBody(headers, options);
51
+ const init = { method, headers };
52
+ if (body !== undefined) {
53
+ init.body = body;
54
+ }
55
+ if (options.signal !== undefined) {
56
+ init.signal = options.signal;
57
+ }
58
+ return this.fetchFn(this.buildUrl(path, options.query), init);
59
+ }
60
+ async throwApiError(response) {
61
+ if (hasJsonBody(response)) {
62
+ try {
63
+ const envelope = (await response.json());
64
+ if (envelope.status === "fail") {
65
+ throw new FcApiError(`fc-spawn request failed with ${response.status}.`, response, envelope);
66
+ }
67
+ if (envelope.status === "error") {
68
+ throw new FcApiError(envelope.message, response, envelope);
69
+ }
70
+ }
71
+ catch (error) {
72
+ if (error instanceof FcApiError) {
73
+ throw error;
74
+ }
75
+ }
76
+ }
77
+ throw new FcApiError(`fc-spawn request failed with ${response.status}.`, response);
78
+ }
79
+ buildHeaders(options) {
80
+ const headers = new Headers(this.defaultHeaders);
81
+ if (options.headers) {
82
+ new Headers(options.headers).forEach((value, key) => headers.set(key, value));
83
+ }
84
+ if (options.auth !== false) {
85
+ if (!this.apiKey) {
86
+ throw new Error("An apiKey is required for authenticated fc-spawn requests.");
87
+ }
88
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
89
+ }
90
+ return headers;
91
+ }
92
+ buildUrl(path, query) {
93
+ const url = new URL(path.replace(/^\/+/, ""), `${this.baseUrl}/`);
94
+ if (query) {
95
+ for (const [key, value] of Object.entries(query)) {
96
+ if (value !== undefined && value !== null) {
97
+ url.searchParams.set(key, String(value));
98
+ }
99
+ }
100
+ }
101
+ return url.toString();
102
+ }
103
+ }
104
+ export function encodePath(value) {
105
+ return encodeURIComponent(value);
106
+ }
107
+ function normalizeBaseUrl(baseUrl) {
108
+ const url = new URL(baseUrl);
109
+ return url.toString().replace(/\/+$/, "");
110
+ }
111
+ function buildBody(headers, options) {
112
+ if (options.rawBody !== undefined) {
113
+ if (options.contentType) {
114
+ headers.set("Content-Type", options.contentType);
115
+ }
116
+ return options.rawBody;
117
+ }
118
+ if (options.body !== undefined) {
119
+ headers.set("Content-Type", "application/json");
120
+ return JSON.stringify(options.body);
121
+ }
122
+ return undefined;
123
+ }
124
+ async function readSuccessEnvelope(response) {
125
+ const envelope = (await response.json());
126
+ if (envelope.status === "success") {
127
+ return envelope.data;
128
+ }
129
+ throw new FcApiError("fc-spawn API returned an unsuccessful envelope.", response, envelope);
130
+ }
131
+ function hasJsonBody(response) {
132
+ const contentType = response.headers.get("content-type") ?? "";
133
+ return contentType.includes("application/json");
134
+ }
135
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { FcClient, createClient } from "./client.js";
2
+ export { FcApiError } from "./errors.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { FcClient, createClient } from "./client.js";
2
+ export { FcApiError } from "./errors.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function readNdjson<T>(body: ReadableStream<Uint8Array>): AsyncGenerator<T>;
2
+ //# sourceMappingURL=ndjson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.d.ts","sourceRoot":"","sources":["../src/ndjson.ts"],"names":[],"mappings":"AAAA,wBAAuB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAmCxF"}
package/dist/ndjson.js ADDED
@@ -0,0 +1,32 @@
1
+ export async function* readNdjson(body) {
2
+ const reader = body.getReader();
3
+ const decoder = new TextDecoder();
4
+ let buffer = "";
5
+ try {
6
+ while (true) {
7
+ const { done, value } = await reader.read();
8
+ if (done) {
9
+ break;
10
+ }
11
+ buffer += decoder.decode(value, { stream: true });
12
+ let newlineIndex = buffer.indexOf("\n");
13
+ while (newlineIndex !== -1) {
14
+ const line = buffer.slice(0, newlineIndex).trim();
15
+ buffer = buffer.slice(newlineIndex + 1);
16
+ if (line.length > 0) {
17
+ yield JSON.parse(line);
18
+ }
19
+ newlineIndex = buffer.indexOf("\n");
20
+ }
21
+ }
22
+ buffer += decoder.decode();
23
+ const finalLine = buffer.trim();
24
+ if (finalLine.length > 0) {
25
+ yield JSON.parse(finalLine);
26
+ }
27
+ }
28
+ finally {
29
+ reader.releaseLock();
30
+ }
31
+ }
32
+ //# sourceMappingURL=ndjson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.js","sourceRoot":"","sources":["../src/ndjson.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,CAAI,IAAgC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM;YACR,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,IAAI,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAExC,OAAO,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBAExC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;gBAC9B,CAAC;gBAED,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAM,CAAC;QACnC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,253 @@
1
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export interface SuccessEnvelope<T> {
5
+ status: "success";
6
+ data: T;
7
+ }
8
+ export interface FailEnvelope {
9
+ status: "fail";
10
+ data: Record<string, unknown>;
11
+ }
12
+ export interface ErrorEnvelope {
13
+ status: "error";
14
+ message: string;
15
+ code: number;
16
+ }
17
+ export type JSendEnvelope<T> = SuccessEnvelope<T> | FailEnvelope | ErrorEnvelope;
18
+ export interface FcClientOptions {
19
+ apiKey?: string;
20
+ baseUrl: string;
21
+ fetch?: typeof fetch;
22
+ headers?: HeadersInit;
23
+ }
24
+ export interface RequestOptions {
25
+ signal?: AbortSignal;
26
+ headers?: HeadersInit;
27
+ }
28
+ export interface Shape {
29
+ id: string;
30
+ vcpu: number;
31
+ mem_mib: number;
32
+ default_disk_mib: number;
33
+ }
34
+ export interface ShapesData {
35
+ shapes: Shape[];
36
+ }
37
+ export interface RootfsEntry {
38
+ name: string;
39
+ description?: string;
40
+ deprecated?: boolean;
41
+ successor?: string;
42
+ }
43
+ export interface RootfsData {
44
+ rootfs: string[];
45
+ default: string;
46
+ entries: RootfsEntry[];
47
+ }
48
+ export type HostStatus = "active" | "draining" | "dead";
49
+ export interface HostPublic {
50
+ id: string;
51
+ status: HostStatus;
52
+ free_mib: number;
53
+ vm_count: number;
54
+ rootfses: string[];
55
+ }
56
+ export interface NetworkEntry {
57
+ id: string;
58
+ }
59
+ export interface CreateSandboxRequest {
60
+ shape: string;
61
+ rootfs?: string;
62
+ name?: string;
63
+ networks?: NetworkEntry[];
64
+ disk_mib?: number;
65
+ egress?: string[];
66
+ envs?: Record<string, string>;
67
+ ssh_pubkeys?: string[];
68
+ bandwidth_quota_bytes?: number;
69
+ host_id?: string;
70
+ region?: string;
71
+ }
72
+ export type SandboxSpawnMode = "snapshot" | "cold";
73
+ export interface CreateSandboxResponse {
74
+ id: string;
75
+ name: string;
76
+ ip: string;
77
+ mode: SandboxSpawnMode;
78
+ shape: string;
79
+ rootfs: string;
80
+ vcpu: number;
81
+ mem_mib: number;
82
+ disk_mib: number;
83
+ spawn_ms: number;
84
+ egress: string[];
85
+ bandwidth_quota_bytes: number;
86
+ }
87
+ export type SandboxStatus = "creating" | "running" | "pausing" | "paused" | "resuming" | "forking" | "error" | "destroying" | "destroyed" | "failed";
88
+ export interface SandboxView {
89
+ id: string;
90
+ name: string;
91
+ status: SandboxStatus;
92
+ ip: string;
93
+ vcpu: number;
94
+ mem_mib: number;
95
+ disk_mib: number;
96
+ created_at: string;
97
+ running_at: string | null;
98
+ destroyed_at: string | null;
99
+ spawn_ms: number;
100
+ shape: string;
101
+ rootfs: string;
102
+ region: string;
103
+ egress: string[];
104
+ envs: string[];
105
+ ssh_pubkeys: string[];
106
+ created_by: string;
107
+ ingress_enabled: boolean;
108
+ bandwidth_ingress_bytes: number;
109
+ paused_at: string | null;
110
+ last_resumed_at: string | null;
111
+ forked_from?: string;
112
+ }
113
+ export interface ListSandboxesOptions extends RequestOptions {
114
+ limit?: number;
115
+ status?: Extract<SandboxStatus, "running" | "creating" | "destroyed" | "failed">;
116
+ }
117
+ export interface PauseAck {
118
+ id: string;
119
+ status: "pausing" | "paused";
120
+ }
121
+ export interface ResumeAck {
122
+ id: string;
123
+ status: "resuming" | "running";
124
+ }
125
+ export interface ForkSandboxRequest {
126
+ start_paused?: boolean;
127
+ ssh_pubkeys?: string[];
128
+ egress?: string[];
129
+ ingress_enabled?: boolean;
130
+ envs?: Record<string, string>;
131
+ bandwidth_quota_bytes?: number;
132
+ }
133
+ export interface PatchSandboxRequest {
134
+ ingress_enabled?: boolean;
135
+ }
136
+ export interface ExecRequest {
137
+ cmd: string;
138
+ args?: string[];
139
+ stdin?: string;
140
+ env?: Record<string, string>;
141
+ stream?: boolean;
142
+ }
143
+ export interface ExecResult {
144
+ stdout: string;
145
+ stderr: string;
146
+ exit_code: number;
147
+ }
148
+ export interface ExecResponse {
149
+ result: ExecResult;
150
+ exec_ms: number;
151
+ }
152
+ export interface ExecStreamEvent {
153
+ stdout?: string;
154
+ stderr?: string;
155
+ exit_code?: number;
156
+ error?: string;
157
+ hb?: boolean;
158
+ }
159
+ export interface SetEgressRequest {
160
+ egress?: string[] | null;
161
+ }
162
+ export interface EgressView {
163
+ id: string;
164
+ egress: string[];
165
+ }
166
+ export interface BandwidthView {
167
+ id: string;
168
+ quota_bytes: number;
169
+ used_bytes: number;
170
+ remaining_bytes: number;
171
+ capped: boolean;
172
+ }
173
+ export interface RechargeBandwidthRequest {
174
+ add_bytes: number;
175
+ }
176
+ export interface ResizeSandboxRequest {
177
+ disk_mib: number;
178
+ }
179
+ export interface ResizeSandboxResponse {
180
+ id: string;
181
+ disk_mib: number;
182
+ }
183
+ export interface DestroyedResponse {
184
+ id: string;
185
+ status: "destroying" | "destroyed";
186
+ }
187
+ export interface WhoAmIStatsView {
188
+ running: number;
189
+ paused: number;
190
+ other: number;
191
+ total: number;
192
+ }
193
+ export interface WhoAmIView {
194
+ user_id: string;
195
+ stats: WhoAmIStatsView;
196
+ }
197
+ export interface TemplateCreateRequest {
198
+ name: string;
199
+ dockerfile: string;
200
+ }
201
+ export type TemplateStatus = "pending" | "building" | "ready" | "failed";
202
+ export interface TemplateView {
203
+ id: string;
204
+ name: string;
205
+ base: string;
206
+ status: TemplateStatus;
207
+ ext4_size_bytes: number;
208
+ created_at: string;
209
+ built_at: string | null;
210
+ dockerfile?: string;
211
+ }
212
+ export interface TemplatesListResponse {
213
+ templates: TemplateView[];
214
+ }
215
+ export interface GetTemplateOptions extends RequestOptions {
216
+ include?: "dockerfile";
217
+ }
218
+ export interface TemplateLogEvent {
219
+ ts?: string;
220
+ level?: string;
221
+ line?: string;
222
+ [key: string]: unknown;
223
+ }
224
+ export interface GetTemplateLogsOptions extends RequestOptions {
225
+ attempt?: number;
226
+ limit?: number;
227
+ }
228
+ export interface NetworkCreateRequest {
229
+ name: string;
230
+ }
231
+ export interface NetworkMember {
232
+ sandbox_id: string;
233
+ status: string;
234
+ ip: string;
235
+ name: string;
236
+ }
237
+ export interface Network {
238
+ id: string;
239
+ name: string;
240
+ created_at: string;
241
+ member_count?: number;
242
+ members?: NetworkMember[];
243
+ }
244
+ export interface OKResponse {
245
+ ok: boolean;
246
+ }
247
+ export interface HealthzResponse {
248
+ up: boolean;
249
+ }
250
+ export interface ReadyzResponse {
251
+ ready: boolean;
252
+ }
253
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "fc-sandbox-sdk",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript SDK for the fc-spawn control plane API.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "pack:dry": "npm pack --dry-run",
22
+ "publish:check": "npm whoami && npm run pack:dry",
23
+ "prepublishOnly": "npm run test && npm run typecheck",
24
+ "publish:dry": "npm run publish:check && npm publish --dry-run",
25
+ "publish:npm": "npm run publish:check && npm publish",
26
+ "test": "npm run build && node --test tests/*.test.mjs",
27
+ "typecheck": "tsc -p tsconfig.json --noEmit"
28
+ },
29
+ "keywords": [
30
+ "fc-spawn",
31
+ "sandbox",
32
+ "sdk",
33
+ "compute"
34
+ ],
35
+ "license": "MIT",
36
+ "devDependencies": {
37
+ "typescript": "^5.8.3"
38
+ }
39
+ }