UNPKG

meilisearch

Version:

The Meilisearch JS client for Node.js and the browser.

176 lines (158 loc) 4.52 kB
import { MeiliSearchTimeOutError } from "./errors/index.js"; import type { Config, WaitOptions, TasksQuery, TasksResults, TaskObject, CancelTasksQuery, TasksResultsObject, DeleteTasksQuery, } from "./types.js"; import { TaskStatus } from "./types.js"; import { HttpRequests, toQueryParams } from "./http-requests.js"; import { sleep } from "./utils.js"; import { EnqueuedTask } from "./enqueued-task.js"; class Task { indexUid: TaskObject["indexUid"]; status: TaskObject["status"]; type: TaskObject["type"]; uid: TaskObject["uid"]; batchUid: TaskObject["batchUid"]; canceledBy: TaskObject["canceledBy"]; details: TaskObject["details"]; error: TaskObject["error"]; duration: TaskObject["duration"]; startedAt: Date; enqueuedAt: Date; finishedAt: Date; constructor(task: TaskObject) { this.indexUid = task.indexUid; this.status = task.status; this.type = task.type; this.uid = task.uid; this.batchUid = task.batchUid; this.details = task.details; this.canceledBy = task.canceledBy; this.error = task.error; this.duration = task.duration; this.startedAt = new Date(task.startedAt); this.enqueuedAt = new Date(task.enqueuedAt); this.finishedAt = new Date(task.finishedAt); } } class TaskClient { httpRequest: HttpRequests; constructor(config: Config) { this.httpRequest = new HttpRequests(config); } /** * Get one task * * @param uid - Unique identifier of the task * @returns */ async getTask(uid: number): Promise<Task> { const url = `tasks/${uid}`; const taskItem = await this.httpRequest.get<TaskObject>(url); return new Task(taskItem); } /** * Get tasks * * @param parameters - Parameters to browse the tasks * @returns Promise containing all tasks */ async getTasks(parameters: TasksQuery = {}): Promise<TasksResults> { const url = `tasks`; const tasks = await this.httpRequest.get<Promise<TasksResultsObject>>( url, toQueryParams<TasksQuery>(parameters), ); return { ...tasks, results: tasks.results.map((task) => new Task(task)), }; } /** * Wait for a task to be processed. * * @param taskUid - Task identifier * @param options - Additional configuration options * @returns Promise returning a task after it has been processed */ async waitForTask( taskUid: number, { timeOutMs = 5000, intervalMs = 50 }: WaitOptions = {}, ): Promise<Task> { const startingTime = Date.now(); while (Date.now() - startingTime < timeOutMs) { const response = await this.getTask(taskUid); if ( !( [ TaskStatus.TASK_ENQUEUED, TaskStatus.TASK_PROCESSING, ] as readonly string[] ).includes(response.status) ) return response; await sleep(intervalMs); } throw new MeiliSearchTimeOutError( `timeout of ${timeOutMs}ms has exceeded on process ${taskUid} when waiting a task to be resolved.`, ); } /** * Waits for multiple tasks to be processed * * @param taskUids - Tasks identifier list * @param options - Wait options * @returns Promise returning a list of tasks after they have been processed */ async waitForTasks( taskUids: number[], { timeOutMs = 5000, intervalMs = 50 }: WaitOptions = {}, ): Promise<Task[]> { const tasks: Task[] = []; for (const taskUid of taskUids) { const task = await this.waitForTask(taskUid, { timeOutMs, intervalMs, }); tasks.push(task); } return tasks; } /** * Cancel a list of enqueued or processing tasks. * * @param parameters - Parameters to filter the tasks. * @returns Promise containing an EnqueuedTask */ async cancelTasks(parameters: CancelTasksQuery = {}): Promise<EnqueuedTask> { const url = `tasks/cancel`; const task = await this.httpRequest.post( url, {}, toQueryParams<CancelTasksQuery>(parameters), ); return new EnqueuedTask(task); } /** * Delete a list tasks. * * @param parameters - Parameters to filter the tasks. * @returns Promise containing an EnqueuedTask */ async deleteTasks(parameters: DeleteTasksQuery = {}): Promise<EnqueuedTask> { const url = `tasks`; const task = await this.httpRequest.delete( url, {}, toQueryParams<DeleteTasksQuery>(parameters), ); return new EnqueuedTask(task); } } export { TaskClient, Task };