@finalai/computers 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.
Potentially problematic release.
This version of @finalai/computers might be problematic. Click here for more details.
- package/README.md +16 -0
- package/dist/modules/browser-access.d.mts +18 -0
- package/dist/modules/browser-access.mjs +22 -0
- package/dist/modules/browser-access.mjs.map +7 -0
- package/dist/modules/client.d.mts +5 -0
- package/dist/modules/client.mjs +764 -0
- package/dist/modules/client.mjs.map +7 -0
- package/dist/modules/file-snapshots.d.mts +69 -0
- package/dist/modules/file-snapshots.mjs +64 -0
- package/dist/modules/file-snapshots.mjs.map +7 -0
- package/dist/modules/index.d.mts +11 -0
- package/dist/modules/index.mjs +63 -0
- package/dist/modules/index.mjs.map +7 -0
- package/dist/modules/json.d.mts +5 -0
- package/dist/modules/json.mjs +8 -0
- package/dist/modules/json.mjs.map +7 -0
- package/dist/modules/normalize.d.mts +7 -0
- package/dist/modules/normalize.mjs +210 -0
- package/dist/modules/normalize.mjs.map +7 -0
- package/dist/modules/result.d.mts +13 -0
- package/dist/modules/result.mjs +14 -0
- package/dist/modules/result.mjs.map +7 -0
- package/dist/modules/screen.d.mts +41 -0
- package/dist/modules/screen.mjs +37 -0
- package/dist/modules/screen.mjs.map +7 -0
- package/dist/modules/shell.d.mts +1 -0
- package/dist/modules/shell.mjs +5 -0
- package/dist/modules/shell.mjs.map +7 -0
- package/dist/modules/transport-api.d.mts +2 -0
- package/dist/modules/transport-api.mjs +7 -0
- package/dist/modules/transport-api.mjs.map +7 -0
- package/dist/modules/transport.d.mts +15 -0
- package/dist/modules/transport.mjs +67 -0
- package/dist/modules/transport.mjs.map +7 -0
- package/dist/modules/types.d.mts +467 -0
- package/dist/modules/types.mjs +69 -0
- package/dist/modules/types.mjs.map +7 -0
- package/package.json +52 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/normalize.ts"],
|
|
4
|
+
"sourcesContent": ["import * as z from 'zod';\nimport { jsonObjectSchema, type JsonObject, type JsonValue } from \"./json.mjs\";\nimport {\n ComputerBaseState,\n ComputerImageSource,\n ComputerImageState,\n ComputerState,\n type ComputerBaseIface,\n type ComputerImageIface,\n type ComputerInfoIface,\n} from \"./types.mjs\";\n\n// Vendored (standalone package); canonical: shared/src/utils/guards.ts.\nexport const isRecord = <TValue>(value: TValue): value is TValue & JsonObject =>\n jsonObjectSchema.safeParse(value).success;\n\nconst stringAt = (row: JsonObject, ...keys: string[]): string | null => {\n for (const key of keys) {\n const value = row[key];\n if (typeof value === 'string') {\n return value;\n }\n }\n return null;\n};\n\nconst numberAt = (row: JsonObject, ...keys: string[]): number | null => {\n for (const key of keys) {\n const value = row[key];\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n }\n return null;\n};\n\nconst booleanAt = (row: JsonObject, ...keys: string[]): boolean | null => {\n for (const key of keys) {\n const value = row[key];\n if (typeof value === 'boolean') {\n return value;\n }\n }\n return null;\n};\n\nconst stringArrayAt = (row: JsonObject, ...keys: string[]): string[] => {\n for (const key of keys) {\n const value = row[key];\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === 'string');\n }\n }\n return [];\n};\n\nconst nullableRecordAt = (row: JsonObject, ...keys: string[]): JsonObject | null => {\n for (const key of keys) {\n const value = row[key];\n const parsed = jsonObjectSchema.safeParse(value);\n if (parsed.success) return parsed.data;\n }\n return null;\n};\n\nconst recordAt = (row: JsonObject, ...keys: string[]): JsonObject =>\n nullableRecordAt(row, ...keys) ?? {};\n\nconst safeIntegerSchema = z.number().int().refine(Number.isSafeInteger);\nconst checkpointTimestampSchema = z\n .union([\n safeIntegerSchema,\n z\n .string()\n .regex(/^-?\\d+$/)\n .transform(Number)\n .pipe(safeIntegerSchema),\n ])\n .nullish();\n\nconst COMPUTER_STATE_VALUES: readonly ComputerState[] = [\n ComputerState.Unknown,\n ComputerState.Pending,\n ComputerState.Creating,\n ComputerState.Running,\n ComputerState.Paused,\n ComputerState.Stopped,\n ComputerState.Resuming,\n ComputerState.Error,\n ComputerState.Deleted,\n ComputerState.Shelved,\n];\n\nconst toComputerState = (value: number): ComputerState =>\n COMPUTER_STATE_VALUES.find((state) => state === value) ?? ComputerState.Unknown;\n\nconst COMPUTER_STATE_NAMES = {\n [ComputerState.Unknown]: 'unknown',\n [ComputerState.Pending]: 'pending',\n [ComputerState.Creating]: 'creating',\n [ComputerState.Running]: 'running',\n [ComputerState.Paused]: 'paused',\n [ComputerState.Stopped]: 'stopped',\n [ComputerState.Resuming]: 'resuming',\n [ComputerState.Error]: 'error',\n [ComputerState.Deleted]: 'deleted',\n [ComputerState.Shelved]: 'shelved',\n} satisfies Record<ComputerState, string>;\n\n// Accepts either the /v1 camelCase wire shape or a raw /internal snake_case DB\n// row (Dates arrive as ISO strings after JSON serialization).\nexport const normalizeComputerInfo = (raw: JsonValue): ComputerInfoIface | null => {\n const parsed = jsonObjectSchema.safeParse(raw);\n if (!parsed.success) return null;\n const row = parsed.data;\n const id = stringAt(row, 'id');\n const name = stringAt(row, 'name');\n const state = numberAt(row, 'state');\n if (id == null || name == null || state == null) {\n return null;\n }\n const normalizedState = toComputerState(state);\n const checkpointTimestamp = checkpointTimestampSchema.safeParse(\n row.storage_checkpoint_completed_at_ms,\n );\n return {\n id,\n name,\n teamId: stringAt(row, 'teamId', 'team_id'),\n ownerUserId: stringAt(row, 'ownerUserId', 'owner_user_id'),\n state: normalizedState,\n stateName: stringAt(row, 'stateName', 'state_name') ?? COMPUTER_STATE_NAMES[normalizedState],\n desiredState: numberAt(row, 'desiredState', 'desired_state'),\n image: stringAt(row, 'image', 'image_ref'),\n imageVersionId: stringAt(row, 'imageVersionId', 'image_version_id'),\n regionSlug: stringAt(row, 'regionSlug'),\n vcpu: numberAt(row, 'vcpu'),\n memoryMb: numberAt(row, 'memoryMb', 'memory_mb'),\n diskGb: numberAt(row, 'diskGb', 'disk_gb'),\n httpPort: numberAt(row, 'httpPort', 'http_port'),\n httpPublic: booleanAt(row, 'httpPublic', 'http_public') ?? false,\n ephemeral: booleanAt(row, 'ephemeral') ?? false,\n idleTimeoutSeconds: numberAt(row, 'idleTimeoutSeconds', 'idle_timeout_seconds'),\n autoResume: booleanAt(row, 'autoResume', 'auto_resume') ?? true,\n tags: stringArrayAt(row, 'tags'),\n comment: stringAt(row, 'comment'),\n errorMessage: stringAt(row, 'errorMessage', 'error_message'),\n hostname: stringAt(row, 'hostname'),\n createdAt: stringAt(row, 'createdAt', 'created_at'),\n lastActiveAt: stringAt(row, 'lastActiveAt', 'last_active_at'),\n startupTimings: recordAt(row, 'startup_timings'),\n legacyBackupCheckpoint: nullableRecordAt(row, 'legacy_backup_checkpoint'),\n storageCheckpointCompletedAtMs: checkpointTimestamp.success\n ? (checkpointTimestamp.data ?? null)\n : null,\n };\n};\n\nconst IMAGE_STATE_VALUES: readonly ComputerImageState[] = [\n ComputerImageState.Pending,\n ComputerImageState.Building,\n ComputerImageState.Ready,\n ComputerImageState.Failed,\n ComputerImageState.Expired,\n];\n\n// /internal reports the stored integer state: 1 = pending ... 5 = expired.\nexport const imageStateCode = (state: ComputerImageState): number =>\n IMAGE_STATE_VALUES.indexOf(state) + 1;\n\nconst toImageState = (row: JsonObject): ComputerImageState | null => {\n const name = stringAt(row, 'state');\n const byName = IMAGE_STATE_VALUES.find((state) => state === name);\n if (byName != null) return byName;\n const code = numberAt(row, 'state');\n return code == null ? null : (IMAGE_STATE_VALUES[code - 1] ?? null);\n};\n\n// Accepts the /v1 image shape or the /internal image version shape.\nexport const normalizeComputerImage = (raw: JsonValue): ComputerImageIface | null => {\n const parsed = jsonObjectSchema.safeParse(raw);\n if (!parsed.success) return null;\n const row = parsed.data;\n const id = stringAt(row, 'id');\n const reference = stringAt(row, 'reference');\n const digest = stringAt(row, 'digest', 'imageDigest');\n const state = toImageState(row);\n if (id == null || reference == null || digest == null || state == null) {\n return null;\n }\n // /internal reports 1 = platform, 2 = customer.\n const source =\n stringAt(row, 'source') === ComputerImageSource.Platform || numberAt(row, 'source') === 1\n ? ComputerImageSource.Platform\n : ComputerImageSource.Customer;\n return {\n id,\n source,\n reference,\n lineage: stringAt(row, 'lineage') ?? reference,\n digest,\n state,\n error: stringAt(row, 'error'),\n sizes: stringArrayAt(row, 'sizes'),\n registryCredentialId: stringAt(row, 'registryCredentialId'),\n createdAt: stringAt(row, 'createdAt'),\n readyAt: stringAt(row, 'readyAt'),\n lastUsedAt: stringAt(row, 'lastUsedAt'),\n };\n};\n\nconst BASE_STATE_VALUES: readonly ComputerBaseState[] = [\n ComputerBaseState.Capturing,\n ComputerBaseState.Ready,\n ComputerBaseState.Failed,\n ComputerBaseState.Expired,\n];\n\n// The /v1 base shape (GET /v1/bases/:id).\nexport const normalizeComputerBase = (raw: JsonValue): ComputerBaseIface | null => {\n const parsed = jsonObjectSchema.safeParse(raw);\n if (!parsed.success) return null;\n const row = parsed.data;\n const id = stringAt(row, 'id');\n const stateName = stringAt(row, 'state');\n const state = BASE_STATE_VALUES.find((value) => value === stateName);\n const image = stringAt(row, 'image');\n const digest = stringAt(row, 'digest');\n if (id == null || state == null || image == null || digest == null) {\n return null;\n }\n return {\n id,\n state,\n error: stringAt(row, 'error'),\n computerId: stringAt(row, 'computerId'),\n image,\n digest,\n diskGb: numberAt(row, 'diskGb'),\n createdAt: stringAt(row, 'createdAt'),\n readyAt: stringAt(row, 'readyAt'),\n lastUsedAt: stringAt(row, 'lastUsedAt'),\n retained: row.retained === true,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface OkResultIface<T> {
|
|
2
|
+
ok: true;
|
|
3
|
+
data: T;
|
|
4
|
+
}
|
|
5
|
+
export interface ErrResultIface {
|
|
6
|
+
ok: false;
|
|
7
|
+
error: string;
|
|
8
|
+
statusCode?: number;
|
|
9
|
+
}
|
|
10
|
+
export type ResultIface<T> = OkResultIface<T> | ErrResultIface;
|
|
11
|
+
export declare const ok: <T>(data: T) => OkResultIface<T>;
|
|
12
|
+
export declare const err: (error: string, statusCode?: number) => ErrResultIface;
|
|
13
|
+
export declare const orThrow: <T>(result: ResultIface<T>) => T;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const ok = (data) => ({ ok: true, data });
|
|
2
|
+
const err = (error, statusCode) => statusCode == null ? { ok: false, error } : { ok: false, error, statusCode };
|
|
3
|
+
const orThrow = (result) => {
|
|
4
|
+
if (!result.ok) {
|
|
5
|
+
throw new Error(result.error);
|
|
6
|
+
}
|
|
7
|
+
return result.data;
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
err,
|
|
11
|
+
ok,
|
|
12
|
+
orThrow
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=result.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/result.ts"],
|
|
4
|
+
"sourcesContent": ["// Local Result type \u2014 this package is standalone-publishable and must not\n// import @shared. Canonical shape: shared/src/utils/result.ts.\n\nexport interface OkResultIface<T> {\n ok: true;\n data: T;\n}\n\nexport interface ErrResultIface {\n ok: false;\n error: string;\n statusCode?: number;\n}\n\nexport type ResultIface<T> = OkResultIface<T> | ErrResultIface;\n\nexport const ok = <T>(data: T): OkResultIface<T> => ({ ok: true, data });\n\nexport const err = (error: string, statusCode?: number): ErrResultIface =>\n statusCode == null ? { ok: false, error } : { ok: false, error, statusCode };\n\nexport const orThrow = <T>(result: ResultIface<T>): T => {\n if (!result.ok) {\n throw new Error(result.error);\n }\n return result.data;\n};\n"],
|
|
5
|
+
"mappings": "AAgBO,MAAM,KAAK,CAAI,UAA+B,EAAE,IAAI,MAAM,KAAK;AAE/D,MAAM,MAAM,CAAC,OAAe,eACjC,cAAc,OAAO,EAAE,IAAI,OAAO,MAAM,IAAI,EAAE,IAAI,OAAO,OAAO,WAAW;AAEtE,MAAM,UAAU,CAAI,WAA8B;AACvD,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,OAAO,KAAK;AAAA,EAC9B;AACA,SAAO,OAAO;AAChB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export declare enum ComputerScreenQuality {
|
|
3
|
+
Balanced = "balanced",
|
|
4
|
+
Sharp = "sharp"
|
|
5
|
+
}
|
|
6
|
+
export declare const computerScreenOpenSchema: z.ZodObject<{
|
|
7
|
+
viewOnly: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
displayId: z.ZodOptional<z.ZodString>;
|
|
9
|
+
quality: z.ZodDefault<z.ZodEnum<typeof ComputerScreenQuality>>;
|
|
10
|
+
forceRelay: z.ZodDefault<z.ZodBoolean>;
|
|
11
|
+
}, z.core.$strict>;
|
|
12
|
+
export interface ComputerScreenOpenOptionsIface {
|
|
13
|
+
viewOnly?: boolean;
|
|
14
|
+
displayId?: string;
|
|
15
|
+
quality?: ComputerScreenQuality;
|
|
16
|
+
forceRelay?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const computerScreenIceServerSchema: z.ZodObject<{
|
|
19
|
+
urls: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
20
|
+
username: z.ZodOptional<z.ZodString>;
|
|
21
|
+
credential: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export declare const computerScreenSessionSchema: z.ZodObject<{
|
|
24
|
+
url: z.ZodString;
|
|
25
|
+
token: z.ZodString;
|
|
26
|
+
expiresAt: z.ZodString;
|
|
27
|
+
computerId: z.ZodString;
|
|
28
|
+
sessionId: z.ZodString;
|
|
29
|
+
accessSessionId: z.ZodString;
|
|
30
|
+
viewOnly: z.ZodBoolean;
|
|
31
|
+
quality: z.ZodOptional<z.ZodEnum<typeof ComputerScreenQuality>>;
|
|
32
|
+
forceRelay: z.ZodDefault<z.ZodBoolean>;
|
|
33
|
+
displayId: z.ZodOptional<z.ZodString>;
|
|
34
|
+
iceServers: z.ZodArray<z.ZodObject<{
|
|
35
|
+
urls: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
36
|
+
username: z.ZodOptional<z.ZodString>;
|
|
37
|
+
credential: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type ComputerScreenIceServerIface = z.infer<typeof computerScreenIceServerSchema>;
|
|
41
|
+
export type ComputerScreenSessionIface = z.infer<typeof computerScreenSessionSchema>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
var ComputerScreenQuality = /* @__PURE__ */ ((ComputerScreenQuality2) => {
|
|
3
|
+
ComputerScreenQuality2["Balanced"] = "balanced";
|
|
4
|
+
ComputerScreenQuality2["Sharp"] = "sharp";
|
|
5
|
+
return ComputerScreenQuality2;
|
|
6
|
+
})(ComputerScreenQuality || {});
|
|
7
|
+
const computerScreenOpenSchema = z.strictObject({
|
|
8
|
+
viewOnly: z.boolean().default(true),
|
|
9
|
+
displayId: z.string().min(1).max(256).optional(),
|
|
10
|
+
quality: z.nativeEnum(ComputerScreenQuality).default("sharp" /* Sharp */),
|
|
11
|
+
forceRelay: z.boolean().default(false)
|
|
12
|
+
});
|
|
13
|
+
const computerScreenIceServerSchema = z.object({
|
|
14
|
+
urls: z.union([z.string().min(1), z.array(z.string().min(1)).min(1)]),
|
|
15
|
+
username: z.string().optional(),
|
|
16
|
+
credential: z.string().optional()
|
|
17
|
+
});
|
|
18
|
+
const computerScreenSessionSchema = z.object({
|
|
19
|
+
url: z.string().url(),
|
|
20
|
+
token: z.string().min(1),
|
|
21
|
+
expiresAt: z.string(),
|
|
22
|
+
computerId: z.string().min(1),
|
|
23
|
+
sessionId: z.string().min(1),
|
|
24
|
+
accessSessionId: z.string().min(1),
|
|
25
|
+
viewOnly: z.boolean(),
|
|
26
|
+
quality: z.nativeEnum(ComputerScreenQuality).optional(),
|
|
27
|
+
forceRelay: z.boolean().default(false),
|
|
28
|
+
displayId: z.string().optional(),
|
|
29
|
+
iceServers: z.array(computerScreenIceServerSchema)
|
|
30
|
+
});
|
|
31
|
+
export {
|
|
32
|
+
ComputerScreenQuality,
|
|
33
|
+
computerScreenIceServerSchema,
|
|
34
|
+
computerScreenOpenSchema,
|
|
35
|
+
computerScreenSessionSchema
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=screen.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/screen.ts"],
|
|
4
|
+
"sourcesContent": ["import * as z from 'zod';\n\nexport enum ComputerScreenQuality {\n Balanced = 'balanced',\n Sharp = 'sharp',\n}\n\nexport const computerScreenOpenSchema = z.strictObject({\n viewOnly: z.boolean().default(true),\n displayId: z.string().min(1).max(256).optional(),\n quality: z.nativeEnum(ComputerScreenQuality).default(ComputerScreenQuality.Sharp),\n forceRelay: z.boolean().default(false),\n});\n\nexport interface ComputerScreenOpenOptionsIface {\n viewOnly?: boolean;\n displayId?: string;\n quality?: ComputerScreenQuality;\n forceRelay?: boolean;\n}\n\nexport const computerScreenIceServerSchema = z.object({\n urls: z.union([z.string().min(1), z.array(z.string().min(1)).min(1)]),\n username: z.string().optional(),\n credential: z.string().optional(),\n});\n\nexport const computerScreenSessionSchema = z.object({\n url: z.string().url(),\n token: z.string().min(1),\n expiresAt: z.string(),\n computerId: z.string().min(1),\n sessionId: z.string().min(1),\n accessSessionId: z.string().min(1),\n viewOnly: z.boolean(),\n quality: z.nativeEnum(ComputerScreenQuality).optional(),\n forceRelay: z.boolean().default(false),\n displayId: z.string().optional(),\n iceServers: z.array(computerScreenIceServerSchema),\n});\n\nexport type ComputerScreenIceServerIface = z.infer<typeof computerScreenIceServerSchema>;\nexport type ComputerScreenSessionIface = z.infer<typeof computerScreenSessionSchema>;\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,OAAO;AAEZ,IAAK,wBAAL,kBAAKA,2BAAL;AACL,EAAAA,uBAAA,cAAW;AACX,EAAAA,uBAAA,WAAQ;AAFE,SAAAA;AAAA,GAAA;AAKL,MAAM,2BAA2B,EAAE,aAAa;AAAA,EACrD,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAClC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC/C,SAAS,EAAE,WAAW,qBAAqB,EAAE,QAAQ,mBAA2B;AAAA,EAChF,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACvC,CAAC;AASM,MAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EACpE,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC;AAEM,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,KAAK,EAAE,OAAO,EAAE,IAAI;AAAA,EACpB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,WAAW,EAAE,OAAO;AAAA,EACpB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,UAAU,EAAE,QAAQ;AAAA,EACpB,SAAS,EAAE,WAAW,qBAAqB,EAAE,SAAS;AAAA,EACtD,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACrC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,MAAM,6BAA6B;AACnD,CAAC;",
|
|
6
|
+
"names": ["ComputerScreenQuality"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const quoteShellArgument: (value: string) => string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/shell.ts"],
|
|
4
|
+
"sourcesContent": ["// Fish treats backslashes inside single quotes differently from POSIX shells.\n// Keep them in double-quoted fragments so both shells preserve the same argument.\nexport const quoteShellArgument = (value: string): string =>\n value\n .split('\\\\')\n .map((part) => `'${part.replaceAll(\"'\", `'\\\\''`)}'`)\n .join('\"\\\\\\\\\"');\n"],
|
|
5
|
+
"mappings": "AAEO,MAAM,qBAAqB,CAAC,UACjC,MACG,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,IAAI,KAAK,WAAW,KAAK,OAAO,CAAC,GAAG,EAClD,KAAK,QAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/transport-api.ts"],
|
|
4
|
+
"sourcesContent": ["export { createComputerClientWithTransport, createComputerHandle } from \"./client.mjs\";\nexport * from \"./transport.mjs\";\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,mCAAmC,4BAA4B;AACxE,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ResultIface } from "./result.mjs";
|
|
2
|
+
import { type JsonValue } from "./json.mjs";
|
|
3
|
+
import type { CreateComputerClientArgsIface } from "./types.mjs";
|
|
4
|
+
export interface TransportRequestArgsIface {
|
|
5
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
6
|
+
path: string;
|
|
7
|
+
query?: Record<string, string>;
|
|
8
|
+
jsonBody?: object;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
}
|
|
12
|
+
export interface TransportIface {
|
|
13
|
+
request: (args: TransportRequestArgsIface) => Promise<ResultIface<JsonValue>>;
|
|
14
|
+
}
|
|
15
|
+
export declare const createTransport: (args: CreateComputerClientArgsIface) => TransportIface;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { err, ok } from "./result.mjs";
|
|
2
|
+
import { jsonObjectSchema, jsonValueSchema } from "./json.mjs";
|
|
3
|
+
const trimTrailingSlash = (url) => url.replace(/\/+$/, "");
|
|
4
|
+
const createTransport = (args) => {
|
|
5
|
+
const baseUrl = trimTrailingSlash(args.baseUrl);
|
|
6
|
+
const doFetch = args.fetch ?? globalThis.fetch;
|
|
7
|
+
const request = async (req) => {
|
|
8
|
+
let status;
|
|
9
|
+
let respOk;
|
|
10
|
+
let text;
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(`${baseUrl}/v1${req.path}`);
|
|
13
|
+
for (const [key, value] of Object.entries(req.query ?? {})) {
|
|
14
|
+
url.searchParams.set(key, value);
|
|
15
|
+
}
|
|
16
|
+
const headers = new Headers({ authorization: `Bearer ${args.auth.apiKey}` });
|
|
17
|
+
for (const [name, value] of Object.entries(req.headers ?? {})) headers.set(name, value);
|
|
18
|
+
let body;
|
|
19
|
+
if (req.jsonBody !== void 0) {
|
|
20
|
+
headers.set("content-type", "application/json");
|
|
21
|
+
body = JSON.stringify(req.jsonBody);
|
|
22
|
+
}
|
|
23
|
+
const resp = await doFetch(url.toString(), {
|
|
24
|
+
method: req.method,
|
|
25
|
+
headers,
|
|
26
|
+
body,
|
|
27
|
+
signal: (() => {
|
|
28
|
+
const signals = [
|
|
29
|
+
args.signal,
|
|
30
|
+
req.signal,
|
|
31
|
+
args.requestTimeoutMs == null ? void 0 : AbortSignal.timeout(args.requestTimeoutMs)
|
|
32
|
+
].filter((signal) => signal != null);
|
|
33
|
+
return signals.length === 0 ? void 0 : AbortSignal.any(signals);
|
|
34
|
+
})()
|
|
35
|
+
});
|
|
36
|
+
status = resp.status;
|
|
37
|
+
respOk = resp.ok;
|
|
38
|
+
text = await resp.text();
|
|
39
|
+
} catch (e) {
|
|
40
|
+
return err(`request failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
41
|
+
}
|
|
42
|
+
let parsed = null;
|
|
43
|
+
if (text.length > 0) {
|
|
44
|
+
try {
|
|
45
|
+
parsed = jsonValueSchema.parse(JSON.parse(text));
|
|
46
|
+
} catch {
|
|
47
|
+
if (respOk) {
|
|
48
|
+
return err(`invalid JSON response (status ${status}): ${text.slice(0, 200)}`);
|
|
49
|
+
}
|
|
50
|
+
return err(`request failed (status ${status}): ${text.slice(0, 200)}`, status);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!respOk) {
|
|
54
|
+
const errorBody = jsonObjectSchema.safeParse(parsed);
|
|
55
|
+
const message = errorBody.success && typeof errorBody.data.error === "string" ? errorBody.data.error : `request failed (status ${status})`;
|
|
56
|
+
return err(message, status);
|
|
57
|
+
}
|
|
58
|
+
return ok(parsed);
|
|
59
|
+
};
|
|
60
|
+
return {
|
|
61
|
+
request
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export {
|
|
65
|
+
createTransport
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=transport.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/transport.ts"],
|
|
4
|
+
"sourcesContent": ["import { err, ok, type ResultIface } from \"./result.mjs\";\nimport { jsonObjectSchema, jsonValueSchema, type JsonValue } from \"./json.mjs\";\nimport type { CreateComputerClientArgsIface } from \"./types.mjs\";\n\nexport interface TransportRequestArgsIface {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: Record<string, string>;\n jsonBody?: object;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport interface TransportIface {\n request: (args: TransportRequestArgsIface) => Promise<ResultIface<JsonValue>>;\n}\n\nconst trimTrailingSlash = (url: string): string => url.replace(/\\/+$/, '');\n\nexport const createTransport = (args: CreateComputerClientArgsIface): TransportIface => {\n const baseUrl = trimTrailingSlash(args.baseUrl);\n const doFetch = args.fetch ?? globalThis.fetch;\n const request = async (req: TransportRequestArgsIface): Promise<ResultIface<JsonValue>> => {\n let status: number;\n let respOk: boolean;\n let text: string;\n try {\n const url = new URL(`${baseUrl}/v1${req.path}`);\n for (const [key, value] of Object.entries(req.query ?? {})) {\n url.searchParams.set(key, value);\n }\n const headers = new Headers({ authorization: `Bearer ${args.auth.apiKey}` });\n for (const [name, value] of Object.entries(req.headers ?? {})) headers.set(name, value);\n let body: string | undefined;\n if (req.jsonBody !== undefined) {\n headers.set('content-type', 'application/json');\n body = JSON.stringify(req.jsonBody);\n }\n const resp = await doFetch(url.toString(), {\n method: req.method,\n headers,\n body,\n signal: (() => {\n const signals = [\n args.signal,\n req.signal,\n args.requestTimeoutMs == null ? undefined : AbortSignal.timeout(args.requestTimeoutMs),\n ].filter((signal): signal is AbortSignal => signal != null);\n return signals.length === 0 ? undefined : AbortSignal.any(signals);\n })(),\n });\n status = resp.status;\n respOk = resp.ok;\n text = await resp.text();\n } catch (e) {\n return err(`request failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n let parsed: JsonValue = null;\n if (text.length > 0) {\n try {\n parsed = jsonValueSchema.parse(JSON.parse(text));\n } catch {\n if (respOk) {\n return err(`invalid JSON response (status ${status}): ${text.slice(0, 200)}`);\n }\n return err(`request failed (status ${status}): ${text.slice(0, 200)}`, status);\n }\n }\n if (!respOk) {\n const errorBody = jsonObjectSchema.safeParse(parsed);\n const message =\n errorBody.success && typeof errorBody.data.error === 'string'\n ? errorBody.data.error\n : `request failed (status ${status})`;\n return err(message, status);\n }\n return ok(parsed);\n };\n\n return {\n request,\n };\n};\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,KAAK,UAA4B;AAC1C,SAAS,kBAAkB,uBAAuC;AAgBlE,MAAM,oBAAoB,CAAC,QAAwB,IAAI,QAAQ,QAAQ,EAAE;AAElE,MAAM,kBAAkB,CAAC,SAAwD;AACtF,QAAM,UAAU,kBAAkB,KAAK,OAAO;AAC9C,QAAM,UAAU,KAAK,SAAS,WAAW;AACzC,QAAM,UAAU,OAAO,QAAoE;AACzF,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,GAAG,OAAO,MAAM,IAAI,IAAI,EAAE;AAC9C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,SAAS,CAAC,CAAC,GAAG;AAC1D,YAAI,aAAa,IAAI,KAAK,KAAK;AAAA,MACjC;AACA,YAAM,UAAU,IAAI,QAAQ,EAAE,eAAe,UAAU,KAAK,KAAK,MAAM,GAAG,CAAC;AAC3E,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,WAAW,CAAC,CAAC,EAAG,SAAQ,IAAI,MAAM,KAAK;AACtF,UAAI;AACJ,UAAI,IAAI,aAAa,QAAW;AAC9B,gBAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,eAAO,KAAK,UAAU,IAAI,QAAQ;AAAA,MACpC;AACA,YAAM,OAAO,MAAM,QAAQ,IAAI,SAAS,GAAG;AAAA,QACzC,QAAQ,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AACb,gBAAM,UAAU;AAAA,YACd,KAAK;AAAA,YACL,IAAI;AAAA,YACJ,KAAK,oBAAoB,OAAO,SAAY,YAAY,QAAQ,KAAK,gBAAgB;AAAA,UACvF,EAAE,OAAO,CAAC,WAAkC,UAAU,IAAI;AAC1D,iBAAO,QAAQ,WAAW,IAAI,SAAY,YAAY,IAAI,OAAO;AAAA,QACnE,GAAG;AAAA,MACL,CAAC;AACD,eAAS,KAAK;AACd,eAAS,KAAK;AACd,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB,SAAS,GAAG;AACV,aAAO,IAAI,mBAAmB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IAC5E;AACA,QAAI,SAAoB;AACxB,QAAI,KAAK,SAAS,GAAG;AACnB,UAAI;AACF,iBAAS,gBAAgB,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,MACjD,QAAQ;AACN,YAAI,QAAQ;AACV,iBAAO,IAAI,iCAAiC,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,QAC9E;AACA,eAAO,IAAI,0BAA0B,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,MAAM;AAAA,MAC/E;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,YAAM,YAAY,iBAAiB,UAAU,MAAM;AACnD,YAAM,UACJ,UAAU,WAAW,OAAO,UAAU,KAAK,UAAU,WACjD,UAAU,KAAK,QACf,0BAA0B,MAAM;AACtC,aAAO,IAAI,SAAS,MAAM;AAAA,IAC5B;AACA,WAAO,GAAG,MAAM;AAAA,EAClB;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|