UNPKG

@equinor/fusion-query

Version:

Reactive data fetching and caching library with observable streams and comprehensive event system

87 lines (77 loc) 2.87 kB
import { v4 as generateGUID } from 'uuid'; import { type ActionInstanceMap, createAction, createAsyncAction, } from '@equinor/fusion-observable'; import type { ActionTypes } from '@equinor/fusion-observable'; import type { QueryClientResult, RetryOptions } from './types'; const createActions = <TType, TArgs>() => ({ /** * Action to initiate a request. * * @param args - The arguments for the request. * @param options - Optional parameters including a reference and retry options. * @returns An action with the request details and metadata. */ request: createAction( 'client/request', (args: TArgs, options?: { ref?: string; retry?: Partial<RetryOptions> }) => ({ payload: { args, options }, meta: { transaction: generateGUID(), created: Date.now() }, }), ), /** * Async action to execute a request. * * @param transaction - The unique identifier for the transaction. * @returns An async action with the transaction details and metadata. */ execute: createAsyncAction( 'client/execute', (transaction: string) => ({ payload: transaction, meta: { transaction, created: Date.now() }, }), (result: QueryClientResult<TType, TArgs>) => ({ payload: result, meta: { transaction: result.transaction, created: Date.now() }, }), (error: Error, transaction: string) => ({ payload: { error }, meta: { transaction, created: Date.now() }, }), ), /** * Action to cancel a request. * * @param transaction - The unique identifier for the transaction to cancel. * @param reason - Optional reason for cancellation. * @returns An action with the cancellation details and metadata. */ cancel: createAction('client/cancel', (transaction: string, reason?: string) => ({ payload: { transaction, reason }, meta: { transaction, created: Date.now() }, })), /** * Action to report an error. * * @param transaction - The unique identifier for the transaction that errored. * @param error - The error that occurred. * @returns An action with the error details and metadata. */ error: createAction('client/error', (transaction: string, error: unknown) => ({ payload: { transaction, error }, meta: { transaction, created: Date.now() }, })), }); export const actions = createActions(); // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ActionBuilder<TType = any, TArgs = any> = ReturnType< typeof createActions<TType, TArgs> >; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ActionMap<TType = any, TArgs = any> = ActionInstanceMap<ActionBuilder<TType, TArgs>>; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Actions<TType = any, TArgs = any> = ActionTypes<ActionMap<TType, TArgs>>; export default actions;