@dremio/js-sdk 0.29.0 → 0.30.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.
@@ -1,11 +1,13 @@
1
- import type { SonarV3Config } from "../../common/Config.ts";
1
+ import type { SonarV2Config, SonarV3Config } from "../../common/Config.ts";
2
2
  import { Job } from "./Job.ts";
3
3
  import { Query } from "../../common/Query.ts";
4
4
  import type { SignalParam } from "../../common/Params.ts";
5
5
  import { type JobEntity } from "./utils/jobEntityToProperties.ts";
6
+ import { type jobListParamsSchema } from "./listJobs.ts";
7
+ import * as z from "zod/mini";
6
8
  export declare class JobsResource {
7
9
  #private;
8
- constructor(config: SonarV3Config);
10
+ constructor(config: SonarV2Config & SonarV3Config);
9
11
  _jobFromEntity(id: string, entity: JobEntity): Job;
10
12
  create(query: Query): Promise<import("ts-results-es").Result<string, import("../index.ts").HttpError>>;
11
13
  /**
@@ -18,6 +20,50 @@ export declare class JobsResource {
18
20
  * A convenience method to combine job creation and retrieval
19
21
  */
20
22
  createAndRetrieve(query: Query): Promise<import("ts-results-es").Result<Job, import("../index.ts").HttpError>>;
23
+ /**
24
+ * @deprecated
25
+ */
26
+ _list(params: z.infer<typeof jobListParamsSchema>): {
27
+ data({ signal }?: SignalParam): AsyncGenerator<{
28
+ id: string;
29
+ queryType: "UI_RUN" | "UI_PREVIEW" | "UI_INTERNAL_PREVIEW" | "UI_INTERNAL_RUN" | "UI_EXPORT" | "ODBC" | "JDBC" | "REST" | "ACCELERATOR_CREATE" | "ACCELERATOR_DROP" | "UNKNOWN" | "PREPARE_INTERNAL" | "ACCELERATOR_EXPLAIN" | "UI_INITIAL_PREVIEW" | "METADATA_REFRESH" | "FLIGHT" | "INTERNAL_ICEBERG_METADATA_DROP";
30
+ state: string;
31
+ description: string;
32
+ user: string;
33
+ input: string;
34
+ output: string;
35
+ accelerated: boolean;
36
+ datasetVersion: string;
37
+ durationDetails: {
38
+ phaseDuration: string;
39
+ phaseName: "STARTING" | "RUNNING" | "PLANNING" | "PENDING" | "METADATA_RETRIEVAL" | "QUEUED" | "ENGINE_START" | "EXECUTION_PLANNING";
40
+ phaseStartTime: string;
41
+ }[];
42
+ isComplete: boolean;
43
+ outputLimited: boolean;
44
+ outputRecords: number;
45
+ plannerEstimatedCost: number;
46
+ queriedDatasets: {
47
+ datasetPathsList: string[];
48
+ datasetName?: string | undefined;
49
+ datasetPath?: string | undefined;
50
+ datasetType?: string | undefined;
51
+ versionContext?: string | undefined;
52
+ }[];
53
+ queryText: string;
54
+ requestType: string;
55
+ rowsScanned: number;
56
+ spilled: boolean;
57
+ starFlakeAccelerated: boolean;
58
+ totalAttempts: number;
59
+ waitInClient: number;
60
+ duration: import("temporal-polyfill").Temporal.Duration;
61
+ startTime: import("temporal-polyfill").Temporal.Instant;
62
+ enqueuedTime?: string | undefined;
63
+ wlmQueue?: string | undefined;
64
+ endTime?: import("temporal-polyfill").Temporal.Instant | undefined;
65
+ }, void, unknown>;
66
+ };
21
67
  observe(id: string): import("rxjs").Observable<import("ts-results-es").Result<Job, import("../index.ts").HttpError>>;
22
68
  retrieve(id: string, { signal }?: SignalParam): Promise<import("ts-results-es").Result<Job, import("../index.ts").HttpError>>;
23
69
  }
@@ -20,6 +20,8 @@ import { repeat, shareReplay, takeWhile, tap, timer } from "rxjs";
20
20
  import { fromAbortable } from "../../common/fromAbortable.js";
21
21
  import { jobEntityToProperties } from "./utils/jobEntityToProperties.js";
22
22
  import moize from "moize";
23
+ import { createListJobs } from "./listJobs.js";
24
+ import * as z from "zod/mini";
23
25
  export class JobsResource {
24
26
  #config;
25
27
  #createJobObservable = (id) => fromAbortable(({ signal }) => this.retrieve(id, { signal })).pipe(repeat({ delay: (count) => timer(jobPollingBackoff(count - 1)) }), takeWhile((jobResult) => jobResult.isOk() && !jobResult.value.settled, true));
@@ -97,6 +99,27 @@ export class JobsResource {
97
99
  createAndRetrieve(query) {
98
100
  return new AsyncResult(this.create(query)).andThen((jobId) => this.retrieve(jobId)).promise;
99
101
  }
102
+ /**
103
+ * @deprecated
104
+ */
105
+ _list(params) {
106
+ const { getNextPage, listJobs } = createListJobs(this.#config);
107
+ return {
108
+ async *data({ signal } = {}) {
109
+ const firstPageResult = await listJobs(params).promise;
110
+ if (firstPageResult.isErr()) {
111
+ throw firstPageResult.error;
112
+ }
113
+ yield* firstPageResult.value.data;
114
+ let nextPageToken = firstPageResult.value.next;
115
+ while (nextPageToken) {
116
+ const nextPage = await getNextPage(nextPageToken, { signal }).promise.then((result) => result.unwrap());
117
+ nextPageToken = nextPage.next;
118
+ yield* nextPage.data;
119
+ }
120
+ },
121
+ };
122
+ }
100
123
  observe(id) {
101
124
  return this.#jobObserverCache(id);
102
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"JobsResource.js","sourceRoot":"","sources":["../../../src/oss/jobs/JobsResource.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SonarV3Config } from \"../../common/Config.ts\";\nimport { Job } from \"./Job.ts\";\nimport { Query } from \"../../common/Query.ts\";\nimport { AsyncResult } from \"ts-results-es\";\nimport type { SignalParam } from \"../../common/Params.ts\";\nimport { repeat, shareReplay, takeWhile, tap, timer } from \"rxjs\";\nimport { fromAbortable } from \"../../common/fromAbortable.ts\";\nimport { jobEntityToProperties, type JobEntity } from \"./utils/jobEntityToProperties.ts\";\nimport moize from \"moize\";\n\nexport class JobsResource {\n #config: SonarV3Config;\n\n #createJobObservable = (id: string) =>\n fromAbortable(({ signal }) => this.retrieve(id, { signal })).pipe(\n repeat({ delay: (count) => timer(jobPollingBackoff(count - 1)) }),\n takeWhile((jobResult) => jobResult.isOk() && !jobResult.value.settled, true),\n );\n\n /**\n * Reuse the same observable every time the `observe` method is called.\n */\n #jobObserverCache = moize.default(\n (id: string) =>\n this.#createJobObservable(id).pipe(\n tap({\n finalize: () => {\n this.#jobObserverCache.remove([id]);\n },\n }),\n /**\n * Reuse the same polling for multiple subscribers, buffering only the latest result.\n * Make sure to unsubscribe from the source to stop polling when there are no subscribers (refCount: true)\n */\n shareReplay({\n bufferSize: 1,\n refCount: true,\n }),\n ),\n {\n /**\n * Evict cached observables after 60s. We need some way to prevent a memory\n * leak for long-running SDK processes, and a maxAge of 60 seconds should be\n * enough to handle multiple subscribers attached programmatically to a job.\n * If it's not, then the worst case is that we'd make additional API calls.\n */\n maxAge: 60_000,\n maxSize: Infinity,\n },\n );\n\n constructor(config: SonarV3Config) {\n this.#config = config;\n }\n\n _jobFromEntity(id: string, entity: JobEntity): Job {\n return new Job(jobEntityToProperties(id, entity), this.#config, this.observe.bind(this));\n }\n\n create(query: Query) {\n return this.#config\n .sonarV3Request(`sql`, {\n body: JSON.stringify({\n context: query.context,\n sql: query.sql,\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n keepalive: true,\n method: \"POST\",\n })\n .map((response) => response.json() as Promise<{ id: string }>)\n .map((response) => response.id).promise;\n }\n\n /**\n * Runs multiple queries sequentially, waiting for each one to finish successfully\n * before starting the next. If a query fails, any subsequent queries will not be\n * run.\n */\n async *createSequential(queries: Query[]) {\n for (let i = 0; i < queries.length; i++) {\n const result = await this.createAndRetrieve(queries.at(i)!);\n yield result;\n\n /**\n * Stop processing additional queries if the job prior to it failed\n */\n if (\n // If it's the last query, return immediately rather than waiting for it to finish\n i !== queries.length - 1 &&\n (result.isErr() || (await result.value.retrieveSettled()).state !== \"COMPLETED\")\n ) {\n break;\n }\n }\n }\n\n /**\n * A convenience method to combine job creation and retrieval\n */\n createAndRetrieve(query: Query) {\n return new AsyncResult(this.create(query)).andThen((jobId) => this.retrieve(jobId)).promise;\n }\n\n observe(id: string) {\n return this.#jobObserverCache(id);\n }\n\n retrieve(id: string, { signal }: SignalParam = {}) {\n return this.#config\n .sonarV3Request(`job/${id}`, { signal })\n .map((res) => res.json() as Promise<JobEntity>)\n .map((entity) => this._jobFromEntity(id, entity)).promise;\n }\n}\n\nconst jobPollingBackoff = (count: number) =>\n Math.min(Math.ceil((Math.max(count, 0) ** 2 / 40 + 1) * 1000), 3_000);\n"]}
1
+ {"version":3,"file":"JobsResource.js","sourceRoot":"","sources":["../../../src/oss/jobs/JobsResource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAkB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAA4B,MAAM,eAAe,CAAC;AACzE,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,MAAM,OAAO,YAAY;IACvB,OAAO,CAAgC;IAEvC,oBAAoB,GAAG,CAAC,EAAU,EAAE,EAAE,CACpC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC/D,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EACjE,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAC7E,CAAC;IAEJ;;OAEG;IACH,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAC/B,CAAC,EAAU,EAAE,EAAE,CACb,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,IAAI,CAChC,GAAG,CAAC;QACF,QAAQ,EAAE,GAAG,EAAE;YACb,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC;QACV,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,IAAI;KACf,CAAC,CACH,EACH;QACE;;;;;WAKG;QACH,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,QAAQ;KAClB,CACF,CAAC;IAEF,YAAY,MAAqC;QAC/C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,EAAU,EAAE,MAAiB;QAC1C,OAAO,IAAI,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,CAAC,KAAY;QACjB,OAAO,IAAI,CAAC,OAAO;aAChB,cAAc,CAAC,KAAK,EAAE;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC;YACF,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;YACD,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,MAAM;SACf,CAAC;aACD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAA6B,CAAC;aAC7D,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,gBAAgB,CAAC,OAAgB;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;YAC5D,MAAM,MAAM,CAAC;YAEb;;eAEG;YACH;YACE,kFAAkF;YAClF,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;gBACxB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,EAChF,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAY;QAC5B,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9F,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAA2C;QAC/C,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO;YACL,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAkB,EAAE;gBACtC,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBAEvD,IAAI,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC;oBAC5B,MAAM,eAAe,CAAC,KAAK,CAAC;gBAC9B,CAAC;gBAED,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAClC,IAAI,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAE/C,OAAO,aAAa,EAAE,CAAC;oBACrB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACpF,MAAM,CAAC,MAAM,EAAE,CAChB,CAAC;oBACF,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC9B,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACvB,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,EAAU,EAAE,EAAE,MAAM,KAAkB,EAAE;QAC/C,OAAO,IAAI,CAAC,OAAO;aAChB,cAAc,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;aACvC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAwB,CAAC;aAC9C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9D,CAAC;CACF;AAED,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SonarV2Config, SonarV3Config } from \"../../common/Config.ts\";\nimport { Job } from \"./Job.ts\";\nimport { Query } from \"../../common/Query.ts\";\nimport { AsyncResult } from \"ts-results-es\";\nimport type { SignalParam } from \"../../common/Params.ts\";\nimport { repeat, shareReplay, takeWhile, tap, timer } from \"rxjs\";\nimport { fromAbortable } from \"../../common/fromAbortable.ts\";\nimport { jobEntityToProperties, type JobEntity } from \"./utils/jobEntityToProperties.ts\";\nimport moize from \"moize\";\nimport { createListJobs, type jobListParamsSchema } from \"./listJobs.ts\";\nimport * as z from \"zod/mini\";\n\nexport class JobsResource {\n #config: SonarV2Config & SonarV3Config;\n\n #createJobObservable = (id: string) =>\n fromAbortable(({ signal }) => this.retrieve(id, { signal })).pipe(\n repeat({ delay: (count) => timer(jobPollingBackoff(count - 1)) }),\n takeWhile((jobResult) => jobResult.isOk() && !jobResult.value.settled, true),\n );\n\n /**\n * Reuse the same observable every time the `observe` method is called.\n */\n #jobObserverCache = moize.default(\n (id: string) =>\n this.#createJobObservable(id).pipe(\n tap({\n finalize: () => {\n this.#jobObserverCache.remove([id]);\n },\n }),\n /**\n * Reuse the same polling for multiple subscribers, buffering only the latest result.\n * Make sure to unsubscribe from the source to stop polling when there are no subscribers (refCount: true)\n */\n shareReplay({\n bufferSize: 1,\n refCount: true,\n }),\n ),\n {\n /**\n * Evict cached observables after 60s. We need some way to prevent a memory\n * leak for long-running SDK processes, and a maxAge of 60 seconds should be\n * enough to handle multiple subscribers attached programmatically to a job.\n * If it's not, then the worst case is that we'd make additional API calls.\n */\n maxAge: 60_000,\n maxSize: Infinity,\n },\n );\n\n constructor(config: SonarV2Config & SonarV3Config) {\n this.#config = config;\n }\n\n _jobFromEntity(id: string, entity: JobEntity): Job {\n return new Job(jobEntityToProperties(id, entity), this.#config, this.observe.bind(this));\n }\n\n create(query: Query) {\n return this.#config\n .sonarV3Request(`sql`, {\n body: JSON.stringify({\n context: query.context,\n sql: query.sql,\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n keepalive: true,\n method: \"POST\",\n })\n .map((response) => response.json() as Promise<{ id: string }>)\n .map((response) => response.id).promise;\n }\n\n /**\n * Runs multiple queries sequentially, waiting for each one to finish successfully\n * before starting the next. If a query fails, any subsequent queries will not be\n * run.\n */\n async *createSequential(queries: Query[]) {\n for (let i = 0; i < queries.length; i++) {\n const result = await this.createAndRetrieve(queries.at(i)!);\n yield result;\n\n /**\n * Stop processing additional queries if the job prior to it failed\n */\n if (\n // If it's the last query, return immediately rather than waiting for it to finish\n i !== queries.length - 1 &&\n (result.isErr() || (await result.value.retrieveSettled()).state !== \"COMPLETED\")\n ) {\n break;\n }\n }\n }\n\n /**\n * A convenience method to combine job creation and retrieval\n */\n createAndRetrieve(query: Query) {\n return new AsyncResult(this.create(query)).andThen((jobId) => this.retrieve(jobId)).promise;\n }\n\n /**\n * @deprecated\n */\n _list(params: z.infer<typeof jobListParamsSchema>) {\n const { getNextPage, listJobs } = createListJobs(this.#config);\n return {\n async *data({ signal }: SignalParam = {}) {\n const firstPageResult = await listJobs(params).promise;\n\n if (firstPageResult.isErr()) {\n throw firstPageResult.error;\n }\n\n yield* firstPageResult.value.data;\n let nextPageToken = firstPageResult.value.next;\n\n while (nextPageToken) {\n const nextPage = await getNextPage(nextPageToken, { signal }).promise.then((result) =>\n result.unwrap(),\n );\n nextPageToken = nextPage.next;\n yield* nextPage.data;\n }\n },\n };\n }\n\n observe(id: string) {\n return this.#jobObserverCache(id);\n }\n\n retrieve(id: string, { signal }: SignalParam = {}) {\n return this.#config\n .sonarV3Request(`job/${id}`, { signal })\n .map((res) => res.json() as Promise<JobEntity>)\n .map((entity) => this._jobFromEntity(id, entity)).promise;\n }\n}\n\nconst jobPollingBackoff = (count: number) =>\n Math.min(Math.ceil((Math.max(count, 0) ** 2 / 40 + 1) * 1000), 3_000);\n"]}
@@ -0,0 +1,328 @@
1
+ import * as z from "zod/mini";
2
+ import type { SonarV2Config } from "../../common/Config.ts";
3
+ import { Temporal } from "temporal-polyfill";
4
+ import type { SignalParam } from "../../common/Params.ts";
5
+ export declare const jobListParamsSchema: z.ZodMiniObject<{
6
+ contains: z.ZodMiniOptional<z.ZodMiniString<string>>;
7
+ dateRange: z.ZodMiniOptional<z.ZodMiniObject<{
8
+ end: z.ZodMiniOptional<z.ZodMiniCustom<Temporal.Instant, Temporal.Instant>>;
9
+ start: z.ZodMiniCustom<Temporal.Instant, Temporal.Instant>;
10
+ }, z.core.$strict>>;
11
+ queryType: z.ZodMiniOptional<z.ZodMiniSet<z.ZodMiniEnum<{
12
+ INTERNAL: "INTERNAL";
13
+ EXTERNAL: "EXTERNAL";
14
+ ACCELERATION: "ACCELERATION";
15
+ DOWNLOAD: "DOWNLOAD";
16
+ UI: "UI";
17
+ }>>>;
18
+ sort: z.ZodMiniOptional<z.ZodMiniObject<{
19
+ direction: z.ZodMiniEnum<{
20
+ ASC: "ASC";
21
+ DESC: "DESC";
22
+ }>;
23
+ field: z.ZodMiniEnum<{
24
+ user: "user";
25
+ duration: "duration";
26
+ startTime: "startTime";
27
+ }>;
28
+ }, z.core.$strict>>;
29
+ status: z.ZodMiniOptional<z.ZodMiniSet<z.ZodMiniEnum<{
30
+ RUNNING: "RUNNING";
31
+ COMPLETED: "COMPLETED";
32
+ CANCELED: "CANCELED";
33
+ FAILED: "FAILED";
34
+ QUEUED: "QUEUED";
35
+ ENGINE_START: "ENGINE_START";
36
+ SETUP: "SETUP";
37
+ }>>>;
38
+ user: z.ZodMiniOptional<z.ZodMiniSet<z.ZodMiniString<string>>>;
39
+ }, z.core.$strict>;
40
+ export declare function mapParams(params: z.infer<typeof jobListParamsSchema>): {
41
+ readonly detailLevel: "1";
42
+ readonly filter: string[];
43
+ readonly order: "DESCENDING" | "ASCENDING" | undefined;
44
+ readonly sort: "dur" | "st" | "usr" | undefined;
45
+ };
46
+ export declare const jobDetailsInSchema: z.ZodMiniObject<{
47
+ accelerated: z.ZodMiniBoolean<boolean>;
48
+ datasetVersion: z.ZodMiniString<string>;
49
+ description: z.ZodMiniString<string>;
50
+ duration: z.ZodMiniNumber<number>;
51
+ durationDetails: z.ZodMiniArray<z.ZodMiniObject<{
52
+ phaseDuration: z.ZodMiniString<string>;
53
+ phaseName: z.ZodMiniEnum<{
54
+ STARTING: "STARTING";
55
+ RUNNING: "RUNNING";
56
+ PLANNING: "PLANNING";
57
+ PENDING: "PENDING";
58
+ METADATA_RETRIEVAL: "METADATA_RETRIEVAL";
59
+ QUEUED: "QUEUED";
60
+ ENGINE_START: "ENGINE_START";
61
+ EXECUTION_PLANNING: "EXECUTION_PLANNING";
62
+ }>;
63
+ phaseStartTime: z.ZodMiniString<string>;
64
+ }, z.core.$strip>>;
65
+ endTime: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
66
+ enqueuedTime: z.ZodMiniOptional<z.ZodMiniString<string>>;
67
+ id: z.ZodMiniString<string>;
68
+ input: z.ZodMiniString<string>;
69
+ isComplete: z.ZodMiniBoolean<boolean>;
70
+ output: z.ZodMiniString<string>;
71
+ outputLimited: z.ZodMiniBoolean<boolean>;
72
+ outputRecords: z.ZodMiniNumber<number>;
73
+ plannerEstimatedCost: z.ZodMiniNumber<number>;
74
+ queriedDatasets: z.ZodMiniArray<z.ZodMiniObject<{
75
+ datasetName: z.ZodMiniOptional<z.ZodMiniString<string>>;
76
+ datasetPath: z.ZodMiniOptional<z.ZodMiniString<string>>;
77
+ datasetPathsList: z.ZodMiniArray<z.ZodMiniString<string>>;
78
+ datasetType: z.ZodMiniOptional<z.ZodMiniString<string>>;
79
+ versionContext: z.ZodMiniOptional<z.ZodMiniString<string>>;
80
+ }, z.core.$strip>>;
81
+ queryText: z.ZodMiniString<string>;
82
+ queryType: z.ZodMiniEnum<{
83
+ UI_RUN: "UI_RUN";
84
+ UI_PREVIEW: "UI_PREVIEW";
85
+ UI_INTERNAL_PREVIEW: "UI_INTERNAL_PREVIEW";
86
+ UI_INTERNAL_RUN: "UI_INTERNAL_RUN";
87
+ UI_EXPORT: "UI_EXPORT";
88
+ ODBC: "ODBC";
89
+ JDBC: "JDBC";
90
+ REST: "REST";
91
+ ACCELERATOR_CREATE: "ACCELERATOR_CREATE";
92
+ ACCELERATOR_DROP: "ACCELERATOR_DROP";
93
+ UNKNOWN: "UNKNOWN";
94
+ PREPARE_INTERNAL: "PREPARE_INTERNAL";
95
+ ACCELERATOR_EXPLAIN: "ACCELERATOR_EXPLAIN";
96
+ UI_INITIAL_PREVIEW: "UI_INITIAL_PREVIEW";
97
+ METADATA_REFRESH: "METADATA_REFRESH";
98
+ FLIGHT: "FLIGHT";
99
+ INTERNAL_ICEBERG_METADATA_DROP: "INTERNAL_ICEBERG_METADATA_DROP";
100
+ }>;
101
+ requestType: z.ZodMiniString<string>;
102
+ rowsScanned: z.ZodMiniNumber<number>;
103
+ spilled: z.ZodMiniBoolean<boolean>;
104
+ starFlakeAccelerated: z.ZodMiniBoolean<boolean>;
105
+ startTime: z.ZodMiniNumber<number>;
106
+ state: z.ZodMiniString<string>;
107
+ totalAttempts: z.ZodMiniNumber<number>;
108
+ user: z.ZodMiniString<string>;
109
+ waitInClient: z.ZodMiniNumber<number>;
110
+ wlmQueue: z.ZodMiniOptional<z.ZodMiniString<string>>;
111
+ }, z.core.$strip>;
112
+ export declare const jobDetailsCodec: z.ZodMiniCodec<z.ZodMiniObject<{
113
+ accelerated: z.ZodMiniBoolean<boolean>;
114
+ datasetVersion: z.ZodMiniString<string>;
115
+ description: z.ZodMiniString<string>;
116
+ duration: z.ZodMiniNumber<number>;
117
+ durationDetails: z.ZodMiniArray<z.ZodMiniObject<{
118
+ phaseDuration: z.ZodMiniString<string>;
119
+ phaseName: z.ZodMiniEnum<{
120
+ STARTING: "STARTING";
121
+ RUNNING: "RUNNING";
122
+ PLANNING: "PLANNING";
123
+ PENDING: "PENDING";
124
+ METADATA_RETRIEVAL: "METADATA_RETRIEVAL";
125
+ QUEUED: "QUEUED";
126
+ ENGINE_START: "ENGINE_START";
127
+ EXECUTION_PLANNING: "EXECUTION_PLANNING";
128
+ }>;
129
+ phaseStartTime: z.ZodMiniString<string>;
130
+ }, z.core.$strip>>;
131
+ endTime: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
132
+ enqueuedTime: z.ZodMiniOptional<z.ZodMiniString<string>>;
133
+ id: z.ZodMiniString<string>;
134
+ input: z.ZodMiniString<string>;
135
+ isComplete: z.ZodMiniBoolean<boolean>;
136
+ output: z.ZodMiniString<string>;
137
+ outputLimited: z.ZodMiniBoolean<boolean>;
138
+ outputRecords: z.ZodMiniNumber<number>;
139
+ plannerEstimatedCost: z.ZodMiniNumber<number>;
140
+ queriedDatasets: z.ZodMiniArray<z.ZodMiniObject<{
141
+ datasetName: z.ZodMiniOptional<z.ZodMiniString<string>>;
142
+ datasetPath: z.ZodMiniOptional<z.ZodMiniString<string>>;
143
+ datasetPathsList: z.ZodMiniArray<z.ZodMiniString<string>>;
144
+ datasetType: z.ZodMiniOptional<z.ZodMiniString<string>>;
145
+ versionContext: z.ZodMiniOptional<z.ZodMiniString<string>>;
146
+ }, z.core.$strip>>;
147
+ queryText: z.ZodMiniString<string>;
148
+ queryType: z.ZodMiniEnum<{
149
+ UI_RUN: "UI_RUN";
150
+ UI_PREVIEW: "UI_PREVIEW";
151
+ UI_INTERNAL_PREVIEW: "UI_INTERNAL_PREVIEW";
152
+ UI_INTERNAL_RUN: "UI_INTERNAL_RUN";
153
+ UI_EXPORT: "UI_EXPORT";
154
+ ODBC: "ODBC";
155
+ JDBC: "JDBC";
156
+ REST: "REST";
157
+ ACCELERATOR_CREATE: "ACCELERATOR_CREATE";
158
+ ACCELERATOR_DROP: "ACCELERATOR_DROP";
159
+ UNKNOWN: "UNKNOWN";
160
+ PREPARE_INTERNAL: "PREPARE_INTERNAL";
161
+ ACCELERATOR_EXPLAIN: "ACCELERATOR_EXPLAIN";
162
+ UI_INITIAL_PREVIEW: "UI_INITIAL_PREVIEW";
163
+ METADATA_REFRESH: "METADATA_REFRESH";
164
+ FLIGHT: "FLIGHT";
165
+ INTERNAL_ICEBERG_METADATA_DROP: "INTERNAL_ICEBERG_METADATA_DROP";
166
+ }>;
167
+ requestType: z.ZodMiniString<string>;
168
+ rowsScanned: z.ZodMiniNumber<number>;
169
+ spilled: z.ZodMiniBoolean<boolean>;
170
+ starFlakeAccelerated: z.ZodMiniBoolean<boolean>;
171
+ startTime: z.ZodMiniNumber<number>;
172
+ state: z.ZodMiniString<string>;
173
+ totalAttempts: z.ZodMiniNumber<number>;
174
+ user: z.ZodMiniString<string>;
175
+ waitInClient: z.ZodMiniNumber<number>;
176
+ wlmQueue: z.ZodMiniOptional<z.ZodMiniString<string>>;
177
+ }, z.core.$strip>, z.ZodMiniObject<{
178
+ id: z.ZodMiniString<string>;
179
+ queryType: z.ZodMiniEnum<{
180
+ UI_RUN: "UI_RUN";
181
+ UI_PREVIEW: "UI_PREVIEW";
182
+ UI_INTERNAL_PREVIEW: "UI_INTERNAL_PREVIEW";
183
+ UI_INTERNAL_RUN: "UI_INTERNAL_RUN";
184
+ UI_EXPORT: "UI_EXPORT";
185
+ ODBC: "ODBC";
186
+ JDBC: "JDBC";
187
+ REST: "REST";
188
+ ACCELERATOR_CREATE: "ACCELERATOR_CREATE";
189
+ ACCELERATOR_DROP: "ACCELERATOR_DROP";
190
+ UNKNOWN: "UNKNOWN";
191
+ PREPARE_INTERNAL: "PREPARE_INTERNAL";
192
+ ACCELERATOR_EXPLAIN: "ACCELERATOR_EXPLAIN";
193
+ UI_INITIAL_PREVIEW: "UI_INITIAL_PREVIEW";
194
+ METADATA_REFRESH: "METADATA_REFRESH";
195
+ FLIGHT: "FLIGHT";
196
+ INTERNAL_ICEBERG_METADATA_DROP: "INTERNAL_ICEBERG_METADATA_DROP";
197
+ }>;
198
+ state: z.ZodMiniString<string>;
199
+ description: z.ZodMiniString<string>;
200
+ user: z.ZodMiniString<string>;
201
+ input: z.ZodMiniString<string>;
202
+ output: z.ZodMiniString<string>;
203
+ accelerated: z.ZodMiniBoolean<boolean>;
204
+ datasetVersion: z.ZodMiniString<string>;
205
+ durationDetails: z.ZodMiniArray<z.ZodMiniObject<{
206
+ phaseDuration: z.ZodMiniString<string>;
207
+ phaseName: z.ZodMiniEnum<{
208
+ STARTING: "STARTING";
209
+ RUNNING: "RUNNING";
210
+ PLANNING: "PLANNING";
211
+ PENDING: "PENDING";
212
+ METADATA_RETRIEVAL: "METADATA_RETRIEVAL";
213
+ QUEUED: "QUEUED";
214
+ ENGINE_START: "ENGINE_START";
215
+ EXECUTION_PLANNING: "EXECUTION_PLANNING";
216
+ }>;
217
+ phaseStartTime: z.ZodMiniString<string>;
218
+ }, z.core.$strip>>;
219
+ enqueuedTime: z.ZodMiniOptional<z.ZodMiniString<string>>;
220
+ isComplete: z.ZodMiniBoolean<boolean>;
221
+ outputLimited: z.ZodMiniBoolean<boolean>;
222
+ outputRecords: z.ZodMiniNumber<number>;
223
+ plannerEstimatedCost: z.ZodMiniNumber<number>;
224
+ queriedDatasets: z.ZodMiniArray<z.ZodMiniObject<{
225
+ datasetName: z.ZodMiniOptional<z.ZodMiniString<string>>;
226
+ datasetPath: z.ZodMiniOptional<z.ZodMiniString<string>>;
227
+ datasetPathsList: z.ZodMiniArray<z.ZodMiniString<string>>;
228
+ datasetType: z.ZodMiniOptional<z.ZodMiniString<string>>;
229
+ versionContext: z.ZodMiniOptional<z.ZodMiniString<string>>;
230
+ }, z.core.$strip>>;
231
+ queryText: z.ZodMiniString<string>;
232
+ requestType: z.ZodMiniString<string>;
233
+ rowsScanned: z.ZodMiniNumber<number>;
234
+ spilled: z.ZodMiniBoolean<boolean>;
235
+ starFlakeAccelerated: z.ZodMiniBoolean<boolean>;
236
+ totalAttempts: z.ZodMiniNumber<number>;
237
+ waitInClient: z.ZodMiniNumber<number>;
238
+ wlmQueue: z.ZodMiniOptional<z.ZodMiniString<string>>;
239
+ duration: z.ZodMiniCustom<Temporal.Duration, Temporal.Duration>;
240
+ endTime: z.ZodMiniOptional<z.ZodMiniCustom<Temporal.Instant, Temporal.Instant>>;
241
+ startTime: z.ZodMiniCustom<Temporal.Instant, Temporal.Instant>;
242
+ }, z.core.$strip>>;
243
+ export declare function createListJobs(config: SonarV2Config): {
244
+ getNextPage: (nextPage: string, { signal }?: SignalParam) => import("ts-results-es").AsyncResult<{
245
+ data: {
246
+ id: string;
247
+ queryType: "UI_RUN" | "UI_PREVIEW" | "UI_INTERNAL_PREVIEW" | "UI_INTERNAL_RUN" | "UI_EXPORT" | "ODBC" | "JDBC" | "REST" | "ACCELERATOR_CREATE" | "ACCELERATOR_DROP" | "UNKNOWN" | "PREPARE_INTERNAL" | "ACCELERATOR_EXPLAIN" | "UI_INITIAL_PREVIEW" | "METADATA_REFRESH" | "FLIGHT" | "INTERNAL_ICEBERG_METADATA_DROP";
248
+ state: string;
249
+ description: string;
250
+ user: string;
251
+ input: string;
252
+ output: string;
253
+ accelerated: boolean;
254
+ datasetVersion: string;
255
+ durationDetails: {
256
+ phaseDuration: string;
257
+ phaseName: "STARTING" | "RUNNING" | "PLANNING" | "PENDING" | "METADATA_RETRIEVAL" | "QUEUED" | "ENGINE_START" | "EXECUTION_PLANNING";
258
+ phaseStartTime: string;
259
+ }[];
260
+ isComplete: boolean;
261
+ outputLimited: boolean;
262
+ outputRecords: number;
263
+ plannerEstimatedCost: number;
264
+ queriedDatasets: {
265
+ datasetPathsList: string[];
266
+ datasetName?: string | undefined;
267
+ datasetPath?: string | undefined;
268
+ datasetType?: string | undefined;
269
+ versionContext?: string | undefined;
270
+ }[];
271
+ queryText: string;
272
+ requestType: string;
273
+ rowsScanned: number;
274
+ spilled: boolean;
275
+ starFlakeAccelerated: boolean;
276
+ totalAttempts: number;
277
+ waitInClient: number;
278
+ duration: Temporal.Duration;
279
+ startTime: Temporal.Instant;
280
+ enqueuedTime?: string | undefined;
281
+ wlmQueue?: string | undefined;
282
+ endTime?: Temporal.Instant | undefined;
283
+ }[];
284
+ next: string | undefined;
285
+ }, import("../index.ts").HttpError>;
286
+ listJobs: (params: z.infer<typeof jobListParamsSchema>, { signal }?: SignalParam) => import("ts-results-es").AsyncResult<{
287
+ data: {
288
+ id: string;
289
+ queryType: "UI_RUN" | "UI_PREVIEW" | "UI_INTERNAL_PREVIEW" | "UI_INTERNAL_RUN" | "UI_EXPORT" | "ODBC" | "JDBC" | "REST" | "ACCELERATOR_CREATE" | "ACCELERATOR_DROP" | "UNKNOWN" | "PREPARE_INTERNAL" | "ACCELERATOR_EXPLAIN" | "UI_INITIAL_PREVIEW" | "METADATA_REFRESH" | "FLIGHT" | "INTERNAL_ICEBERG_METADATA_DROP";
290
+ state: string;
291
+ description: string;
292
+ user: string;
293
+ input: string;
294
+ output: string;
295
+ accelerated: boolean;
296
+ datasetVersion: string;
297
+ durationDetails: {
298
+ phaseDuration: string;
299
+ phaseName: "STARTING" | "RUNNING" | "PLANNING" | "PENDING" | "METADATA_RETRIEVAL" | "QUEUED" | "ENGINE_START" | "EXECUTION_PLANNING";
300
+ phaseStartTime: string;
301
+ }[];
302
+ isComplete: boolean;
303
+ outputLimited: boolean;
304
+ outputRecords: number;
305
+ plannerEstimatedCost: number;
306
+ queriedDatasets: {
307
+ datasetPathsList: string[];
308
+ datasetName?: string | undefined;
309
+ datasetPath?: string | undefined;
310
+ datasetType?: string | undefined;
311
+ versionContext?: string | undefined;
312
+ }[];
313
+ queryText: string;
314
+ requestType: string;
315
+ rowsScanned: number;
316
+ spilled: boolean;
317
+ starFlakeAccelerated: boolean;
318
+ totalAttempts: number;
319
+ waitInClient: number;
320
+ duration: Temporal.Duration;
321
+ startTime: Temporal.Instant;
322
+ enqueuedTime?: string | undefined;
323
+ wlmQueue?: string | undefined;
324
+ endTime?: Temporal.Instant | undefined;
325
+ }[];
326
+ next: string | undefined;
327
+ }, import("../index.ts").HttpError>;
328
+ };
@@ -0,0 +1,223 @@
1
+ /*
2
+ * Copyright (C) 2024-2025 Dremio Corporation
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import * as z from "zod/mini";
17
+ import { Temporal } from "temporal-polyfill";
18
+ import parseMilliseconds from "parse-ms";
19
+ export const jobListParamsSchema = z.partial(z.strictObject({
20
+ contains: z.string().check(z.trim(), z.minLength(1)),
21
+ dateRange: z.strictObject({
22
+ end: z.optional(z.instanceof(Temporal.Instant)),
23
+ start: z.instanceof(Temporal.Instant),
24
+ }),
25
+ queryType: z.set(z.enum(["ACCELERATION", "DOWNLOAD", "EXTERNAL", "INTERNAL", "UI"])),
26
+ sort: z.strictObject({
27
+ direction: z.enum(["ASC", "DESC"]),
28
+ field: z.enum(["duration", "startTime", "user"]),
29
+ }),
30
+ status: z.set(z.enum(["SETUP", "QUEUED", "ENGINE_START", "RUNNING", "COMPLETED", "CANCELED", "FAILED"])),
31
+ user: z.set(z.string().check(z.trim(), z.minLength(1))),
32
+ }));
33
+ export function mapParams(params) {
34
+ const filter = [];
35
+ if (params.contains) {
36
+ filter.push(`*=contains=${JSON.stringify(params.contains)}`);
37
+ }
38
+ if (params.queryType?.size) {
39
+ filter.push(`(${Array.from(params.queryType)
40
+ .map((v) => `qt=="${v}"`)
41
+ .join(",")})`);
42
+ }
43
+ if (params.status?.size) {
44
+ filter.push(`(${Array.from(params.status)
45
+ .map((v) => `jst=="${v}"`)
46
+ .join(",")})`);
47
+ }
48
+ if (params.user?.size) {
49
+ filter.push(`(${Array.from(params.user)
50
+ .map((v) => `usr=="${v}"`)
51
+ .join(",")})`);
52
+ }
53
+ if (params.dateRange?.start) {
54
+ const { end, start } = params.dateRange;
55
+ filter.push(`(${[
56
+ start && `st=gt=${start.epochMilliseconds}`,
57
+ end && `st=lt=${end.epochMilliseconds}`,
58
+ ].join(";")})`);
59
+ }
60
+ return {
61
+ detailLevel: "1",
62
+ filter,
63
+ order: params.sort
64
+ ? params.sort.direction === "DESC"
65
+ ? "DESCENDING"
66
+ : "ASCENDING"
67
+ : undefined,
68
+ sort: params.sort ? fieldToV2Mapping[params.sort.field] : undefined,
69
+ };
70
+ }
71
+ const fieldToV2Mapping = {
72
+ duration: "dur",
73
+ startTime: "st",
74
+ user: "usr",
75
+ };
76
+ export const jobDetailsInSchema = z.object({
77
+ accelerated: z.boolean(),
78
+ datasetVersion: z.string(),
79
+ description: z.string(),
80
+ duration: z.number(),
81
+ durationDetails: z.array(z.object({
82
+ phaseDuration: z.string(),
83
+ phaseName: z.enum([
84
+ "EXECUTION_PLANNING",
85
+ "METADATA_RETRIEVAL",
86
+ "PENDING",
87
+ "PLANNING",
88
+ "QUEUED",
89
+ "RUNNING",
90
+ "STARTING",
91
+ "ENGINE_START",
92
+ ]),
93
+ phaseStartTime: z.string(),
94
+ })),
95
+ endTime: z.optional(z.number()),
96
+ enqueuedTime: z.optional(z.string()),
97
+ id: z.string(),
98
+ input: z.string(),
99
+ isComplete: z.boolean(),
100
+ output: z.string(),
101
+ outputLimited: z.boolean(),
102
+ outputRecords: z.number(),
103
+ plannerEstimatedCost: z.number(),
104
+ queriedDatasets: z.array(z.object({
105
+ datasetName: z.optional(z.string()),
106
+ datasetPath: z.optional(z.string()),
107
+ datasetPathsList: z.array(z.string()),
108
+ datasetType: z.optional(z.string()),
109
+ versionContext: z.optional(z.string()),
110
+ })),
111
+ queryText: z.string(),
112
+ queryType: z.enum([
113
+ "UI_RUN",
114
+ "UI_PREVIEW",
115
+ "UI_INTERNAL_PREVIEW",
116
+ "UI_INTERNAL_RUN",
117
+ "UI_EXPORT",
118
+ "ODBC",
119
+ "JDBC",
120
+ "REST",
121
+ "ACCELERATOR_CREATE",
122
+ "ACCELERATOR_DROP",
123
+ "UNKNOWN",
124
+ "PREPARE_INTERNAL",
125
+ "ACCELERATOR_EXPLAIN",
126
+ "UI_INITIAL_PREVIEW",
127
+ "METADATA_REFRESH",
128
+ "FLIGHT",
129
+ "INTERNAL_ICEBERG_METADATA_DROP",
130
+ ]),
131
+ requestType: z.string(),
132
+ rowsScanned: z.number(),
133
+ spilled: z.boolean(),
134
+ starFlakeAccelerated: z.boolean(),
135
+ startTime: z.number(),
136
+ state: z.string(),
137
+ totalAttempts: z.number(),
138
+ user: z.string(),
139
+ waitInClient: z.number(),
140
+ wlmQueue: z.optional(z.string()),
141
+ });
142
+ export const jobDetailsCodec = z.codec(jobDetailsInSchema, z.extend(z.omit(jobDetailsInSchema, {
143
+ duration: true,
144
+ endTime: true,
145
+ startTime: true,
146
+ }), {
147
+ duration: z.instanceof(Temporal.Duration),
148
+ endTime: z.optional(z.instanceof(Temporal.Instant)),
149
+ startTime: z.instanceof(Temporal.Instant),
150
+ }), {
151
+ decode(v) {
152
+ return {
153
+ ...v,
154
+ duration: Temporal.Duration.from(parseMilliseconds(v.duration)),
155
+ endTime: v.endTime ? Temporal.Instant.fromEpochMilliseconds(v.endTime) : undefined,
156
+ startTime: Temporal.Instant.fromEpochMilliseconds(v.startTime),
157
+ };
158
+ },
159
+ encode(v) {
160
+ return {
161
+ ...v,
162
+ duration: 0, // Skip installing something like to-milliseconds to achieve this
163
+ endTime: v.endTime ? v.endTime.epochMilliseconds : undefined,
164
+ startTime: v.startTime.epochMilliseconds,
165
+ };
166
+ },
167
+ });
168
+ export function createListJobs(config) {
169
+ return {
170
+ getNextPage: (nextPage, { signal } = {}) => {
171
+ return config
172
+ .sonarV2Request(`jobs-listing/v1.0/${new URL(nextPage, "https://dremio").search}`, {
173
+ headers: {
174
+ Accept: "application/json",
175
+ },
176
+ signal,
177
+ })
178
+ .map((res) => res.json())
179
+ .map((response) => ({
180
+ data: response.jobs.reduce((accum, curr) => {
181
+ const parseResult = z.safeDecode(jobDetailsCodec, curr);
182
+ if (!parseResult.success) {
183
+ // config.logger?.error(
184
+ // new Error(`Failed to parse job details`, { cause: parseResult.error }),
185
+ // );
186
+ }
187
+ else {
188
+ accum.push(parseResult.data);
189
+ }
190
+ return accum;
191
+ }, []),
192
+ next: response.next,
193
+ }));
194
+ },
195
+ listJobs: (params, { signal } = {}) => {
196
+ const searchParams = new URLSearchParams(Object.entries(mapParams(z.parse(jobListParamsSchema, params))).filter((entry) => !!entry[1]));
197
+ return config
198
+ .sonarV2Request(`jobs-listing/v1.0/?${searchParams.toString()}`, {
199
+ headers: {
200
+ Accept: "application/json",
201
+ },
202
+ signal,
203
+ })
204
+ .map((res) => res.json())
205
+ .map((response) => ({
206
+ data: response.jobs.reduce((accum, curr) => {
207
+ const parseResult = z.safeDecode(jobDetailsCodec, curr);
208
+ if (!parseResult.success) {
209
+ // config.logger?.error(
210
+ // new Error(`Failed to parse job details`, { cause: parseResult.error }),
211
+ // );
212
+ }
213
+ else {
214
+ accum.push(parseResult.data);
215
+ }
216
+ return accum;
217
+ }, []),
218
+ next: response.next,
219
+ }));
220
+ },
221
+ };
222
+ }
223
+ //# sourceMappingURL=listJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listJobs.js","sourceRoot":"","sources":["../../../src/oss/jobs/listJobs.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as z from \"zod/mini\";\nimport type { SonarV2Config } from \"../../common/Config.ts\";\nimport { Temporal } from \"temporal-polyfill\";\nimport type { SignalParam } from \"../../common/Params.ts\";\nimport parseMilliseconds from \"parse-ms\";\n\nexport const jobListParamsSchema = z.partial(\n z.strictObject({\n contains: z.string().check(z.trim(), z.minLength(1)),\n dateRange: z.strictObject({\n end: z.optional(z.instanceof(Temporal.Instant)),\n start: z.instanceof(Temporal.Instant),\n }),\n queryType: z.set(z.enum([\"ACCELERATION\", \"DOWNLOAD\", \"EXTERNAL\", \"INTERNAL\", \"UI\"])),\n sort: z.strictObject({\n direction: z.enum([\"ASC\", \"DESC\"]),\n field: z.enum([\"duration\", \"startTime\", \"user\"]),\n }),\n status: z.set(\n z.enum([\"SETUP\", \"QUEUED\", \"ENGINE_START\", \"RUNNING\", \"COMPLETED\", \"CANCELED\", \"FAILED\"]),\n ),\n user: z.set(z.string().check(z.trim(), z.minLength(1))),\n }),\n);\n\nexport function mapParams(params: z.infer<typeof jobListParamsSchema>) {\n const filter = [] as string[];\n\n if (params.contains) {\n filter.push(`*=contains=${JSON.stringify(params.contains)}`);\n }\n\n if (params.queryType?.size) {\n filter.push(\n `(${Array.from(params.queryType)\n .map((v) => `qt==\"${v}\"`)\n .join(\",\")})`,\n );\n }\n\n if (params.status?.size) {\n filter.push(\n `(${Array.from(params.status)\n .map((v) => `jst==\"${v}\"`)\n .join(\",\")})`,\n );\n }\n\n if (params.user?.size) {\n filter.push(\n `(${Array.from(params.user)\n .map((v) => `usr==\"${v}\"`)\n .join(\",\")})`,\n );\n }\n\n if (params.dateRange?.start) {\n const { end, start } = params.dateRange;\n filter.push(\n `(${[\n start && `st=gt=${start.epochMilliseconds}`,\n end && `st=lt=${end.epochMilliseconds}`,\n ].join(\";\")})`,\n );\n }\n\n return {\n detailLevel: \"1\",\n filter,\n order: params.sort\n ? params.sort.direction === \"DESC\"\n ? \"DESCENDING\"\n : \"ASCENDING\"\n : undefined,\n sort: params.sort ? fieldToV2Mapping[params.sort.field] : undefined,\n } as const;\n}\n\nconst fieldToV2Mapping = {\n duration: \"dur\",\n startTime: \"st\",\n user: \"usr\",\n} as const satisfies Record<\n NonNullable<z.infer<typeof jobListParamsSchema>[\"sort\"]>[\"field\"],\n unknown\n>;\n\nexport const jobDetailsInSchema = z.object({\n accelerated: z.boolean(),\n datasetVersion: z.string(),\n description: z.string(),\n duration: z.number(),\n durationDetails: z.array(\n z.object({\n phaseDuration: z.string(),\n phaseName: z.enum([\n \"EXECUTION_PLANNING\",\n \"METADATA_RETRIEVAL\",\n \"PENDING\",\n \"PLANNING\",\n \"QUEUED\",\n \"RUNNING\",\n \"STARTING\",\n \"ENGINE_START\",\n ]),\n phaseStartTime: z.string(),\n }),\n ),\n endTime: z.optional(z.number()),\n enqueuedTime: z.optional(z.string()),\n id: z.string(),\n input: z.string(),\n isComplete: z.boolean(),\n output: z.string(),\n outputLimited: z.boolean(),\n outputRecords: z.number(),\n plannerEstimatedCost: z.number(),\n queriedDatasets: z.array(\n z.object({\n datasetName: z.optional(z.string()),\n datasetPath: z.optional(z.string()),\n datasetPathsList: z.array(z.string()),\n datasetType: z.optional(z.string()),\n versionContext: z.optional(z.string()),\n }),\n ),\n queryText: z.string(),\n queryType: z.enum([\n \"UI_RUN\",\n \"UI_PREVIEW\",\n \"UI_INTERNAL_PREVIEW\",\n \"UI_INTERNAL_RUN\",\n \"UI_EXPORT\",\n \"ODBC\",\n \"JDBC\",\n \"REST\",\n \"ACCELERATOR_CREATE\",\n \"ACCELERATOR_DROP\",\n \"UNKNOWN\",\n \"PREPARE_INTERNAL\",\n \"ACCELERATOR_EXPLAIN\",\n \"UI_INITIAL_PREVIEW\",\n \"METADATA_REFRESH\",\n \"FLIGHT\",\n \"INTERNAL_ICEBERG_METADATA_DROP\",\n ]),\n requestType: z.string(),\n rowsScanned: z.number(),\n spilled: z.boolean(),\n starFlakeAccelerated: z.boolean(),\n startTime: z.number(),\n state: z.string(),\n totalAttempts: z.number(),\n user: z.string(),\n waitInClient: z.number(),\n wlmQueue: z.optional(z.string()),\n});\n\nexport const jobDetailsCodec = z.codec(\n jobDetailsInSchema,\n z.extend(\n z.omit(jobDetailsInSchema, {\n duration: true,\n endTime: true,\n startTime: true,\n }),\n {\n duration: z.instanceof(Temporal.Duration),\n endTime: z.optional(z.instanceof(Temporal.Instant)),\n startTime: z.instanceof(Temporal.Instant),\n },\n ),\n {\n decode(v) {\n return {\n ...v,\n duration: Temporal.Duration.from(parseMilliseconds(v.duration)),\n endTime: v.endTime ? Temporal.Instant.fromEpochMilliseconds(v.endTime) : undefined,\n startTime: Temporal.Instant.fromEpochMilliseconds(v.startTime),\n };\n },\n encode(v) {\n return {\n ...v,\n duration: 0, // Skip installing something like to-milliseconds to achieve this\n endTime: v.endTime ? v.endTime.epochMilliseconds : undefined,\n startTime: v.startTime.epochMilliseconds,\n };\n },\n },\n);\n\nexport function createListJobs(config: SonarV2Config) {\n return {\n getNextPage: (nextPage: string, { signal }: SignalParam = {}) => {\n return config\n .sonarV2Request(`jobs-listing/v1.0/${new URL(nextPage, \"https://dremio\").search}`, {\n headers: {\n Accept: \"application/json\",\n },\n signal,\n })\n .map(\n (res) =>\n res.json() as Promise<{ jobs: z.input<typeof jobDetailsCodec>[]; next?: string }>,\n )\n .map((response) => ({\n data: response.jobs.reduce(\n (accum, curr) => {\n const parseResult = z.safeDecode(jobDetailsCodec, curr);\n if (!parseResult.success) {\n // config.logger?.error(\n // new Error(`Failed to parse job details`, { cause: parseResult.error }),\n // );\n } else {\n accum.push(parseResult.data);\n }\n return accum;\n },\n [] as z.output<typeof jobDetailsCodec>[],\n ),\n next: response.next,\n }));\n },\n listJobs: (params: z.infer<typeof jobListParamsSchema>, { signal }: SignalParam = {}) => {\n const searchParams = new URLSearchParams(\n Object.entries(mapParams(z.parse(jobListParamsSchema, params))).filter(\n (entry) => !!entry[1],\n ) as string[][],\n );\n return config\n .sonarV2Request(`jobs-listing/v1.0/?${searchParams.toString()}`, {\n headers: {\n Accept: \"application/json\",\n },\n signal,\n })\n .map(\n (res) =>\n res.json() as Promise<{ jobs: z.input<typeof jobDetailsCodec>[]; next?: string }>,\n )\n .map((response) => ({\n data: response.jobs.reduce(\n (accum, curr) => {\n const parseResult = z.safeDecode(jobDetailsCodec, curr);\n if (!parseResult.success) {\n // config.logger?.error(\n // new Error(`Failed to parse job details`, { cause: parseResult.error }),\n // );\n } else {\n accum.push(parseResult.data);\n }\n return accum;\n },\n [] as z.output<typeof jobDetailsCodec>[],\n ),\n next: response.next,\n }));\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dremio/js-sdk",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
4
4
  "description": "JavaScript library for the Dremio API",
5
5
  "keywords": [
6
6
  "dremio",
@@ -39,22 +39,22 @@
39
39
  "rxjs": "^7",
40
40
  "temporal-polyfill": "^0.3.0",
41
41
  "ts-results-es": "^5.0.1",
42
- "zod": "^4"
42
+ "zod": "^4.1.0"
43
43
  },
44
44
  "devDependencies": {
45
- "@eslint/compat": "^1.3.1",
46
- "@eslint/js": "9.30.0",
47
- "eslint": "^9.30.0",
48
- "eslint-config-prettier": "10.1.5",
49
- "eslint-plugin-license-header": "0.8.0",
50
- "eslint-plugin-perfectionist": "4.15.0",
51
- "eslint-plugin-regexp": "2.9.0",
45
+ "@eslint/compat": "^1.4.0",
46
+ "@eslint/js": "^9.36.0",
47
+ "eslint": "^9.36.0",
48
+ "eslint-config-prettier": "^10.1.8",
49
+ "eslint-plugin-license-header": "^0.8.0",
50
+ "eslint-plugin-perfectionist": "^4.15.0",
51
+ "eslint-plugin-regexp": "^2.10.0",
52
52
  "js-green-licenses": "4.0.0",
53
53
  "prettier": "3.6.2",
54
54
  "semantic-release": "24.2.5",
55
- "typedoc": "0.28.6",
56
- "typescript": "5.8.3",
57
- "typescript-eslint": "8.35.0"
55
+ "typedoc": "0.28.13",
56
+ "typescript": "5.9.3",
57
+ "typescript-eslint": "^8.45.0"
58
58
  },
59
- "packageManager": "pnpm@10.7.1"
59
+ "packageManager": "pnpm@10.17.1"
60
60
  }