@oleanderhq/sdk 0.1.1 → 0.2.1
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/README.md +1 -1
- package/dist/index.cjs +76 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +84 -18
- package/dist/index.d.ts +84 -18
- package/dist/index.js +76 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ Run a SQL query against the oleander lake. The second parameter is optional; `sa
|
|
|
32
32
|
|
|
33
33
|
```ts
|
|
34
34
|
const result = await oleander.query(
|
|
35
|
-
"SELECT * FROM
|
|
35
|
+
"SELECT * FROM oleander.default.flowers LIMIT 10",
|
|
36
36
|
);
|
|
37
37
|
console.log(result.results?.columns, result.results?.rows);
|
|
38
38
|
console.log(result.row_count, result.execution_time);
|
package/dist/index.cjs
CHANGED
|
@@ -76,6 +76,11 @@ var listSparkJobsResultSchema = import_zod.z.object({
|
|
|
76
76
|
scripts: import_zod.z.array(import_zod.z.string()),
|
|
77
77
|
hasMore: import_zod.z.boolean()
|
|
78
78
|
});
|
|
79
|
+
var sparkClusterTypeSchema = import_zod.z.enum([
|
|
80
|
+
"oleander",
|
|
81
|
+
"emr-serverless",
|
|
82
|
+
"glue"
|
|
83
|
+
]);
|
|
79
84
|
var sparkMachineTypeSchema = import_zod.z.enum([
|
|
80
85
|
"spark.1.c",
|
|
81
86
|
"spark.2.c",
|
|
@@ -93,16 +98,34 @@ var sparkMachineTypeSchema = import_zod.z.enum([
|
|
|
93
98
|
"spark.8.m",
|
|
94
99
|
"spark.16.m"
|
|
95
100
|
]);
|
|
101
|
+
var glueWorkerTypeSchema = import_zod.z.enum([
|
|
102
|
+
"G.1X",
|
|
103
|
+
"G.2X",
|
|
104
|
+
"G.4X",
|
|
105
|
+
"G.8X",
|
|
106
|
+
"G.025X"
|
|
107
|
+
]);
|
|
96
108
|
var submitOptionsSchema = import_zod.z.object({
|
|
109
|
+
cluster: sparkClusterTypeSchema.default("oleander"),
|
|
97
110
|
namespace: import_zod.z.string().min(1, "namespace is required"),
|
|
98
111
|
name: import_zod.z.string().min(1, "name is required"),
|
|
99
|
-
scriptName: import_zod.z.string().min(1, "scriptName is required"),
|
|
100
112
|
args: import_zod.z.array(import_zod.z.string()).default([]),
|
|
113
|
+
entrypoint: import_zod.z.string().min(1, "entrypoint is required"),
|
|
114
|
+
pyFiles: import_zod.z.string().optional(),
|
|
115
|
+
mainClass: import_zod.z.string().optional(),
|
|
116
|
+
sparkConf: import_zod.z.array(import_zod.z.string()).default([]),
|
|
117
|
+
packages: import_zod.z.array(import_zod.z.string()).default([]),
|
|
118
|
+
executionIamPolicy: import_zod.z.string().optional(),
|
|
119
|
+
jobTags: import_zod.z.array(import_zod.z.string()).default([]),
|
|
120
|
+
runTags: import_zod.z.array(import_zod.z.string()).default([]),
|
|
101
121
|
driverMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
102
122
|
executorMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
103
123
|
executorNumbers: import_zod.z.number().int().min(1).max(20).default(2),
|
|
104
|
-
|
|
105
|
-
|
|
124
|
+
workerType: glueWorkerTypeSchema.optional(),
|
|
125
|
+
numberOfWorkers: import_zod.z.number().int().min(1).default(1),
|
|
126
|
+
enableAutoScaling: import_zod.z.boolean().optional(),
|
|
127
|
+
timeoutMinutes: import_zod.z.number().int().optional(),
|
|
128
|
+
executionClass: import_zod.z.string().optional()
|
|
106
129
|
});
|
|
107
130
|
var submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({
|
|
108
131
|
pollIntervalMs: import_zod.z.number().int().positive().default(1e4),
|
|
@@ -235,19 +258,62 @@ var Oleander = class {
|
|
|
235
258
|
*/
|
|
236
259
|
async submitSparkJob(options) {
|
|
237
260
|
const opts = submitOptionsSchema.parse(options);
|
|
238
|
-
const
|
|
261
|
+
const buildGlueArguments = (args) => {
|
|
262
|
+
const result = {};
|
|
263
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
264
|
+
const key = args[i];
|
|
265
|
+
const value = args[i + 1];
|
|
266
|
+
if (value === void 0) {
|
|
267
|
+
throw new Error(`Missing value for argument: ${key}`);
|
|
268
|
+
}
|
|
269
|
+
result[key] = value;
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
};
|
|
273
|
+
let properties;
|
|
274
|
+
if (opts.cluster === "oleander") {
|
|
275
|
+
properties = {
|
|
276
|
+
entrypoint: opts.entrypoint,
|
|
277
|
+
entrypointArguments: opts.args,
|
|
278
|
+
driverMachineType: opts.driverMachineType,
|
|
279
|
+
executorMachineType: opts.executorMachineType,
|
|
280
|
+
executorNumbers: opts.executorNumbers,
|
|
281
|
+
sparkConf: opts.sparkConf,
|
|
282
|
+
packages: opts.packages
|
|
283
|
+
};
|
|
284
|
+
} else if (opts.cluster === "emr-serverless") {
|
|
285
|
+
properties = {
|
|
286
|
+
entrypoint: opts.entrypoint,
|
|
287
|
+
entrypointArguments: opts.args,
|
|
288
|
+
pyFiles: opts.pyFiles,
|
|
289
|
+
mainClass: opts.mainClass,
|
|
290
|
+
sparkConf: opts.sparkConf,
|
|
291
|
+
packages: opts.packages,
|
|
292
|
+
executionIamPolicy: opts.executionIamPolicy
|
|
293
|
+
};
|
|
294
|
+
} else if (opts.cluster === "glue") {
|
|
295
|
+
properties = {
|
|
296
|
+
jobName: opts.entrypoint,
|
|
297
|
+
entrypointArguments: buildGlueArguments(opts.args),
|
|
298
|
+
sparkConf: opts.sparkConf,
|
|
299
|
+
workerType: opts.workerType,
|
|
300
|
+
numberOfWorkers: opts.numberOfWorkers,
|
|
301
|
+
enableAutoScaling: opts.enableAutoScaling,
|
|
302
|
+
timeoutMinutes: opts.timeoutMinutes,
|
|
303
|
+
executionClass: opts.executionClass,
|
|
304
|
+
executionRoleSessionPolicy: opts.executionIamPolicy
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {
|
|
239
308
|
method: "POST",
|
|
240
309
|
headers: getHeaders(this.apiKey),
|
|
241
310
|
body: JSON.stringify({
|
|
311
|
+
cluster: opts.cluster,
|
|
242
312
|
namespace: opts.namespace.trim(),
|
|
243
313
|
name: opts.name.trim(),
|
|
244
|
-
scriptName: opts.scriptName.trim(),
|
|
245
|
-
arguments: opts.args,
|
|
246
|
-
driverMachineType: opts.driverMachineType,
|
|
247
|
-
executorMachineType: opts.executorMachineType,
|
|
248
|
-
executorNumbers: opts.executorNumbers,
|
|
249
314
|
jobTags: opts.jobTags,
|
|
250
|
-
runTags: opts.runTags
|
|
315
|
+
runTags: opts.runTags,
|
|
316
|
+
properties
|
|
251
317
|
})
|
|
252
318
|
});
|
|
253
319
|
const raw = await res.json().catch(() => ({}));
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/client.ts"],"sourcesContent":["export { Oleander } from \"./client.js\";\nexport type { OleanderOptions } from \"./schemas.js\";\nexport type {\n QueryOptions,\n LakeQueryResult,\n ApiErrorBody,\n SparkJobListPage,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkMachineType,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\nexport {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n listSparkJobsResultSchema,\n sparkMachineTypeSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\n","import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n scriptName: z.string().min(1, \"scriptName is required\"),\n args: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n scriptName: opts.scriptName.trim(),\n arguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/client.ts"],"sourcesContent":["export { Oleander } from \"./client.js\";\nexport type { OleanderOptions } from \"./schemas.js\";\nexport type {\n QueryOptions,\n LakeQueryResult,\n ApiErrorBody,\n SparkJobListPage,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkMachineType,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\nexport {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n listSparkJobsResultSchema,\n sparkMachineTypeSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\n","import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark cluster type enum */\nexport const sparkClusterTypeSchema = z.enum([\n \"oleander\",\n \"emr-serverless\",\n \"glue\",\n]);\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\n/** Glue worker type enum */\nexport const glueWorkerTypeSchema = z.enum([\n \"G.1X\",\n \"G.2X\",\n \"G.4X\",\n \"G.8X\",\n \"G.025X\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n cluster: sparkClusterTypeSchema.default(\"oleander\"),\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n args: z.array(z.string()).default([]),\n entrypoint: z.string().min(1, \"entrypoint is required\"),\n pyFiles: z.string().optional(),\n mainClass: z.string().optional(),\n sparkConf: z.array(z.string()).default([]),\n packages: z.array(z.string()).default([]),\n executionIamPolicy: z.string().optional(),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n workerType: glueWorkerTypeSchema.optional(),\n numberOfWorkers: z.number().int().min(1).default(1),\n enableAutoScaling: z.boolean().optional(),\n timeoutMinutes: z.number().int().optional(),\n executionClass: z.string().optional(),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const buildGlueArguments = (args: string[]): Record<string, string> => {\n const result: Record<string, string> = {};\n for (let i = 0; i < args.length; i += 2) {\n const key = args[i];\n const value = args[i + 1];\n if (value === undefined) {\n throw new Error(`Missing value for argument: ${key}`);\n }\n result[key] = value;\n }\n return result;\n };\n\n let properties: any;\n if (opts.cluster === \"oleander\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n sparkConf: opts.sparkConf,\n packages: opts.packages,\n };\n } else if (opts.cluster === \"emr-serverless\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n pyFiles: opts.pyFiles,\n mainClass: opts.mainClass,\n sparkConf: opts.sparkConf,\n packages: opts.packages,\n executionIamPolicy: opts.executionIamPolicy,\n };\n } else if (opts.cluster === \"glue\") {\n properties = {\n jobName: opts.entrypoint,\n entrypointArguments: buildGlueArguments(opts.args),\n sparkConf: opts.sparkConf,\n workerType: opts.workerType,\n numberOfWorkers: opts.numberOfWorkers,\n enableAutoScaling: opts.enableAutoScaling,\n timeoutMinutes: opts.timeoutMinutes,\n executionClass: opts.executionClass,\n executionRoleSessionPolicy: opts.executionIamPolicy,\n };\n }\n\n const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n cluster: opts.cluster,\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n properties: properties,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -124,73 +124,139 @@ declare const sparkMachineTypeSchema: z.ZodEnum<["spark.1.c", "spark.2.c", "spar
|
|
|
124
124
|
type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;
|
|
125
125
|
/** Spark job submit options. Optional fields have defaults. */
|
|
126
126
|
declare const submitOptionsSchema: z.ZodObject<{
|
|
127
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
127
128
|
namespace: z.ZodString;
|
|
128
129
|
name: z.ZodString;
|
|
129
|
-
scriptName: z.ZodString;
|
|
130
130
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
|
+
entrypoint: z.ZodString;
|
|
132
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
133
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
134
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
135
|
+
packages: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
136
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
137
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
138
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
139
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
132
140
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
133
141
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
134
|
-
|
|
135
|
-
|
|
142
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
143
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
144
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
145
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
146
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
136
147
|
}, "strip", z.ZodTypeAny, {
|
|
148
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
137
149
|
namespace: string;
|
|
138
150
|
name: string;
|
|
139
|
-
scriptName: string;
|
|
140
151
|
args: string[];
|
|
152
|
+
entrypoint: string;
|
|
153
|
+
sparkConf: string[];
|
|
154
|
+
packages: string[];
|
|
155
|
+
jobTags: string[];
|
|
156
|
+
runTags: string[];
|
|
141
157
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
142
158
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
143
159
|
executorNumbers: number;
|
|
144
|
-
|
|
145
|
-
|
|
160
|
+
numberOfWorkers: number;
|
|
161
|
+
pyFiles?: string | undefined;
|
|
162
|
+
mainClass?: string | undefined;
|
|
163
|
+
executionIamPolicy?: string | undefined;
|
|
164
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
165
|
+
enableAutoScaling?: boolean | undefined;
|
|
166
|
+
timeoutMinutes?: number | undefined;
|
|
167
|
+
executionClass?: string | undefined;
|
|
146
168
|
}, {
|
|
147
169
|
namespace: string;
|
|
148
170
|
name: string;
|
|
149
|
-
|
|
171
|
+
entrypoint: string;
|
|
172
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
150
173
|
args?: string[] | undefined;
|
|
174
|
+
pyFiles?: string | undefined;
|
|
175
|
+
mainClass?: string | undefined;
|
|
176
|
+
sparkConf?: string[] | undefined;
|
|
177
|
+
packages?: string[] | undefined;
|
|
178
|
+
executionIamPolicy?: string | undefined;
|
|
179
|
+
jobTags?: string[] | undefined;
|
|
180
|
+
runTags?: string[] | undefined;
|
|
151
181
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
152
182
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
153
183
|
executorNumbers?: number | undefined;
|
|
154
|
-
|
|
155
|
-
|
|
184
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
185
|
+
numberOfWorkers?: number | undefined;
|
|
186
|
+
enableAutoScaling?: boolean | undefined;
|
|
187
|
+
timeoutMinutes?: number | undefined;
|
|
188
|
+
executionClass?: string | undefined;
|
|
156
189
|
}>;
|
|
157
190
|
type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;
|
|
158
191
|
/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */
|
|
159
192
|
declare const submitSparkJobAndWaitOptionsSchema: z.ZodObject<{
|
|
193
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
160
194
|
namespace: z.ZodString;
|
|
161
195
|
name: z.ZodString;
|
|
162
|
-
scriptName: z.ZodString;
|
|
163
196
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
197
|
+
entrypoint: z.ZodString;
|
|
198
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
199
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
200
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
201
|
+
packages: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
202
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
203
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
204
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
164
205
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
165
206
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
166
207
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
167
|
-
|
|
168
|
-
|
|
208
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
209
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
210
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
211
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
212
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
169
213
|
} & {
|
|
170
214
|
pollIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
171
215
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
172
216
|
}, "strip", z.ZodTypeAny, {
|
|
217
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
173
218
|
namespace: string;
|
|
174
219
|
name: string;
|
|
175
|
-
scriptName: string;
|
|
176
220
|
args: string[];
|
|
221
|
+
entrypoint: string;
|
|
222
|
+
sparkConf: string[];
|
|
223
|
+
packages: string[];
|
|
224
|
+
jobTags: string[];
|
|
225
|
+
runTags: string[];
|
|
177
226
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
178
227
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
179
228
|
executorNumbers: number;
|
|
180
|
-
|
|
181
|
-
runTags: string[];
|
|
229
|
+
numberOfWorkers: number;
|
|
182
230
|
pollIntervalMs: number;
|
|
183
231
|
timeoutMs: number;
|
|
232
|
+
pyFiles?: string | undefined;
|
|
233
|
+
mainClass?: string | undefined;
|
|
234
|
+
executionIamPolicy?: string | undefined;
|
|
235
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
236
|
+
enableAutoScaling?: boolean | undefined;
|
|
237
|
+
timeoutMinutes?: number | undefined;
|
|
238
|
+
executionClass?: string | undefined;
|
|
184
239
|
}, {
|
|
185
240
|
namespace: string;
|
|
186
241
|
name: string;
|
|
187
|
-
|
|
242
|
+
entrypoint: string;
|
|
243
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
188
244
|
args?: string[] | undefined;
|
|
245
|
+
pyFiles?: string | undefined;
|
|
246
|
+
mainClass?: string | undefined;
|
|
247
|
+
sparkConf?: string[] | undefined;
|
|
248
|
+
packages?: string[] | undefined;
|
|
249
|
+
executionIamPolicy?: string | undefined;
|
|
250
|
+
jobTags?: string[] | undefined;
|
|
251
|
+
runTags?: string[] | undefined;
|
|
189
252
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
190
253
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
191
254
|
executorNumbers?: number | undefined;
|
|
192
|
-
|
|
193
|
-
|
|
255
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
256
|
+
numberOfWorkers?: number | undefined;
|
|
257
|
+
enableAutoScaling?: boolean | undefined;
|
|
258
|
+
timeoutMinutes?: number | undefined;
|
|
259
|
+
executionClass?: string | undefined;
|
|
194
260
|
pollIntervalMs?: number | undefined;
|
|
195
261
|
timeoutMs?: number | undefined;
|
|
196
262
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -124,73 +124,139 @@ declare const sparkMachineTypeSchema: z.ZodEnum<["spark.1.c", "spark.2.c", "spar
|
|
|
124
124
|
type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;
|
|
125
125
|
/** Spark job submit options. Optional fields have defaults. */
|
|
126
126
|
declare const submitOptionsSchema: z.ZodObject<{
|
|
127
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
127
128
|
namespace: z.ZodString;
|
|
128
129
|
name: z.ZodString;
|
|
129
|
-
scriptName: z.ZodString;
|
|
130
130
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
|
+
entrypoint: z.ZodString;
|
|
132
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
133
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
134
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
135
|
+
packages: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
136
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
137
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
138
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
139
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
132
140
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
133
141
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
134
|
-
|
|
135
|
-
|
|
142
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
143
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
144
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
145
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
146
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
136
147
|
}, "strip", z.ZodTypeAny, {
|
|
148
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
137
149
|
namespace: string;
|
|
138
150
|
name: string;
|
|
139
|
-
scriptName: string;
|
|
140
151
|
args: string[];
|
|
152
|
+
entrypoint: string;
|
|
153
|
+
sparkConf: string[];
|
|
154
|
+
packages: string[];
|
|
155
|
+
jobTags: string[];
|
|
156
|
+
runTags: string[];
|
|
141
157
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
142
158
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
143
159
|
executorNumbers: number;
|
|
144
|
-
|
|
145
|
-
|
|
160
|
+
numberOfWorkers: number;
|
|
161
|
+
pyFiles?: string | undefined;
|
|
162
|
+
mainClass?: string | undefined;
|
|
163
|
+
executionIamPolicy?: string | undefined;
|
|
164
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
165
|
+
enableAutoScaling?: boolean | undefined;
|
|
166
|
+
timeoutMinutes?: number | undefined;
|
|
167
|
+
executionClass?: string | undefined;
|
|
146
168
|
}, {
|
|
147
169
|
namespace: string;
|
|
148
170
|
name: string;
|
|
149
|
-
|
|
171
|
+
entrypoint: string;
|
|
172
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
150
173
|
args?: string[] | undefined;
|
|
174
|
+
pyFiles?: string | undefined;
|
|
175
|
+
mainClass?: string | undefined;
|
|
176
|
+
sparkConf?: string[] | undefined;
|
|
177
|
+
packages?: string[] | undefined;
|
|
178
|
+
executionIamPolicy?: string | undefined;
|
|
179
|
+
jobTags?: string[] | undefined;
|
|
180
|
+
runTags?: string[] | undefined;
|
|
151
181
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
152
182
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
153
183
|
executorNumbers?: number | undefined;
|
|
154
|
-
|
|
155
|
-
|
|
184
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
185
|
+
numberOfWorkers?: number | undefined;
|
|
186
|
+
enableAutoScaling?: boolean | undefined;
|
|
187
|
+
timeoutMinutes?: number | undefined;
|
|
188
|
+
executionClass?: string | undefined;
|
|
156
189
|
}>;
|
|
157
190
|
type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;
|
|
158
191
|
/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */
|
|
159
192
|
declare const submitSparkJobAndWaitOptionsSchema: z.ZodObject<{
|
|
193
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
160
194
|
namespace: z.ZodString;
|
|
161
195
|
name: z.ZodString;
|
|
162
|
-
scriptName: z.ZodString;
|
|
163
196
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
197
|
+
entrypoint: z.ZodString;
|
|
198
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
199
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
200
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
201
|
+
packages: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
202
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
203
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
204
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
164
205
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
165
206
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
166
207
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
167
|
-
|
|
168
|
-
|
|
208
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
209
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
210
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
211
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
212
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
169
213
|
} & {
|
|
170
214
|
pollIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
171
215
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
172
216
|
}, "strip", z.ZodTypeAny, {
|
|
217
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
173
218
|
namespace: string;
|
|
174
219
|
name: string;
|
|
175
|
-
scriptName: string;
|
|
176
220
|
args: string[];
|
|
221
|
+
entrypoint: string;
|
|
222
|
+
sparkConf: string[];
|
|
223
|
+
packages: string[];
|
|
224
|
+
jobTags: string[];
|
|
225
|
+
runTags: string[];
|
|
177
226
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
178
227
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
179
228
|
executorNumbers: number;
|
|
180
|
-
|
|
181
|
-
runTags: string[];
|
|
229
|
+
numberOfWorkers: number;
|
|
182
230
|
pollIntervalMs: number;
|
|
183
231
|
timeoutMs: number;
|
|
232
|
+
pyFiles?: string | undefined;
|
|
233
|
+
mainClass?: string | undefined;
|
|
234
|
+
executionIamPolicy?: string | undefined;
|
|
235
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
236
|
+
enableAutoScaling?: boolean | undefined;
|
|
237
|
+
timeoutMinutes?: number | undefined;
|
|
238
|
+
executionClass?: string | undefined;
|
|
184
239
|
}, {
|
|
185
240
|
namespace: string;
|
|
186
241
|
name: string;
|
|
187
|
-
|
|
242
|
+
entrypoint: string;
|
|
243
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
188
244
|
args?: string[] | undefined;
|
|
245
|
+
pyFiles?: string | undefined;
|
|
246
|
+
mainClass?: string | undefined;
|
|
247
|
+
sparkConf?: string[] | undefined;
|
|
248
|
+
packages?: string[] | undefined;
|
|
249
|
+
executionIamPolicy?: string | undefined;
|
|
250
|
+
jobTags?: string[] | undefined;
|
|
251
|
+
runTags?: string[] | undefined;
|
|
189
252
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
190
253
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
191
254
|
executorNumbers?: number | undefined;
|
|
192
|
-
|
|
193
|
-
|
|
255
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
256
|
+
numberOfWorkers?: number | undefined;
|
|
257
|
+
enableAutoScaling?: boolean | undefined;
|
|
258
|
+
timeoutMinutes?: number | undefined;
|
|
259
|
+
executionClass?: string | undefined;
|
|
194
260
|
pollIntervalMs?: number | undefined;
|
|
195
261
|
timeoutMs?: number | undefined;
|
|
196
262
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,11 @@ var listSparkJobsResultSchema = z.object({
|
|
|
38
38
|
scripts: z.array(z.string()),
|
|
39
39
|
hasMore: z.boolean()
|
|
40
40
|
});
|
|
41
|
+
var sparkClusterTypeSchema = z.enum([
|
|
42
|
+
"oleander",
|
|
43
|
+
"emr-serverless",
|
|
44
|
+
"glue"
|
|
45
|
+
]);
|
|
41
46
|
var sparkMachineTypeSchema = z.enum([
|
|
42
47
|
"spark.1.c",
|
|
43
48
|
"spark.2.c",
|
|
@@ -55,16 +60,34 @@ var sparkMachineTypeSchema = z.enum([
|
|
|
55
60
|
"spark.8.m",
|
|
56
61
|
"spark.16.m"
|
|
57
62
|
]);
|
|
63
|
+
var glueWorkerTypeSchema = z.enum([
|
|
64
|
+
"G.1X",
|
|
65
|
+
"G.2X",
|
|
66
|
+
"G.4X",
|
|
67
|
+
"G.8X",
|
|
68
|
+
"G.025X"
|
|
69
|
+
]);
|
|
58
70
|
var submitOptionsSchema = z.object({
|
|
71
|
+
cluster: sparkClusterTypeSchema.default("oleander"),
|
|
59
72
|
namespace: z.string().min(1, "namespace is required"),
|
|
60
73
|
name: z.string().min(1, "name is required"),
|
|
61
|
-
scriptName: z.string().min(1, "scriptName is required"),
|
|
62
74
|
args: z.array(z.string()).default([]),
|
|
75
|
+
entrypoint: z.string().min(1, "entrypoint is required"),
|
|
76
|
+
pyFiles: z.string().optional(),
|
|
77
|
+
mainClass: z.string().optional(),
|
|
78
|
+
sparkConf: z.array(z.string()).default([]),
|
|
79
|
+
packages: z.array(z.string()).default([]),
|
|
80
|
+
executionIamPolicy: z.string().optional(),
|
|
81
|
+
jobTags: z.array(z.string()).default([]),
|
|
82
|
+
runTags: z.array(z.string()).default([]),
|
|
63
83
|
driverMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
64
84
|
executorMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
65
85
|
executorNumbers: z.number().int().min(1).max(20).default(2),
|
|
66
|
-
|
|
67
|
-
|
|
86
|
+
workerType: glueWorkerTypeSchema.optional(),
|
|
87
|
+
numberOfWorkers: z.number().int().min(1).default(1),
|
|
88
|
+
enableAutoScaling: z.boolean().optional(),
|
|
89
|
+
timeoutMinutes: z.number().int().optional(),
|
|
90
|
+
executionClass: z.string().optional()
|
|
68
91
|
});
|
|
69
92
|
var submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({
|
|
70
93
|
pollIntervalMs: z.number().int().positive().default(1e4),
|
|
@@ -197,19 +220,62 @@ var Oleander = class {
|
|
|
197
220
|
*/
|
|
198
221
|
async submitSparkJob(options) {
|
|
199
222
|
const opts = submitOptionsSchema.parse(options);
|
|
200
|
-
const
|
|
223
|
+
const buildGlueArguments = (args) => {
|
|
224
|
+
const result = {};
|
|
225
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
226
|
+
const key = args[i];
|
|
227
|
+
const value = args[i + 1];
|
|
228
|
+
if (value === void 0) {
|
|
229
|
+
throw new Error(`Missing value for argument: ${key}`);
|
|
230
|
+
}
|
|
231
|
+
result[key] = value;
|
|
232
|
+
}
|
|
233
|
+
return result;
|
|
234
|
+
};
|
|
235
|
+
let properties;
|
|
236
|
+
if (opts.cluster === "oleander") {
|
|
237
|
+
properties = {
|
|
238
|
+
entrypoint: opts.entrypoint,
|
|
239
|
+
entrypointArguments: opts.args,
|
|
240
|
+
driverMachineType: opts.driverMachineType,
|
|
241
|
+
executorMachineType: opts.executorMachineType,
|
|
242
|
+
executorNumbers: opts.executorNumbers,
|
|
243
|
+
sparkConf: opts.sparkConf,
|
|
244
|
+
packages: opts.packages
|
|
245
|
+
};
|
|
246
|
+
} else if (opts.cluster === "emr-serverless") {
|
|
247
|
+
properties = {
|
|
248
|
+
entrypoint: opts.entrypoint,
|
|
249
|
+
entrypointArguments: opts.args,
|
|
250
|
+
pyFiles: opts.pyFiles,
|
|
251
|
+
mainClass: opts.mainClass,
|
|
252
|
+
sparkConf: opts.sparkConf,
|
|
253
|
+
packages: opts.packages,
|
|
254
|
+
executionIamPolicy: opts.executionIamPolicy
|
|
255
|
+
};
|
|
256
|
+
} else if (opts.cluster === "glue") {
|
|
257
|
+
properties = {
|
|
258
|
+
jobName: opts.entrypoint,
|
|
259
|
+
entrypointArguments: buildGlueArguments(opts.args),
|
|
260
|
+
sparkConf: opts.sparkConf,
|
|
261
|
+
workerType: opts.workerType,
|
|
262
|
+
numberOfWorkers: opts.numberOfWorkers,
|
|
263
|
+
enableAutoScaling: opts.enableAutoScaling,
|
|
264
|
+
timeoutMinutes: opts.timeoutMinutes,
|
|
265
|
+
executionClass: opts.executionClass,
|
|
266
|
+
executionRoleSessionPolicy: opts.executionIamPolicy
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {
|
|
201
270
|
method: "POST",
|
|
202
271
|
headers: getHeaders(this.apiKey),
|
|
203
272
|
body: JSON.stringify({
|
|
273
|
+
cluster: opts.cluster,
|
|
204
274
|
namespace: opts.namespace.trim(),
|
|
205
275
|
name: opts.name.trim(),
|
|
206
|
-
scriptName: opts.scriptName.trim(),
|
|
207
|
-
arguments: opts.args,
|
|
208
|
-
driverMachineType: opts.driverMachineType,
|
|
209
|
-
executorMachineType: opts.executorMachineType,
|
|
210
|
-
executorNumbers: opts.executorNumbers,
|
|
211
276
|
jobTags: opts.jobTags,
|
|
212
|
-
runTags: opts.runTags
|
|
277
|
+
runTags: opts.runTags,
|
|
278
|
+
properties
|
|
213
279
|
})
|
|
214
280
|
});
|
|
215
281
|
const raw = await res.json().catch(() => ({}));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n scriptName: z.string().min(1, \"scriptName is required\"),\n args: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n scriptName: opts.scriptName.trim(),\n arguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark cluster type enum */\nexport const sparkClusterTypeSchema = z.enum([\n \"oleander\",\n \"emr-serverless\",\n \"glue\",\n]);\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\n/** Glue worker type enum */\nexport const glueWorkerTypeSchema = z.enum([\n \"G.1X\",\n \"G.2X\",\n \"G.4X\",\n \"G.8X\",\n \"G.025X\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n cluster: sparkClusterTypeSchema.default(\"oleander\"),\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n args: z.array(z.string()).default([]),\n entrypoint: z.string().min(1, \"entrypoint is required\"),\n pyFiles: z.string().optional(),\n mainClass: z.string().optional(),\n sparkConf: z.array(z.string()).default([]),\n packages: z.array(z.string()).default([]),\n executionIamPolicy: z.string().optional(),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n workerType: glueWorkerTypeSchema.optional(),\n numberOfWorkers: z.number().int().min(1).default(1),\n enableAutoScaling: z.boolean().optional(),\n timeoutMinutes: z.number().int().optional(),\n executionClass: z.string().optional(),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const buildGlueArguments = (args: string[]): Record<string, string> => {\n const result: Record<string, string> = {};\n for (let i = 0; i < args.length; i += 2) {\n const key = args[i];\n const value = args[i + 1];\n if (value === undefined) {\n throw new Error(`Missing value for argument: ${key}`);\n }\n result[key] = value;\n }\n return result;\n };\n\n let properties: any;\n if (opts.cluster === \"oleander\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n sparkConf: opts.sparkConf,\n packages: opts.packages,\n };\n } else if (opts.cluster === \"emr-serverless\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n pyFiles: opts.pyFiles,\n mainClass: opts.mainClass,\n sparkConf: opts.sparkConf,\n packages: opts.packages,\n executionIamPolicy: opts.executionIamPolicy,\n };\n } else if (opts.cluster === \"glue\") {\n properties = {\n jobName: opts.entrypoint,\n entrypointArguments: buildGlueArguments(opts.args),\n sparkConf: opts.sparkConf,\n workerType: opts.workerType,\n numberOfWorkers: opts.numberOfWorkers,\n enableAutoScaling: opts.enableAutoScaling,\n timeoutMinutes: opts.timeoutMinutes,\n executionClass: opts.executionClass,\n executionRoleSessionPolicy: opts.executionIamPolicy,\n };\n }\n\n const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n cluster: opts.cluster,\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n properties: properties,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|