Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ class Client {
* @param {Query | string} query - The query to execute.
* @returns A promise that resolves to a QueryResult object.
*/
async query(query: Query | string): Promise<Iterator<QueryResult>> {
async query(query: Query | string, signal?: AbortSignal): Promise<Iterator<QueryResult>> {
const req = typeof query === 'string' ? {query} : query;
const headers: RawAxiosRequestHeaders = {
[TRINO_USER_HEADER]: req.user,
Expand All @@ -277,10 +277,15 @@ class Client {
url: '/v1/statement',
data: req.query,
headers: cleanHeaders(headers),
// Intentionally not passing the AbortSignal on this initial request to avoid a race condition where
// trino starts running the query and we never send a cancel for it
};
return this.request<QueryResult>(requestConfig).then(
result => new Iterator(new QueryIterator(this, result))
);
const createQueryRes = await this.request<QueryResult>(requestConfig);
signal?.addEventListener('abort', () => {
this.cancel(createQueryRes.id);
});

return new Iterator(new QueryIterator(this, createQueryRes, signal));
}

/**
Expand Down Expand Up @@ -363,7 +368,8 @@ export class Iterator<T> implements AsyncIterableIterator<T> {
export class QueryIterator implements AsyncIterableIterator<QueryResult> {
constructor(
private readonly client: Client,
private queryResult: QueryResult
private queryResult: QueryResult,
private readonly signal?: AbortSignal,
) {}

[Symbol.asyncIterator](): AsyncIterableIterator<QueryResult> {
Expand All @@ -390,6 +396,7 @@ export class QueryIterator implements AsyncIterableIterator<QueryResult> {

this.queryResult = await this.client.request<QueryResult>({
url: this.queryResult.nextUri,
signal: this.signal,
});

const data = this.queryResult.data ?? [];
Expand Down Expand Up @@ -418,8 +425,8 @@ export class Trino {
* @param query - The query to execute.
* @returns A QueryIterator object.
*/
async query(query: Query | string): Promise<Iterator<QueryResult>> {
return this.client.query(query);
async query(query: Query | string, signal?: AbortSignal): Promise<Iterator<QueryResult>> {
return this.client.query(query, signal);
}

/**
Expand Down