@pixotope/query 0.4.0 → 0.6.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.
package/dist/index.d.ts CHANGED
@@ -4,8 +4,8 @@ import { ZMQClient, TSocketServerCallOptions, ZMQProxyWSClient } from '@pixotope
4
4
  interface QueryOptions<TData = unknown, TError = unknown, TParams = void, TSelectData = TData, Stateless extends true | undefined = undefined> {
5
5
  queryFn: (params: TParams | undefined | void) => Promise<TData>;
6
6
  onSuccess?: (data: TData) => Promise<void> | void;
7
- onError?: (error: TError) => Promise<void> | void;
8
- onSettled?: (data: TData | undefined, error: TError | undefined) => Promise<void> | void;
7
+ onError?: (error: TQueryError<TError>) => Promise<void> | void;
8
+ onSettled?: (data: TData | undefined, error: TQueryError<TError> | undefined) => Promise<void> | void;
9
9
  timeout?: number;
10
10
  enabled?: boolean;
11
11
  initialData?: TData | Functionize<TData>;
@@ -22,8 +22,9 @@ type WithData$1<TData> = {
22
22
  data: TData | undefined;
23
23
  };
24
24
  type TQueryKey = readonly any[];
25
+ type TQueryError<TError> = TError | Error | null;
25
26
  type UseQueryResult<TData = unknown, TError = unknown, TParams = void, TSelectData = TData, Stateless extends true | undefined = undefined> = {
26
- error: TError | null;
27
+ error: TQueryError<TError>;
27
28
  status: QueryStatus;
28
29
  refetch: (params: TParams | void | undefined) => Promise<void>;
29
30
  reset: () => void;
@@ -35,16 +36,17 @@ interface MutationOptions<TData = unknown, TError = unknown, TParams = void> {
35
36
  mutationFn: MutationFunction<TData, TParams>;
36
37
  params?: TParams;
37
38
  onSuccess?: (data: TData, variables: TParams) => Promise<unknown> | unknown;
38
- onError?: (error: TError, variables: TParams) => Promise<unknown> | unknown;
39
- onSettled?: (data: TData | undefined, error: TError | null, variables: TParams) => Promise<unknown> | unknown;
39
+ onError?: (error: TMutationError<TError>, variables: TParams) => Promise<unknown> | unknown;
40
+ onSettled?: (data: TData | undefined, error: TMutationError<TError> | null, variables: TParams) => Promise<unknown> | unknown;
40
41
  compareOrThrow?: (result: TData | TError) => boolean;
41
42
  timeout?: number;
42
43
  prepareParams?: (variables: TParams, defaults?: TParams) => TParams;
43
44
  }
45
+ type TMutationError<TError> = TError | Error | null;
44
46
  interface MutateOptions<TData = unknown, TError = unknown, TParams = void> {
45
47
  onSuccess?: (data: TData, variables: TParams) => void;
46
- onError?: (error: TError, variables: TParams) => void;
47
- onSettled?: (data: TData | undefined, error: TError | null, variables: TParams) => void;
48
+ onError?: (error: TMutationError<TError>, variables: TParams) => void;
49
+ onSettled?: (data: TData | undefined, error: TMutationError<TError> | null, variables: TParams) => void;
48
50
  }
49
51
  type MutationStatus = "idle" | "loading" | "success" | "error";
50
52
  declare class ComparisonFailError<TPayload = unknown> extends Error {
@@ -105,7 +107,7 @@ declare const useMutation: <TData = unknown, TError = unknown, TParams = void>(o
105
107
  overrideTargetMachine?: string;
106
108
  }) => void;
107
109
  reset: () => void;
108
- error: TError | null;
110
+ error: TMutationError<TError>;
109
111
  };
110
112
 
111
113
  type MutationInfo<TData, TError, TParams> = {
@@ -119,10 +121,7 @@ type TPromiseFunction<TResponse, TParams> = (args: Omit<ZMQClient.Call<TResponse
119
121
  parameters: TParams;
120
122
  options?: Omit<TSocketServerCallOptions, "toCallIfNoResponse">;
121
123
  }>, "id">) => Promise<TResponse>;
122
- declare const useCallMutationBase: <TFnToParams extends FnToParamsBase, TData = unknown, TError = unknown, TParams = unknown>(promiseFunc: TPromiseFunction<TData, TParams>, functionName: keyof TFnToParams, service: string, options?: Omit<MutationOptions<TData, TError, TParams>, "mutationFn"> & {
123
- avoidTimeout?: boolean;
124
- customTimeout?: number;
125
- }) => {
124
+ declare const useCallMutationBase: <TFnToParams extends FnToParamsBase, TData = unknown, TError = unknown, TParams = unknown>(promiseFunc: TPromiseFunction<TData, TParams>, functionName: keyof TFnToParams, service: string, options?: Omit<MutationOptions<TData, TError, TParams>, "mutationFn">) => {
126
125
  mutateAsync: (params: TParams, overrideTargetMachine?: string) => Promise<TData>;
127
126
  status: "idle" | "loading" | "success" | "error";
128
127
  result: TData | undefined;
@@ -130,7 +129,7 @@ declare const useCallMutationBase: <TFnToParams extends FnToParamsBase, TData =
130
129
  overrideTargetMachine?: string;
131
130
  }) | undefined) => void;
132
131
  reset: () => void;
133
- error: TError | null;
132
+ error: Error | TError | null;
134
133
  };
135
134
  declare function buildMutationHook<TFnToParams extends FnToParamsBase>(promiseFunc: TPromiseFunction<unknown, unknown>, genTargetService: (machine: string | undefined) => string): <TFn extends keyof TFnToParams>(func: TFn, options?: Parameters<typeof useCallMutationBase<TFnToParams, TFnToParams[TFn]["data"], TFnToParams[TFn]["error"], TFnToParams[TFn]["params"]>>[3] & {
136
135
  machine?: string;
@@ -142,12 +141,9 @@ declare function buildMutationHook<TFnToParams extends FnToParamsBase>(promiseFu
142
141
  overrideTargetMachine?: string;
143
142
  }) | undefined) => void;
144
143
  reset: () => void;
145
- error: TFnToParams[TFn]["error"] | null;
144
+ error: Error | TFnToParams[TFn]["error"] | null;
146
145
  };
147
- declare const useCallQueryBase: <TFnToParams extends FnToParamsBase, TData = unknown, TError = unknown, TParams = unknown, TSelect = TData>(promiseFunction: TPromiseFunction<TData, TParams>, functionName: keyof TFnToParams, params: TParams, service: string, options?: Omit<QueryOptions<TData, TError, TParams, TSelect>, "queryFn"> & {
148
- avoidTimeout?: boolean;
149
- customTimeout?: number;
150
- }) => UseQueryResult<TSelect, TError, TParams, TSelect, undefined>;
146
+ declare const useCallQueryBase: <TFnToParams extends FnToParamsBase, TData = unknown, TError = unknown, TParams = unknown, TSelect = TData>(promiseFunction: TPromiseFunction<TData, TParams>, functionName: keyof TFnToParams, params: TParams, service: string, options?: Omit<QueryOptions<TData, TError, TParams, TSelect>, "queryFn">) => UseQueryResult<TSelect, TError, TParams, TSelect, undefined>;
151
147
  declare function buildQueryHook<TFnToParams extends FnToParamsBase>(promiseFunction: TPromiseFunction<unknown, unknown>, getTargetService: (machine: string | undefined) => string): <TFn extends keyof TFnToParams, TSelect = TFnToParams[TFn]["data"]>(func: TFn, params: TFnToParams[TFn]["params"], options?: Parameters<typeof useCallQueryBase<TFnToParams, TFnToParams[TFn]["data"], TFnToParams[TFn]["error"], TFnToParams[TFn]["params"], TSelect>>[4] & {
152
148
  machine?: string;
153
149
  }) => UseQueryResult<TSelect, TFnToParams[TFn]["error"], TFnToParams[TFn]["params"], TSelect, undefined>;
package/dist/index.js CHANGED
@@ -185,7 +185,7 @@ var useMutation = (options) => {
185
185
  internalCallbackRef.current = internalCallbackRefistry;
186
186
  const mutateAsync = useCallback(
187
187
  (params2, overrideTargetMachine) => __async(null, null, function* () {
188
- var _a, _b, _c, _d, _e, _f;
188
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
189
189
  setStatus("loading");
190
190
  setError(null);
191
191
  try {
@@ -221,12 +221,8 @@ var useMutation = (options) => {
221
221
  } catch (error2) {
222
222
  setError(error2);
223
223
  setStatus("error");
224
- if (internalCallbackRef.current.onError) {
225
- internalCallbackRef.current.onError(error2, params2);
226
- }
227
- if (internalCallbackRef.current.onSettled) {
228
- internalCallbackRef.current.onSettled(void 0, error2, params2);
229
- }
224
+ (_h = (_g = internalCallbackRef.current).onError) == null ? void 0 : _h.call(_g, error2, params2);
225
+ (_j = (_i = internalCallbackRef.current).onSettled) == null ? void 0 : _j.call(_i, void 0, error2, params2);
230
226
  throw error2;
231
227
  }
232
228
  }),
@@ -254,7 +250,11 @@ var useMutation = (options) => {
254
250
  status,
255
251
  result,
256
252
  mutate,
257
- reset: () => setStatus("idle"),
253
+ reset: () => {
254
+ setStatus("idle");
255
+ setError(null);
256
+ setResult(void 0);
257
+ },
258
258
  error
259
259
  };
260
260
  };
@@ -264,6 +264,7 @@ import { useCallback as useCallback2, useEffect, useRef as useRef2, useState as
264
264
  function normalizeQueryKey(queryKey) {
265
265
  return JSON.stringify(queryKey);
266
266
  }
267
+ var getRandomUUID = () => Math.random().toString(36).substring(2, 15);
267
268
  var useQuery = (_a) => {
268
269
  var _b = _a, {
269
270
  queryFn
@@ -285,7 +286,6 @@ var useQuery = (_a) => {
285
286
  key: queryKeyPassed
286
287
  } = options;
287
288
  const queryKey = normalizeQueryKey(queryKeyPassed != null ? queryKeyPassed : []);
288
- const promiseResolutionInProgress = useRef2(false);
289
289
  const lastFetchedAt = useRef2(null);
290
290
  const lastQueryKey = useRef2(void 0);
291
291
  const queryFnRef = useRef2(queryFn);
@@ -314,6 +314,7 @@ var useQuery = (_a) => {
314
314
  stateless,
315
315
  timeout
316
316
  };
317
+ const requestIdRef = useRef2(getRandomUUID());
317
318
  const [status, setStatus] = useState2(() => {
318
319
  return "idle";
319
320
  });
@@ -346,7 +347,9 @@ var useQuery = (_a) => {
346
347
  const refetch = useCallback2(
347
348
  (params = void 0) => __async(null, null, function* () {
348
349
  var _a2, _b2, _c, _d, _e, _f, _g, _h;
349
- if (promiseResolutionInProgress.current || !internalOptionsRef.current.enabled) {
350
+ const requestId = getRandomUUID();
351
+ requestIdRef.current = requestId;
352
+ if (!internalOptionsRef.current.enabled) {
350
353
  return;
351
354
  }
352
355
  setStatus("loading");
@@ -363,15 +366,16 @@ var useQuery = (_a) => {
363
366
  )
364
367
  ] : []
365
368
  ];
366
- promiseResolutionInProgress.current = true;
367
369
  const res = yield Promise.race(promises);
368
- promiseResolutionInProgress.current = false;
370
+ if (requestIdRef.current !== requestId) {
371
+ return;
372
+ }
369
373
  if (res === "timeout") {
370
374
  throw new Error("timeout");
371
375
  }
372
376
  handleSetData(res);
373
377
  if (internalCallbackRef.current.compareOrThrow && internalCallbackRef.current.compareOrThrow(res) === true) {
374
- throw new Error("compareOrThrow");
378
+ throw new Error("failedComparison");
375
379
  }
376
380
  setStatus("success");
377
381
  lastFetchedAt.current = (/* @__PURE__ */ new Date()).getTime();
@@ -393,36 +397,17 @@ var useQuery = (_a) => {
393
397
  refetch();
394
398
  }, [refetch]);
395
399
  useEffect(() => {
396
- if (enabled) {
397
- refetch();
398
- }
399
- }, [enabled, refetch, queryKey]);
400
- useEffect(() => {
401
- if (lastQueryKey.current === void 0) {
402
- lastQueryKey.current = queryKey;
403
- refetch();
404
- return;
405
- }
406
- if (queryKey !== lastQueryKey.current) {
407
- lastQueryKey.current = queryKey;
408
- refetch();
409
- }
410
- }, [queryKey, refetch, enabled]);
411
- useEffect(() => {
400
+ const cleanups = [];
412
401
  if (refetchOnWindowFocus) {
413
402
  const queryHandleFocus = () => {
414
- if (shouldRefetch()) {
415
- refetch();
416
- }
403
+ refetch();
417
404
  };
418
405
  window.addEventListener("focus", queryHandleFocus);
419
- return () => {
406
+ cleanups.push(() => {
420
407
  window.removeEventListener("focus", queryHandleFocus);
421
- };
408
+ });
422
409
  }
423
- }, [refetchOnWindowFocus, refetch, shouldRefetch]);
424
- useEffect(() => {
425
- if (refetchInterval !== 0) {
410
+ if (refetchInterval > 0) {
426
411
  const interval = setInterval(
427
412
  () => {
428
413
  if (shouldRefetch()) {
@@ -431,11 +416,25 @@ var useQuery = (_a) => {
431
416
  },
432
417
  Math.max(refetchInterval, 1e3)
433
418
  );
434
- return () => {
419
+ cleanups.push(() => {
435
420
  clearInterval(interval);
436
- };
421
+ });
422
+ }
423
+ if (lastQueryKey.current === void 0 || queryKey !== lastQueryKey.current) {
424
+ lastQueryKey.current = queryKey;
425
+ refetch();
437
426
  }
438
- }, [refetch, refetchInterval, shouldRefetch]);
427
+ return () => {
428
+ cleanups.forEach((cleanup) => cleanup());
429
+ };
430
+ }, [
431
+ queryKey,
432
+ enabled,
433
+ refetchOnWindowFocus,
434
+ refetchInterval,
435
+ shouldRefetch,
436
+ refetch
437
+ ]);
439
438
  return {
440
439
  data: select && data !== void 0 ? select(data) : data,
441
440
  error,
@@ -447,13 +446,8 @@ var useQuery = (_a) => {
447
446
 
448
447
  // src/factories.ts
449
448
  var useCallMutationBase = (promiseFunc, functionName, service, options) => {
450
- const _a = useMemo(() => options != null ? options : {}, [options]), {
451
- avoidTimeout = true,
452
- customTimeout = void 0
453
- } = _a, rest = __objRest(_a, [
454
- "avoidTimeout",
455
- "customTimeout"
456
- ]);
449
+ const timeout = options == null ? void 0 : options.timeout;
450
+ const rest = __objRest(useMemo(() => options != null ? options : {}, [options]), []);
457
451
  const mutationFn = useCallback3(
458
452
  (parameters) => __async(null, null, function* () {
459
453
  try {
@@ -462,15 +456,18 @@ var useCallMutationBase = (promiseFunc, functionName, service, options) => {
462
456
  functionName: functionName.toString(),
463
457
  parameters,
464
458
  options: {
465
- avoidTimeout,
466
- customTimeout
459
+ avoidTimeout: !timeout,
460
+ customTimeout: timeout
467
461
  }
468
462
  });
469
463
  } catch (e) {
470
- throw e.message;
464
+ if (e instanceof Error) {
465
+ throw e;
466
+ }
467
+ throw new Error(e);
471
468
  }
472
469
  }),
473
- [avoidTimeout, customTimeout, functionName, service]
470
+ [functionName, service, timeout]
474
471
  );
475
472
  return useMutation(__spreadValues({
476
473
  mutationFn
@@ -483,13 +480,8 @@ function buildMutationHook(promiseFunc, genTargetService) {
483
480
  };
484
481
  }
485
482
  var useCallQueryBase = (promiseFunction, functionName, params, service, options) => {
486
- const _a = useMemo(() => options != null ? options : {}, [options]), {
487
- avoidTimeout = true,
488
- customTimeout = void 0
489
- } = _a, rest = __objRest(_a, [
490
- "avoidTimeout",
491
- "customTimeout"
492
- ]);
483
+ const timeout = options == null ? void 0 : options.timeout;
484
+ const rest = __objRest(useMemo(() => options != null ? options : {}, [options]), []);
493
485
  const queryFn = useCallback3(
494
486
  (refetchParams, overrideTargetMachine) => __async(null, null, function* () {
495
487
  try {
@@ -498,8 +490,8 @@ var useCallQueryBase = (promiseFunction, functionName, params, service, options)
498
490
  functionName: functionName.toString(),
499
491
  parameters: refetchParams != null ? refetchParams : params,
500
492
  options: {
501
- avoidTimeout,
502
- customTimeout
493
+ avoidTimeout: !timeout,
494
+ customTimeout: timeout
503
495
  }
504
496
  });
505
497
  } catch (e) {
@@ -509,7 +501,7 @@ var useCallQueryBase = (promiseFunction, functionName, params, service, options)
509
501
  throw new Error(e);
510
502
  }
511
503
  }),
512
- [avoidTimeout, customTimeout, functionName, service, params]
504
+ [functionName, service, params, timeout]
513
505
  );
514
506
  return useQuery(__spreadValues({
515
507
  queryFn
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../utils/dist/comparison/index.js","../src/factories.ts","../src/useMutation.ts","../src/useQuery.ts","../src/useSubscriptionCore.ts","../src/useSubscription.ts","../src/proxyBinders.ts"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/comparison/index.ts\nvar comparison_exports = {};\n__export(comparison_exports, {\n shallowEqual: () => shallowEqual\n});\nmodule.exports = __toCommonJS(comparison_exports);\n\n// src/comparison/shallowEqual.ts\nfunction shallowEqual(objA, objB) {\n if (Object.is(objA, objB)) {\n return true;\n }\n if (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) {\n return false;\n }\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false;\n for (const [key, value] of objA) {\n if (!Object.is(value, objB.get(key))) {\n return false;\n }\n }\n return true;\n }\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false;\n for (const value of objA) {\n if (!objB.has(value)) {\n return false;\n }\n }\n return true;\n }\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n return false;\n }\n for (let i = 0; i < keysA.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n return true;\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n shallowEqual\n});\n","import type { TSocketServerCallOptions, ZMQClient } from \"@pixotope/zmq-client\";\nimport { useCallback, useMemo } from \"react\";\nimport { MutationOptions, useMutation } from \"./useMutation\";\nimport { QueryOptions, useQuery } from \"./useQuery\";\n\nexport type MutationInfo<TData, TError, TParams> = {\n data: TData;\n error: TError;\n params: TParams;\n};\n\ntype FnToParamsBase = Record<string, MutationInfo<unknown, unknown, unknown>>;\n\nexport type TPromiseFunction<TResponse, TParams> = (\n args: Omit<\n ZMQClient.Call<\n TResponse,\n {\n functionName: string;\n parameters: TParams;\n options?: Omit<TSocketServerCallOptions, \"toCallIfNoResponse\">;\n }\n >,\n \"id\"\n >\n) => Promise<TResponse>;\n\nconst useCallMutationBase = <\n TFnToParams extends FnToParamsBase,\n TData = unknown,\n TError = unknown,\n TParams = unknown,\n>(\n promiseFunc: TPromiseFunction<TData, TParams>,\n functionName: keyof TFnToParams,\n service: string,\n options?: Omit<MutationOptions<TData, TError, TParams>, \"mutationFn\"> & {\n avoidTimeout?: boolean;\n customTimeout?: number;\n }\n) => {\n const {\n avoidTimeout = true,\n customTimeout = undefined,\n ...rest\n } = useMemo(() => options ?? {}, [options]);\n const mutationFn = useCallback(\n async (parameters: TParams) => {\n try {\n return await promiseFunc({\n service,\n functionName: functionName.toString(),\n parameters,\n options: {\n avoidTimeout,\n customTimeout,\n },\n });\n } catch (e: any) {\n throw e.message;\n }\n },\n [avoidTimeout, customTimeout, functionName, service]\n );\n\n return useMutation<TData, TError, TParams>({\n mutationFn,\n ...rest,\n });\n};\n\nexport function buildMutationHook<TFnToParams extends FnToParamsBase>(\n promiseFunc: TPromiseFunction<unknown, unknown>,\n genTargetService: (machine: string | undefined) => string\n) {\n return function useCallMutationBuilder<TFn extends keyof TFnToParams>(\n func: TFn,\n options?: Parameters<\n typeof useCallMutationBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"]\n >\n >[3] & { machine?: string }\n ) {\n const targetService = genTargetService(options?.machine);\n\n return useCallMutationBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"]\n >(promiseFunc, func, targetService, options);\n };\n}\n\nconst useCallQueryBase = <\n TFnToParams extends FnToParamsBase,\n TData = unknown,\n TError = unknown,\n TParams = unknown,\n TSelect = TData,\n>(\n promiseFunction: TPromiseFunction<TData, TParams>,\n functionName: keyof TFnToParams,\n params: TParams,\n service: string,\n options?: Omit<QueryOptions<TData, TError, TParams, TSelect>, \"queryFn\"> & {\n avoidTimeout?: boolean;\n customTimeout?: number;\n }\n) => {\n const {\n avoidTimeout = true,\n customTimeout = undefined,\n ...rest\n } = useMemo(() => options ?? {}, [options]);\n const queryFn = useCallback(\n async (refetchParams: TParams | void, overrideTargetMachine?: string) => {\n try {\n return await promiseFunction({\n service: overrideTargetMachine ?? service,\n functionName: functionName.toString(),\n parameters: refetchParams ?? params,\n options: {\n avoidTimeout,\n customTimeout,\n },\n });\n } catch (e) {\n if (e instanceof Error) {\n throw e;\n }\n throw new Error(e as string);\n }\n },\n [avoidTimeout, customTimeout, functionName, service, params]\n );\n\n return useQuery<TData, TError, TParams, TSelect>({\n queryFn,\n ...rest,\n });\n};\n\nexport function buildQueryHook<TFnToParams extends FnToParamsBase>(\n promiseFunction: TPromiseFunction<unknown, unknown>,\n getTargetService: (machine: string | undefined) => string\n) {\n return function useCallQueryBuilder<\n TFn extends keyof TFnToParams,\n TSelect = TFnToParams[TFn][\"data\"],\n >(\n func: TFn,\n params: TFnToParams[TFn][\"params\"],\n options?: Parameters<\n typeof useCallQueryBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"],\n TSelect\n >\n >[4] & { machine?: string }\n ) {\n const targetService = getTargetService(options?.machine);\n\n return useCallQueryBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"],\n TSelect\n >(promiseFunction, func, params, targetService, options);\n };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nexport type MutationFunction<TData = unknown, TParams = unknown> = (\n params: TParams,\n overrideTargetMachine?: string\n) => Promise<TData>;\n\nexport interface MutationOptions<\n TData = unknown,\n TError = unknown,\n TParams = void,\n> {\n mutationFn: MutationFunction<TData, TParams>;\n params?: TParams;\n onSuccess?: (data: TData, variables: TParams) => Promise<unknown> | unknown;\n onError?: (error: TError, variables: TParams) => Promise<unknown> | unknown;\n onSettled?: (\n data: TData | undefined,\n error: TError | null,\n variables: TParams\n ) => Promise<unknown> | unknown;\n compareOrThrow?: (result: TData | TError) => boolean;\n timeout?: number;\n prepareParams?: (variables: TParams, defaults?: TParams) => TParams;\n}\n\nexport interface MutateOptions<\n TData = unknown,\n TError = unknown,\n TParams = void,\n> {\n onSuccess?: (data: TData, variables: TParams) => void;\n onError?: (error: TError, variables: TParams) => void;\n onSettled?: (\n data: TData | undefined,\n error: TError | null,\n variables: TParams\n ) => void;\n}\n\ntype MutationStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\ntype RaceErrorReason = \"timeout\";\ntype RacePromises<T> = Promise<T | RaceErrorReason>;\n\nexport class ComparisonFailError<TPayload = unknown> extends Error {\n public readonly payload: TPayload;\n\n constructor(message: string, payload: TPayload) {\n super(message);\n this.name = this.constructor.name;\n this.payload = payload;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ComparisonFailError);\n }\n }\n}\n\n/**\n * `useMutation` is a hook that allows you to perform a mutation/push updates to the services while\n * providing extensive API to tap into the status and results of the mutation.\n * @param mutationFn The mutation function to be called when the `mutate` function is called.\n * `useMutation` does not care about what the function does, all it needs it a function that returns\n * a promise.\n * @param options Options to configure the mutation.\n * @returns An object with the following properties:\n * - `mutateAsync`: A function that takes in the variables and returns a promise that resolves to the\n * result of the mutation. This function can be awaited to get the result of the mutation. Callbacks can\n * be passed to this function to be called when the mutation is successful or when it fails. It's good idea\n * to wrap this function in a try/catch block.\n * - `mutate`: A function that takes in the variables and returns nothing. This function does not\n * return a promise. Callbacks can be passed to this function to be called when the mutation is\n * successful or when it fails.\n * - `status`: The status of the mutation. Can be one of `idle`, `loading`, `success` or `error`.\n * - `result`: The result of the mutation. This is undefined until the mutation is successful.\n * - `reset`: A function that resets the mutation to the initial state.\n * - `error`: The error object if the mutation has failed.\n * @example\n * ```typescript\n * const mutationRes = useMutation({\n * mutationFn: (variables) => {\n * return ZMQHelper.callSomethingAsync(variables)\n * },\n * onSuccess: (data) => {\n * // do something with the result\n * },\n * onError: (error) => {\n * // do something with the error\n * },\n * onSettled: (data, error) => {\n * // do something when the mutation is done\n * }});\n *\n * // call the mutation\n * const res = await mutationRes.mutateAsync({ foo: \"bar\" });\n * // OR\n * mutationRes.mutate({ foo: \"bar\" }, {\n * onSuccess: (data) => {\n * // do something with the result\n * // for example show a toast message\n * // stop local loading state\n * });\n * ```\n */\nexport const useMutation = <TData = unknown, TError = unknown, TParams = void>(\n options: MutationOptions<TData, TError, TParams>\n) => {\n const {\n mutationFn,\n compareOrThrow,\n onError,\n onSettled,\n onSuccess,\n prepareParams,\n params,\n timeout,\n } = options;\n const [status, setStatus] = useState<MutationStatus>(\"idle\");\n const [error, setError] = useState<TError | null>(null);\n const [result, setResult] = useState<TData | undefined>(undefined);\n const mutationFnRef = useRef(mutationFn);\n const internalOptionsRef = useRef({\n params,\n timeout,\n });\n const internalCallbackRefistry = <const>{\n onSuccess,\n onError,\n onSettled,\n compareOrThrow,\n prepareParams,\n };\n const internalCallbackRef = useRef(internalCallbackRefistry);\n internalCallbackRef.current = internalCallbackRefistry;\n\n const mutateAsync = useCallback(\n async (params: TParams, overrideTargetMachine?: string) => {\n setStatus(\"loading\");\n setError(null);\n\n try {\n const promises: RacePromises<TData>[] = [\n mutationFnRef.current(\n internalCallbackRef.current.prepareParams\n ? internalCallbackRef.current.prepareParams(\n params,\n internalOptionsRef.current.params\n )\n : params,\n overrideTargetMachine\n ),\n ...(internalOptionsRef.current.timeout\n ? [\n new Promise<RaceErrorReason>((resolve) =>\n setTimeout(\n () => resolve(\"timeout\"),\n internalOptionsRef.current.timeout\n )\n ),\n ]\n : []),\n ];\n\n const res = await Promise.race(promises);\n\n if (res === \"timeout\") {\n throw new Error(\"timeout\");\n }\n\n if (internalCallbackRef.current.compareOrThrow?.(res)) {\n throw new ComparisonFailError(JSON.stringify(res), res);\n }\n\n setResult(res);\n setStatus(\"success\");\n\n internalCallbackRef.current.onSuccess?.(res, params);\n internalCallbackRef.current.onSettled?.(res, null, params);\n\n return res;\n } catch (error: any) {\n setError(error);\n setStatus(\"error\");\n\n if (internalCallbackRef.current.onError) {\n internalCallbackRef.current.onError(error, params);\n }\n\n if (internalCallbackRef.current.onSettled) {\n internalCallbackRef.current.onSettled(undefined, error, params);\n }\n\n throw error;\n }\n },\n []\n );\n\n const mutate = useCallback(\n (\n variables: TParams,\n options?: MutateOptions<TData, TError, TParams> & {\n overrideTargetMachine?: string;\n }\n ) => {\n mutateAsync(variables, options?.overrideTargetMachine).then(\n (data) => {\n options?.onSuccess?.(data, variables);\n options?.onSettled?.(data, null, variables);\n },\n (error) => {\n options?.onError?.(error, variables);\n options?.onSettled?.(undefined, error, variables);\n }\n );\n },\n [mutateAsync]\n );\n\n return {\n mutateAsync,\n status,\n result,\n mutate,\n reset: () => setStatus(\"idle\"),\n error,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface QueryOptions<\n TData = unknown,\n TError = unknown,\n TParams = void,\n TSelectData = TData,\n Stateless extends true | undefined = undefined,\n> {\n queryFn: (params: TParams | undefined | void) => Promise<TData>;\n onSuccess?: (data: TData) => Promise<void> | void;\n onError?: (error: TError) => Promise<void> | void;\n onSettled?: (\n data: TData | undefined,\n error: TError | undefined\n ) => Promise<void> | void;\n timeout?: number;\n enabled?: boolean;\n initialData?: TData | Functionize<TData>;\n select?: (data: TData) => TSelectData;\n refetchOnWindowFocus?: boolean;\n refetchInterval?: number;\n compareOrThrow?: (data: TData) => boolean;\n stateless?: Stateless;\n key?: TQueryKey;\n}\n\ntype Functionize<T> = () => T;\ntype QueryStatus = \"idle\" | \"loading\" | \"success\" | \"error\" | \"timeout\";\ntype RaceErrorReason = \"timeout\";\ntype RacePromises<T> = Promise<T | RaceErrorReason>;\ntype WithData<TData> = { data: TData | undefined };\ntype TQueryKey = readonly any[];\n\nexport type UseQueryResult<\n TData = unknown,\n TError = unknown,\n TParams = void,\n TSelectData = TData,\n Stateless extends true | undefined = undefined,\n> = {\n error: TError | null;\n status: QueryStatus;\n refetch: (params: TParams | void | undefined) => Promise<void>;\n reset: () => void;\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n} & (Stateless extends true ? {} : WithData<TSelectData>);\n\nfunction normalizeQueryKey(queryKey: TQueryKey): string {\n return JSON.stringify(queryKey);\n}\n\ntype TInternalCallbackRef<TData, TError, TSelectData> = {\n onError?: (error: TError) => Promise<void> | void;\n onSuccess?: (data: TData) => Promise<void> | void;\n onSettled?: (\n data: TData | undefined,\n error: TError | undefined\n ) => Promise<void> | void;\n compareOrThrow?: (data: TData) => boolean;\n select?: (data: TData) => TSelectData;\n};\n\ntype TInternalOptionsRef<TData> = {\n timeout?: number;\n enabled: boolean;\n refetchOnWindowFocus: boolean;\n refetchInterval: number;\n compareOrThrow?: (data: TData) => boolean;\n stateless?: boolean;\n};\n\nexport const useQuery = <\n TData = unknown,\n TError = unknown,\n TParams = void,\n TSelected = TData,\n Stateless extends true | undefined = undefined,\n>({\n queryFn,\n ...options\n}: QueryOptions<TData, TError, TParams, TSelected, Stateless>): UseQueryResult<\n TSelected,\n TError,\n TParams,\n TSelected,\n Stateless\n> => {\n const {\n enabled = true,\n refetchOnWindowFocus = false,\n refetchInterval = 0,\n initialData,\n select,\n onError,\n onSuccess,\n onSettled,\n timeout,\n compareOrThrow,\n stateless,\n key: queryKeyPassed,\n } = options;\n const queryKey = normalizeQueryKey(queryKeyPassed ?? []);\n const promiseResolutionInProgress = useRef(false);\n const lastFetchedAt = useRef<number | null>(null);\n const lastQueryKey = useRef<string | undefined>(undefined);\n const queryFnRef = useRef(queryFn);\n queryFnRef.current = queryFn;\n const internalCallbackRef = useRef<\n TInternalCallbackRef<TData, TError, TSelected>\n >({});\n internalCallbackRef.current = {\n onError,\n onSuccess,\n onSettled,\n compareOrThrow,\n select,\n };\n const internalOptionsRef = useRef<TInternalOptionsRef<TData>>({\n enabled,\n refetchOnWindowFocus,\n refetchInterval,\n compareOrThrow,\n stateless,\n timeout,\n });\n internalOptionsRef.current = {\n enabled,\n refetchOnWindowFocus,\n refetchInterval,\n compareOrThrow,\n stateless,\n timeout,\n };\n\n const [status, setStatus] = useState<QueryStatus>(() => {\n return \"idle\";\n });\n const [error, setError] = useState<TError | null>(null);\n const [data, setData] = useState<TData | undefined>(() => {\n if (initialData !== undefined) {\n if (typeof initialData === \"function\") {\n return (initialData as Functionize<TData>)();\n }\n\n return initialData as TData;\n }\n\n return undefined;\n });\n\n const handleSetData = useCallback((data: TData) => {\n if (internalOptionsRef.current.stateless) {\n return;\n }\n\n setData(data);\n }, []);\n\n const shouldRefetch = useCallback(() => {\n if (!internalOptionsRef.current.enabled) {\n return false;\n }\n\n if (lastFetchedAt.current === null) {\n return true;\n }\n\n return (\n new Date().getTime() - lastFetchedAt.current >\n internalOptionsRef.current?.refetchInterval\n );\n }, []);\n\n const refetch = useCallback(\n async (params: TParams | void | undefined = undefined) => {\n if (\n promiseResolutionInProgress.current ||\n !internalOptionsRef.current.enabled\n ) {\n return;\n }\n\n setStatus(\"loading\");\n setError(null);\n\n try {\n const promises: RacePromises<TData>[] = [\n queryFnRef.current(params),\n ...(internalOptionsRef.current.timeout\n ? [\n new Promise<RaceErrorReason>((resolve) =>\n setTimeout(\n () => resolve(\"timeout\"),\n internalOptionsRef.current.timeout\n )\n ),\n ]\n : []),\n ];\n\n promiseResolutionInProgress.current = true;\n const res = await Promise.race(promises);\n promiseResolutionInProgress.current = false;\n\n if (res === \"timeout\") {\n throw new Error(\"timeout\");\n }\n\n handleSetData(res);\n\n if (\n internalCallbackRef.current.compareOrThrow &&\n internalCallbackRef.current.compareOrThrow(res) === true\n ) {\n throw new Error(\"compareOrThrow\");\n }\n\n setStatus(\"success\");\n lastFetchedAt.current = new Date().getTime();\n internalCallbackRef.current.onSuccess?.(res);\n internalCallbackRef.current.onSettled?.(res, undefined);\n } catch (error: any) {\n setError(error);\n setStatus(\"error\");\n internalCallbackRef.current.onError?.(error);\n internalCallbackRef.current.onSettled?.(undefined, error);\n }\n },\n [handleSetData]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setStatus(\"idle\");\n setError(null);\n refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (enabled) {\n refetch();\n }\n }, [enabled, refetch, queryKey]);\n\n useEffect(() => {\n if (lastQueryKey.current === undefined) {\n lastQueryKey.current = queryKey;\n refetch();\n return;\n }\n\n if (queryKey !== lastQueryKey.current) {\n lastQueryKey.current = queryKey;\n refetch();\n }\n }, [queryKey, refetch, enabled]);\n\n useEffect(() => {\n if (refetchOnWindowFocus) {\n const queryHandleFocus = () => {\n if (shouldRefetch()) {\n refetch();\n }\n };\n\n window.addEventListener(\"focus\", queryHandleFocus);\n\n return () => {\n window.removeEventListener(\"focus\", queryHandleFocus);\n };\n }\n }, [refetchOnWindowFocus, refetch, shouldRefetch]);\n\n useEffect(() => {\n if (refetchInterval !== 0) {\n const interval = setInterval(\n () => {\n if (shouldRefetch()) {\n refetch();\n }\n },\n Math.max(refetchInterval, 1000)\n );\n\n return () => {\n clearInterval(interval);\n };\n }\n }, [refetch, refetchInterval, shouldRefetch]);\n\n return {\n data:\n select && data !== undefined\n ? select(data as TData)\n : (data as unknown as TSelected),\n error,\n status,\n refetch,\n reset,\n };\n};\n","/**\n * @fileoverview useSubscriptionCore\n * @name useSubscriptionCore.ts\n * @description useSubscriptionCore | This hook handle core subscription logic\n * and provides a way to subscribe and unsubscribe to a topic via any callback\n */\n\nimport { shallowEqual } from \"@pixotope/utils/comparison\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype SubscriptionState = \"idle\" | \"subscribed\" | \"subscribing\";\nexport type MessageHandler<TMessage> = (message: TMessage) => void;\nexport type Connection = {\n acknowledge: () => void;\n};\nexport type SubscriptionCoreOptions<\n TData,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n> = {\n /**\n * @description Function that will be called when the message is received.\n */\n onMessage?: (message: TMessage) => void;\n /**\n * @description Function that will be called when the subscription is created.\n */\n onSubscribed?: (message: TMessage) => void;\n /**\n * @description Function that will be called when the subscription is created.\n */\n onError?: (error: TMessage) => void;\n /**\n * @description Whether the subscription is enabled.\n * @default true\n */\n enabled?: boolean;\n /**\n * @description Function that will be called to compare the message with the\n * previous message. If the function returns true, the message will be ignored.\n */\n compareOrThrow?: (data: TMessage) => boolean;\n /**\n * @description Function that will be called to select the data from the message.\n */\n select?: (data: TMessage) => TData;\n /**\n * @description Initial state of the subscription.\n * @default undefined\n */\n initialState?: TData;\n /**\n * @description Function that will be called when the subscription is created.\n */\n subscriberFn: (\n handler: MessageHandler<TMessage>,\n connection: Connection\n ) => () => void /** unsubscribe Fn */;\n /**\n * @description Whether the subscription is stateless. Data will not be\n * stored by the hook internally.\n * @default false\n */\n stateless?: Stateless;\n /**\n * @description Custom equality function for comparing data.\n * @default shallowEqual\n */\n isEqual?: <T = TData>(a: T, b: T) => boolean;\n};\n\ntype WithStatus = {\n status: SubscriptionState;\n};\n\ntype WithData<TData> = {\n data: TData;\n};\n\nexport type SubscriptionCoreReturnType<\n TData,\n Stateless extends true | undefined,\n> = {\n reSubscribe: () => void;\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n} & (Stateless extends true ? {} : WithStatus & WithData<TData>);\n\n/**\n * @description `useSubscriptionCore` | This hook handle core subscription logic\n * and provides a way to subscribe and unsubscribe to a topic via any callback.\n * The hook expose a handler function. All the consumer code need to do is to\n * call this handler function with the message received from the topic or pass\n * it directly to the callback function that is passed to the subscriberFn.\n * - `status` - current status of the subscription\n * - `data` - the data after the select function is applied to the message\n * - `reSubscribe` - function that can be called to re-subscribe to the topic\n *\n * An example how this hook works can be found in {@link ./useSubscription.ts}\n */\nexport function useSubscriptionCore<\n TData = unknown,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n>(\n options: SubscriptionCoreOptions<TData, TMessage, Stateless>\n): SubscriptionCoreReturnType<TData, Stateless> {\n const {\n enabled = true,\n initialState = undefined,\n onSubscribed,\n stateless,\n compareOrThrow,\n subscriberFn,\n onMessage,\n onError,\n select,\n isEqual = shallowEqual,\n } = options;\n const [status, setStatus] = useState<SubscriptionState>(\"idle\");\n const [data, setData] = useState<TData | undefined>(initialState);\n const unsubcribeRef = useRef<() => void | undefined>(undefined);\n const initialStateRef = useRef(initialState);\n const subscriberFnRef = useRef(subscriberFn);\n const callbackRefRegistry = <const>{\n onMessage,\n onError,\n select,\n compareOrThrow,\n onSubscribed,\n isEqual,\n };\n const internalCallbacksRef = useRef(callbackRefRegistry);\n internalCallbacksRef.current = callbackRefRegistry;\n\n const updateStatus = useCallback(\n (newStatus: SubscriptionState, message?: TMessage) => {\n if (stateless) {\n return;\n }\n\n setStatus((prev) => {\n if (prev === newStatus) {\n return prev;\n }\n\n if (newStatus === \"subscribed\" && message) {\n internalCallbacksRef.current.onSubscribed?.(message);\n }\n\n return newStatus;\n });\n },\n [stateless]\n );\n\n const connection: Connection = useMemo(\n () => ({\n acknowledge: () => {\n updateStatus(\"subscribed\");\n },\n }),\n [updateStatus]\n );\n\n const handler = useCallback(\n async (message: TMessage) => {\n if (internalCallbacksRef.current.compareOrThrow?.(message)) {\n internalCallbacksRef.current.onError?.(message);\n\n return;\n }\n\n const selectedMessage = <TData>(\n (internalCallbacksRef.current.select?.(message) ?? message)\n );\n\n if (!stateless) {\n setData((prev) => {\n if (isEqual(prev, selectedMessage)) {\n return prev;\n }\n\n return selectedMessage;\n });\n }\n\n updateStatus(\"subscribed\", message);\n internalCallbacksRef.current.onMessage?.(message);\n },\n [stateless, updateStatus]\n );\n\n const unsubscribe = useCallback(() => {\n updateStatus(\"idle\");\n unsubcribeRef.current?.();\n unsubcribeRef.current = undefined;\n }, [updateStatus]);\n\n const subscribe = useCallback(() => {\n unsubcribeRef.current?.();\n updateStatus(\"subscribing\");\n setData(initialStateRef.current);\n unsubcribeRef.current = subscriberFnRef.current(handler, connection);\n }, [connection, handler, updateStatus]);\n\n useEffect(() => {\n if (enabled) {\n subscribe();\n } else {\n unsubscribe();\n }\n\n return () => {\n unsubscribe();\n };\n }, [enabled, subscribe, unsubscribe]);\n\n return {\n status,\n data,\n reSubscribe: subscribe,\n } as unknown as any;\n}\n","import {\n SubscriptionCoreOptions,\n useSubscriptionCore,\n} from \"./useSubscriptionCore\";\n\nexport type SubscriptionOptions<\n TData,\n TMessage = unknown,\n Stateless extends true | undefined = undefined,\n> = Omit<\n SubscriptionCoreOptions<TData, TMessage, Stateless>,\n \"subscriberFn\"\n> & {\n service: string;\n topic: string;\n maxDownwardDepth?: number;\n};\n\nexport type TSubscriptionHandlerFunction<TMessage> = (opts: {\n service: string;\n name: string;\n callback: (message: TMessage) => void;\n maxDownwardDepth?: number;\n}) => () => void;\n\nexport function useSubscription<\n TData = unknown,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n>(\n subscriptionHandler: TSubscriptionHandlerFunction<TMessage>,\n options: SubscriptionOptions<TData, TMessage, Stateless>\n) {\n const { topic, service, maxDownwardDepth = 1000 } = options;\n\n return useSubscriptionCore<TData, TMessage, Stateless>({\n ...options,\n subscriberFn: (handler) => {\n const unsubscribe = subscriptionHandler({\n service,\n name: topic,\n callback: (message: TMessage) => {\n handler(message);\n },\n maxDownwardDepth,\n });\n\n return unsubscribe;\n },\n });\n}\n\nexport function buildServiceSubscriptionHook(\n subscriptionHandler: TSubscriptionHandlerFunction<unknown>,\n targetMachine: (machine: string | undefined) => string\n) {\n return function useSubscriptionBuilder<\n TData,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n >(\n options: Omit<\n SubscriptionOptions<TData, TMessage, Stateless>,\n \"service\"\n > & {\n machine?: string;\n }\n ) {\n const targetService = targetMachine(options.machine);\n return useSubscription<TData, TMessage, Stateless>(\n <TSubscriptionHandlerFunction<TMessage>>subscriptionHandler,\n {\n service: targetService,\n ...options,\n }\n );\n };\n}\n","import type { ZMQProxyWSClient } from \"@pixotope/zmq-client\";\nimport type { TPromiseFunction } from \"./factories\";\nimport type { buildServiceSubscriptionHook } from \"./useSubscription\";\n\nexport function bindClientSocketProxy(socketClientProxy: ZMQProxyWSClient) {\n return (\n ...args: Parameters<Parameters<typeof buildServiceSubscriptionHook>[0]>\n ) => {\n const { callback: cbHook, ...rest } = args[0];\n return socketClientProxy.mirror({\n ...rest,\n callback: (message) => {\n cbHook(message.message);\n },\n })[0];\n };\n}\n\nexport function bindPromiseFunction(clientSocketProxy: ZMQProxyWSClient) {\n return async (...args: Parameters<TPromiseFunction<unknown, unknown>>) => {\n const res = await clientSocketProxy.callAsync(...args);\n return res.message.Result;\n };\n}\n"],"mappings":"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","names":["__defProp","__getOwnPropDesc","__getOwnPropNames","__hasOwnProp","__copyProps","shallowEqual","useCallback","params","error","options","useCallback","useRef","useState","useRef","useState","useCallback","data","_a","_b","error","useCallback","useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useCallback","useMemo","useEffect"]}
1
+ {"version":3,"sources":["../../utils/dist/comparison/index.js","../src/factories.ts","../src/useMutation.ts","../src/useQuery.ts","../src/useSubscriptionCore.ts","../src/useSubscription.ts","../src/proxyBinders.ts"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/comparison/index.ts\nvar comparison_exports = {};\n__export(comparison_exports, {\n shallowEqual: () => shallowEqual\n});\nmodule.exports = __toCommonJS(comparison_exports);\n\n// src/comparison/shallowEqual.ts\nfunction shallowEqual(objA, objB) {\n if (Object.is(objA, objB)) {\n return true;\n }\n if (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) {\n return false;\n }\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false;\n for (const [key, value] of objA) {\n if (!Object.is(value, objB.get(key))) {\n return false;\n }\n }\n return true;\n }\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false;\n for (const value of objA) {\n if (!objB.has(value)) {\n return false;\n }\n }\n return true;\n }\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n return false;\n }\n for (let i = 0; i < keysA.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n return true;\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n shallowEqual\n});\n","import type { TSocketServerCallOptions, ZMQClient } from \"@pixotope/zmq-client\";\nimport { useCallback, useMemo } from \"react\";\nimport { MutationOptions, useMutation } from \"./useMutation\";\nimport { QueryOptions, useQuery } from \"./useQuery\";\n\nexport type MutationInfo<TData, TError, TParams> = {\n data: TData;\n error: TError;\n params: TParams;\n};\n\ntype FnToParamsBase = Record<string, MutationInfo<unknown, unknown, unknown>>;\n\nexport type TPromiseFunction<TResponse, TParams> = (\n args: Omit<\n ZMQClient.Call<\n TResponse,\n {\n functionName: string;\n parameters: TParams;\n options?: Omit<TSocketServerCallOptions, \"toCallIfNoResponse\">;\n }\n >,\n \"id\"\n >\n) => Promise<TResponse>;\n\nconst useCallMutationBase = <\n TFnToParams extends FnToParamsBase,\n TData = unknown,\n TError = unknown,\n TParams = unknown,\n>(\n promiseFunc: TPromiseFunction<TData, TParams>,\n functionName: keyof TFnToParams,\n service: string,\n options?: Omit<MutationOptions<TData, TError, TParams>, \"mutationFn\">\n) => {\n const timeout = options?.timeout;\n const { ...rest } = useMemo(() => options ?? {}, [options]);\n const mutationFn = useCallback(\n async (parameters: TParams) => {\n try {\n return await promiseFunc({\n service,\n functionName: functionName.toString(),\n parameters,\n options: {\n avoidTimeout: !timeout,\n customTimeout: timeout,\n },\n });\n } catch (e) {\n if (e instanceof Error) {\n throw e;\n }\n throw new Error(e as string);\n }\n },\n [functionName, service, timeout]\n );\n\n return useMutation<TData, TError, TParams>({\n mutationFn,\n ...rest,\n });\n};\n\nexport function buildMutationHook<TFnToParams extends FnToParamsBase>(\n promiseFunc: TPromiseFunction<unknown, unknown>,\n genTargetService: (machine: string | undefined) => string\n) {\n return function useCallMutationBuilder<TFn extends keyof TFnToParams>(\n func: TFn,\n options?: Parameters<\n typeof useCallMutationBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"]\n >\n >[3] & { machine?: string }\n ) {\n const targetService = genTargetService(options?.machine);\n\n return useCallMutationBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"]\n >(promiseFunc, func, targetService, options);\n };\n}\n\nconst useCallQueryBase = <\n TFnToParams extends FnToParamsBase,\n TData = unknown,\n TError = unknown,\n TParams = unknown,\n TSelect = TData,\n>(\n promiseFunction: TPromiseFunction<TData, TParams>,\n functionName: keyof TFnToParams,\n params: TParams,\n service: string,\n options?: Omit<QueryOptions<TData, TError, TParams, TSelect>, \"queryFn\">\n) => {\n const timeout = options?.timeout;\n const { ...rest } = useMemo(() => options ?? {}, [options]);\n const queryFn = useCallback(\n async (refetchParams: TParams | void, overrideTargetMachine?: string) => {\n try {\n return await promiseFunction({\n service: overrideTargetMachine ?? service,\n functionName: functionName.toString(),\n parameters: refetchParams ?? params,\n options: {\n avoidTimeout: !timeout,\n customTimeout: timeout,\n },\n });\n } catch (e) {\n if (e instanceof Error) {\n throw e;\n }\n throw new Error(e as string);\n }\n },\n [functionName, service, params, timeout]\n );\n\n return useQuery<TData, TError, TParams, TSelect>({\n queryFn,\n ...rest,\n });\n};\n\nexport function buildQueryHook<TFnToParams extends FnToParamsBase>(\n promiseFunction: TPromiseFunction<unknown, unknown>,\n getTargetService: (machine: string | undefined) => string\n) {\n return function useCallQueryBuilder<\n TFn extends keyof TFnToParams,\n TSelect = TFnToParams[TFn][\"data\"],\n >(\n func: TFn,\n params: TFnToParams[TFn][\"params\"],\n options?: Parameters<\n typeof useCallQueryBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"],\n TSelect\n >\n >[4] & { machine?: string }\n ) {\n const targetService = getTargetService(options?.machine);\n\n return useCallQueryBase<\n TFnToParams,\n TFnToParams[TFn][\"data\"],\n TFnToParams[TFn][\"error\"],\n TFnToParams[TFn][\"params\"],\n TSelect\n >(promiseFunction, func, params, targetService, options);\n };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nexport type MutationFunction<TData = unknown, TParams = unknown> = (\n params: TParams,\n overrideTargetMachine?: string\n) => Promise<TData>;\n\nexport interface MutationOptions<\n TData = unknown,\n TError = unknown,\n TParams = void,\n> {\n mutationFn: MutationFunction<TData, TParams>;\n params?: TParams;\n onSuccess?: (data: TData, variables: TParams) => Promise<unknown> | unknown;\n onError?: (\n error: TMutationError<TError>,\n variables: TParams\n ) => Promise<unknown> | unknown;\n onSettled?: (\n data: TData | undefined,\n error: TMutationError<TError> | null,\n variables: TParams\n ) => Promise<unknown> | unknown;\n compareOrThrow?: (result: TData | TError) => boolean;\n timeout?: number;\n prepareParams?: (variables: TParams, defaults?: TParams) => TParams;\n}\n\ntype TMutationError<TError> = TError | Error | null;\n\nexport interface MutateOptions<\n TData = unknown,\n TError = unknown,\n TParams = void,\n> {\n onSuccess?: (data: TData, variables: TParams) => void;\n onError?: (error: TMutationError<TError>, variables: TParams) => void;\n onSettled?: (\n data: TData | undefined,\n error: TMutationError<TError> | null,\n variables: TParams\n ) => void;\n}\n\ntype MutationStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\ntype RaceErrorReason = \"timeout\";\ntype RacePromises<T> = Promise<T | RaceErrorReason>;\n\nexport class ComparisonFailError<TPayload = unknown> extends Error {\n public readonly payload: TPayload;\n\n constructor(message: string, payload: TPayload) {\n super(message);\n this.name = this.constructor.name;\n this.payload = payload;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ComparisonFailError);\n }\n }\n}\n\n/**\n * `useMutation` is a hook that allows you to perform a mutation/push updates to the services while\n * providing extensive API to tap into the status and results of the mutation.\n * @param mutationFn The mutation function to be called when the `mutate` function is called.\n * `useMutation` does not care about what the function does, all it needs it a function that returns\n * a promise.\n * @param options Options to configure the mutation.\n * @returns An object with the following properties:\n * - `mutateAsync`: A function that takes in the variables and returns a promise that resolves to the\n * result of the mutation. This function can be awaited to get the result of the mutation. Callbacks can\n * be passed to this function to be called when the mutation is successful or when it fails. It's good idea\n * to wrap this function in a try/catch block.\n * - `mutate`: A function that takes in the variables and returns nothing. This function does not\n * return a promise. Callbacks can be passed to this function to be called when the mutation is\n * successful or when it fails.\n * - `status`: The status of the mutation. Can be one of `idle`, `loading`, `success` or `error`.\n * - `result`: The result of the mutation. This is undefined until the mutation is successful.\n * - `reset`: A function that resets the mutation to the initial state.\n * - `error`: The error object if the mutation has failed.\n * @example\n * ```typescript\n * const mutationRes = useMutation({\n * mutationFn: (variables) => {\n * return ZMQHelper.callSomethingAsync(variables)\n * },\n * onSuccess: (data) => {\n * // do something with the result\n * },\n * onError: (error) => {\n * // do something with the error\n * },\n * onSettled: (data, error) => {\n * // do something when the mutation is done\n * }});\n *\n * // call the mutation\n * const res = await mutationRes.mutateAsync({ foo: \"bar\" });\n * // OR\n * mutationRes.mutate({ foo: \"bar\" }, {\n * onSuccess: (data) => {\n * // do something with the result\n * // for example show a toast message\n * // stop local loading state\n * });\n * ```\n */\nexport const useMutation = <\n TData = unknown,\n TError = TMutationError<unknown>,\n TParams = void,\n>(\n options: MutationOptions<TData, TError, TParams>\n) => {\n const {\n mutationFn,\n compareOrThrow,\n onError,\n onSettled,\n onSuccess,\n prepareParams,\n params,\n timeout,\n } = options;\n const [status, setStatus] = useState<MutationStatus>(\"idle\");\n const [error, setError] = useState<TMutationError<TError>>(null);\n const [result, setResult] = useState<TData | undefined>(undefined);\n const mutationFnRef = useRef(mutationFn);\n const internalOptionsRef = useRef({\n params,\n timeout,\n });\n const internalCallbackRefistry = <const>{\n onSuccess,\n onError,\n onSettled,\n compareOrThrow,\n prepareParams,\n };\n const internalCallbackRef = useRef(internalCallbackRefistry);\n internalCallbackRef.current = internalCallbackRefistry;\n\n const mutateAsync = useCallback(\n async (params: TParams, overrideTargetMachine?: string) => {\n setStatus(\"loading\");\n setError(null);\n\n try {\n const promises: RacePromises<TData>[] = [\n mutationFnRef.current(\n internalCallbackRef.current.prepareParams\n ? internalCallbackRef.current.prepareParams(\n params,\n internalOptionsRef.current.params\n )\n : params,\n overrideTargetMachine\n ),\n ...(internalOptionsRef.current.timeout\n ? [\n new Promise<RaceErrorReason>((resolve) =>\n setTimeout(\n () => resolve(\"timeout\"),\n internalOptionsRef.current.timeout\n )\n ),\n ]\n : []),\n ];\n\n const res = await Promise.race(promises);\n\n if (res === \"timeout\") {\n throw new Error(\"timeout\");\n }\n\n if (internalCallbackRef.current.compareOrThrow?.(res)) {\n throw new ComparisonFailError(JSON.stringify(res), res);\n }\n\n setResult(res);\n setStatus(\"success\");\n\n internalCallbackRef.current.onSuccess?.(res, params);\n internalCallbackRef.current.onSettled?.(res, null, params);\n\n return res;\n } catch (error: any) {\n setError(error);\n setStatus(\"error\");\n\n internalCallbackRef.current.onError?.(error, params);\n internalCallbackRef.current.onSettled?.(undefined, error, params);\n\n throw error;\n }\n },\n []\n );\n\n const mutate = useCallback(\n (\n variables: TParams,\n options?: MutateOptions<TData, TError, TParams> & {\n overrideTargetMachine?: string;\n }\n ) => {\n mutateAsync(variables, options?.overrideTargetMachine).then(\n (data) => {\n options?.onSuccess?.(data, variables);\n options?.onSettled?.(data, null, variables);\n },\n (error) => {\n options?.onError?.(error, variables);\n options?.onSettled?.(undefined, error, variables);\n }\n );\n },\n [mutateAsync]\n );\n\n return {\n mutateAsync,\n status,\n result,\n mutate,\n reset: () => {\n setStatus(\"idle\");\n setError(null);\n setResult(undefined);\n },\n error,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface QueryOptions<\n TData = unknown,\n TError = unknown,\n TParams = void,\n TSelectData = TData,\n Stateless extends true | undefined = undefined,\n> {\n queryFn: (params: TParams | undefined | void) => Promise<TData>;\n onSuccess?: (data: TData) => Promise<void> | void;\n onError?: (error: TQueryError<TError>) => Promise<void> | void;\n onSettled?: (\n data: TData | undefined,\n error: TQueryError<TError> | undefined\n ) => Promise<void> | void;\n timeout?: number;\n enabled?: boolean;\n initialData?: TData | Functionize<TData>;\n select?: (data: TData) => TSelectData;\n refetchOnWindowFocus?: boolean;\n refetchInterval?: number;\n compareOrThrow?: (data: TData) => boolean;\n stateless?: Stateless;\n key?: TQueryKey;\n}\n\ntype Functionize<T> = () => T;\ntype QueryStatus = \"idle\" | \"loading\" | \"success\" | \"error\" | \"timeout\";\ntype RaceErrorReason = \"timeout\";\ntype RacePromises<T> = Promise<T | RaceErrorReason>;\ntype WithData<TData> = { data: TData | undefined };\ntype TQueryKey = readonly any[];\n\ntype TQueryError<TError> = TError | Error | null;\n\nexport type UseQueryResult<\n TData = unknown,\n TError = unknown,\n TParams = void,\n TSelectData = TData,\n Stateless extends true | undefined = undefined,\n> = {\n error: TQueryError<TError>;\n status: QueryStatus;\n refetch: (params: TParams | void | undefined) => Promise<void>;\n reset: () => void;\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n} & (Stateless extends true ? {} : WithData<TSelectData>);\n\nfunction normalizeQueryKey(queryKey: TQueryKey): string {\n return JSON.stringify(queryKey);\n}\n\ntype TInternalCallbackRef<TData, TError, TSelectData> = {\n onError?: (error: TQueryError<TError>) => Promise<void> | void;\n onSuccess?: (data: TData) => Promise<void> | void;\n onSettled?: (\n data: TData | undefined,\n error: TQueryError<TError> | undefined\n ) => Promise<void> | void;\n compareOrThrow?: (data: TData) => boolean;\n select?: (data: TData) => TSelectData;\n};\n\ntype TInternalOptionsRef<TData> = {\n timeout?: number;\n enabled: boolean;\n refetchOnWindowFocus: boolean;\n refetchInterval: number;\n compareOrThrow?: (data: TData) => boolean;\n stateless?: boolean;\n};\n\nconst getRandomUUID = () => Math.random().toString(36).substring(2, 15);\n\nexport const useQuery = <\n TData = unknown,\n TError = TQueryError<unknown>,\n TParams = void,\n TSelected = TData,\n Stateless extends true | undefined = undefined,\n>({\n queryFn,\n ...options\n}: QueryOptions<TData, TError, TParams, TSelected, Stateless>): UseQueryResult<\n TSelected,\n TError,\n TParams,\n TSelected,\n Stateless\n> => {\n const {\n enabled = true,\n refetchOnWindowFocus = false,\n refetchInterval = 0,\n initialData,\n select,\n onError,\n onSuccess,\n onSettled,\n timeout,\n compareOrThrow,\n stateless,\n key: queryKeyPassed,\n } = options;\n const queryKey = normalizeQueryKey(queryKeyPassed ?? []);\n const lastFetchedAt = useRef<number | null>(null);\n const lastQueryKey = useRef<string | undefined>(undefined);\n const queryFnRef = useRef(queryFn);\n queryFnRef.current = queryFn;\n const internalCallbackRef = useRef<\n TInternalCallbackRef<TData, TError, TSelected>\n >({});\n internalCallbackRef.current = {\n onError,\n onSuccess,\n onSettled,\n compareOrThrow,\n select,\n };\n const internalOptionsRef = useRef<TInternalOptionsRef<TData>>({\n enabled,\n refetchOnWindowFocus,\n refetchInterval,\n compareOrThrow,\n stateless,\n timeout,\n });\n internalOptionsRef.current = {\n enabled,\n refetchOnWindowFocus,\n refetchInterval,\n compareOrThrow,\n stateless,\n timeout,\n };\n const requestIdRef = useRef(getRandomUUID());\n\n const [status, setStatus] = useState<QueryStatus>(() => {\n return \"idle\";\n });\n const [error, setError] = useState<TQueryError<TError>>(null);\n const [data, setData] = useState<TData | undefined>(() => {\n if (initialData !== undefined) {\n if (typeof initialData === \"function\") {\n return (initialData as Functionize<TData>)();\n }\n\n return initialData as TData;\n }\n\n return undefined;\n });\n\n const handleSetData = useCallback((data: TData) => {\n if (internalOptionsRef.current.stateless) {\n return;\n }\n\n setData(data);\n }, []);\n\n const shouldRefetch = useCallback(() => {\n if (!internalOptionsRef.current.enabled) {\n return false;\n }\n\n if (lastFetchedAt.current === null) {\n return true;\n }\n\n return (\n new Date().getTime() - lastFetchedAt.current >\n internalOptionsRef.current?.refetchInterval\n );\n }, []);\n\n const refetch = useCallback(\n async (params: TParams | void | undefined = undefined) => {\n const requestId = getRandomUUID();\n requestIdRef.current = requestId;\n if (!internalOptionsRef.current.enabled) {\n return;\n }\n\n setStatus(\"loading\");\n setError(null);\n\n try {\n const promises: RacePromises<TData>[] = [\n queryFnRef.current(params),\n ...(internalOptionsRef.current.timeout\n ? [\n new Promise<RaceErrorReason>((resolve) =>\n setTimeout(\n () => resolve(\"timeout\"),\n internalOptionsRef.current.timeout\n )\n ),\n ]\n : []),\n ];\n\n const res = await Promise.race(promises);\n if (requestIdRef.current !== requestId) {\n return;\n }\n\n if (res === \"timeout\") {\n throw new Error(\"timeout\");\n }\n\n handleSetData(res);\n\n if (\n internalCallbackRef.current.compareOrThrow &&\n internalCallbackRef.current.compareOrThrow(res) === true\n ) {\n throw new Error(\"failedComparison\");\n }\n\n setStatus(\"success\");\n lastFetchedAt.current = new Date().getTime();\n internalCallbackRef.current.onSuccess?.(res);\n internalCallbackRef.current.onSettled?.(res, undefined);\n } catch (error: any) {\n setError(error);\n setStatus(\"error\");\n internalCallbackRef.current.onError?.(error);\n internalCallbackRef.current.onSettled?.(undefined, error);\n }\n },\n [handleSetData]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setStatus(\"idle\");\n setError(null);\n refetch();\n }, [refetch]);\n\n useEffect(() => {\n const cleanups: (() => void)[] = [];\n\n // If the query should be refetched on window focus, add a listener\n if (refetchOnWindowFocus) {\n const queryHandleFocus = () => {\n refetch();\n };\n\n window.addEventListener(\"focus\", queryHandleFocus);\n\n cleanups.push(() => {\n window.removeEventListener(\"focus\", queryHandleFocus);\n });\n }\n\n // If the query should be refetched on an interval, add an interval\n if (refetchInterval > 0) {\n const interval = setInterval(\n () => {\n if (shouldRefetch()) {\n refetch();\n }\n },\n Math.max(refetchInterval, 1000)\n );\n\n cleanups.push(() => {\n clearInterval(interval);\n });\n }\n\n // If the query key has changed, refetch\n if (\n lastQueryKey.current === undefined ||\n queryKey !== lastQueryKey.current\n ) {\n lastQueryKey.current = queryKey;\n refetch();\n }\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n };\n }, [\n queryKey,\n enabled,\n refetchOnWindowFocus,\n refetchInterval,\n shouldRefetch,\n refetch,\n ]);\n\n return {\n data:\n select && data !== undefined\n ? select(data as TData)\n : (data as unknown as TSelected),\n error,\n status,\n refetch,\n reset,\n };\n};\n","/**\n * @fileoverview useSubscriptionCore\n * @name useSubscriptionCore.ts\n * @description useSubscriptionCore | This hook handle core subscription logic\n * and provides a way to subscribe and unsubscribe to a topic via any callback\n */\n\nimport { shallowEqual } from \"@pixotope/utils/comparison\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype SubscriptionState = \"idle\" | \"subscribed\" | \"subscribing\";\nexport type MessageHandler<TMessage> = (message: TMessage) => void;\nexport type Connection = {\n acknowledge: () => void;\n};\nexport type SubscriptionCoreOptions<\n TData,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n> = {\n /**\n * @description Function that will be called when the message is received.\n */\n onMessage?: (message: TMessage) => void;\n /**\n * @description Function that will be called when the subscription is created.\n */\n onSubscribed?: (message: TMessage) => void;\n /**\n * @description Function that will be called when the subscription is created.\n */\n onError?: (error: TMessage) => void;\n /**\n * @description Whether the subscription is enabled.\n * @default true\n */\n enabled?: boolean;\n /**\n * @description Function that will be called to compare the message with the\n * previous message. If the function returns true, the message will be ignored.\n */\n compareOrThrow?: (data: TMessage) => boolean;\n /**\n * @description Function that will be called to select the data from the message.\n */\n select?: (data: TMessage) => TData;\n /**\n * @description Initial state of the subscription.\n * @default undefined\n */\n initialState?: TData;\n /**\n * @description Function that will be called when the subscription is created.\n */\n subscriberFn: (\n handler: MessageHandler<TMessage>,\n connection: Connection\n ) => () => void /** unsubscribe Fn */;\n /**\n * @description Whether the subscription is stateless. Data will not be\n * stored by the hook internally.\n * @default false\n */\n stateless?: Stateless;\n /**\n * @description Custom equality function for comparing data.\n * @default shallowEqual\n */\n isEqual?: <T = TData>(a: T, b: T) => boolean;\n};\n\ntype WithStatus = {\n status: SubscriptionState;\n};\n\ntype WithData<TData> = {\n data: TData;\n};\n\nexport type SubscriptionCoreReturnType<\n TData,\n Stateless extends true | undefined,\n> = {\n reSubscribe: () => void;\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n} & (Stateless extends true ? {} : WithStatus & WithData<TData>);\n\n/**\n * @description `useSubscriptionCore` | This hook handle core subscription logic\n * and provides a way to subscribe and unsubscribe to a topic via any callback.\n * The hook expose a handler function. All the consumer code need to do is to\n * call this handler function with the message received from the topic or pass\n * it directly to the callback function that is passed to the subscriberFn.\n * - `status` - current status of the subscription\n * - `data` - the data after the select function is applied to the message\n * - `reSubscribe` - function that can be called to re-subscribe to the topic\n *\n * An example how this hook works can be found in {@link ./useSubscription.ts}\n */\nexport function useSubscriptionCore<\n TData = unknown,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n>(\n options: SubscriptionCoreOptions<TData, TMessage, Stateless>\n): SubscriptionCoreReturnType<TData, Stateless> {\n const {\n enabled = true,\n initialState = undefined,\n onSubscribed,\n stateless,\n compareOrThrow,\n subscriberFn,\n onMessage,\n onError,\n select,\n isEqual = shallowEqual,\n } = options;\n const [status, setStatus] = useState<SubscriptionState>(\"idle\");\n const [data, setData] = useState<TData | undefined>(initialState);\n const unsubcribeRef = useRef<() => void | undefined>(undefined);\n const initialStateRef = useRef(initialState);\n const subscriberFnRef = useRef(subscriberFn);\n const callbackRefRegistry = <const>{\n onMessage,\n onError,\n select,\n compareOrThrow,\n onSubscribed,\n isEqual,\n };\n const internalCallbacksRef = useRef(callbackRefRegistry);\n internalCallbacksRef.current = callbackRefRegistry;\n\n const updateStatus = useCallback(\n (newStatus: SubscriptionState, message?: TMessage) => {\n if (stateless) {\n return;\n }\n\n setStatus((prev) => {\n if (prev === newStatus) {\n return prev;\n }\n\n if (newStatus === \"subscribed\" && message) {\n internalCallbacksRef.current.onSubscribed?.(message);\n }\n\n return newStatus;\n });\n },\n [stateless]\n );\n\n const connection: Connection = useMemo(\n () => ({\n acknowledge: () => {\n updateStatus(\"subscribed\");\n },\n }),\n [updateStatus]\n );\n\n const handler = useCallback(\n async (message: TMessage) => {\n if (internalCallbacksRef.current.compareOrThrow?.(message)) {\n internalCallbacksRef.current.onError?.(message);\n\n return;\n }\n\n const selectedMessage = <TData>(\n (internalCallbacksRef.current.select?.(message) ?? message)\n );\n\n if (!stateless) {\n setData((prev) => {\n if (isEqual(prev, selectedMessage)) {\n return prev;\n }\n\n return selectedMessage;\n });\n }\n\n updateStatus(\"subscribed\", message);\n internalCallbacksRef.current.onMessage?.(message);\n },\n [stateless, updateStatus]\n );\n\n const unsubscribe = useCallback(() => {\n updateStatus(\"idle\");\n unsubcribeRef.current?.();\n unsubcribeRef.current = undefined;\n }, [updateStatus]);\n\n const subscribe = useCallback(() => {\n unsubcribeRef.current?.();\n updateStatus(\"subscribing\");\n setData(initialStateRef.current);\n unsubcribeRef.current = subscriberFnRef.current(handler, connection);\n }, [connection, handler, updateStatus]);\n\n useEffect(() => {\n if (enabled) {\n subscribe();\n } else {\n unsubscribe();\n }\n\n return () => {\n unsubscribe();\n };\n }, [enabled, subscribe, unsubscribe]);\n\n return {\n status,\n data,\n reSubscribe: subscribe,\n } as unknown as any;\n}\n","import {\n SubscriptionCoreOptions,\n useSubscriptionCore,\n} from \"./useSubscriptionCore\";\n\nexport type SubscriptionOptions<\n TData,\n TMessage = unknown,\n Stateless extends true | undefined = undefined,\n> = Omit<\n SubscriptionCoreOptions<TData, TMessage, Stateless>,\n \"subscriberFn\"\n> & {\n service: string;\n topic: string;\n maxDownwardDepth?: number;\n};\n\nexport type TSubscriptionHandlerFunction<TMessage> = (opts: {\n service: string;\n name: string;\n callback: (message: TMessage) => void;\n maxDownwardDepth?: number;\n}) => () => void;\n\nexport function useSubscription<\n TData = unknown,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n>(\n subscriptionHandler: TSubscriptionHandlerFunction<TMessage>,\n options: SubscriptionOptions<TData, TMessage, Stateless>\n) {\n const { topic, service, maxDownwardDepth = 1000 } = options;\n\n return useSubscriptionCore<TData, TMessage, Stateless>({\n ...options,\n subscriberFn: (handler) => {\n const unsubscribe = subscriptionHandler({\n service,\n name: topic,\n callback: (message: TMessage) => {\n handler(message);\n },\n maxDownwardDepth,\n });\n\n return unsubscribe;\n },\n });\n}\n\nexport function buildServiceSubscriptionHook(\n subscriptionHandler: TSubscriptionHandlerFunction<unknown>,\n targetMachine: (machine: string | undefined) => string\n) {\n return function useSubscriptionBuilder<\n TData,\n TMessage = TData,\n Stateless extends true | undefined = undefined,\n >(\n options: Omit<\n SubscriptionOptions<TData, TMessage, Stateless>,\n \"service\"\n > & {\n machine?: string;\n }\n ) {\n const targetService = targetMachine(options.machine);\n return useSubscription<TData, TMessage, Stateless>(\n <TSubscriptionHandlerFunction<TMessage>>subscriptionHandler,\n {\n service: targetService,\n ...options,\n }\n );\n };\n}\n","import type { ZMQProxyWSClient } from \"@pixotope/zmq-client\";\nimport type { TPromiseFunction } from \"./factories\";\nimport type { buildServiceSubscriptionHook } from \"./useSubscription\";\n\nexport function bindClientSocketProxy(socketClientProxy: ZMQProxyWSClient) {\n return (\n ...args: Parameters<Parameters<typeof buildServiceSubscriptionHook>[0]>\n ) => {\n const { callback: cbHook, ...rest } = args[0];\n return socketClientProxy.mirror({\n ...rest,\n callback: (message) => {\n cbHook(message.message);\n },\n })[0];\n };\n}\n\nexport function bindPromiseFunction(clientSocketProxy: ZMQProxyWSClient) {\n return async (...args: Parameters<TPromiseFunction<unknown, unknown>>) => {\n const res = await clientSocketProxy.callAsync(...args);\n return res.message.Result;\n };\n}\n"],"mappings":"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","names":["__defProp","__getOwnPropDesc","__getOwnPropNames","__hasOwnProp","__copyProps","shallowEqual","useCallback","params","error","options","useCallback","useRef","useState","useRef","useState","useCallback","data","_a","_b","error","useCallback","useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useCallback","useMemo","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixotope/query",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "",
5
5
  "private": false,
6
6
  "main": "dist/index.js",
@@ -21,7 +21,7 @@
21
21
  "typescript": "^5.7.2",
22
22
  "vitest": "^3.2.4",
23
23
  "@pixotope/utils": "0.1.0",
24
- "@pixotope/zmq-client": "0.8.0"
24
+ "@pixotope/zmq-client": "0.9.0"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "react": ">=17.0.0"
package/src/factories.ts CHANGED
@@ -34,16 +34,10 @@ const useCallMutationBase = <
34
34
  promiseFunc: TPromiseFunction<TData, TParams>,
35
35
  functionName: keyof TFnToParams,
36
36
  service: string,
37
- options?: Omit<MutationOptions<TData, TError, TParams>, "mutationFn"> & {
38
- avoidTimeout?: boolean;
39
- customTimeout?: number;
40
- }
37
+ options?: Omit<MutationOptions<TData, TError, TParams>, "mutationFn">
41
38
  ) => {
42
- const {
43
- avoidTimeout = true,
44
- customTimeout = undefined,
45
- ...rest
46
- } = useMemo(() => options ?? {}, [options]);
39
+ const timeout = options?.timeout;
40
+ const { ...rest } = useMemo(() => options ?? {}, [options]);
47
41
  const mutationFn = useCallback(
48
42
  async (parameters: TParams) => {
49
43
  try {
@@ -52,15 +46,18 @@ const useCallMutationBase = <
52
46
  functionName: functionName.toString(),
53
47
  parameters,
54
48
  options: {
55
- avoidTimeout,
56
- customTimeout,
49
+ avoidTimeout: !timeout,
50
+ customTimeout: timeout,
57
51
  },
58
52
  });
59
- } catch (e: any) {
60
- throw e.message;
53
+ } catch (e) {
54
+ if (e instanceof Error) {
55
+ throw e;
56
+ }
57
+ throw new Error(e as string);
61
58
  }
62
59
  },
63
- [avoidTimeout, customTimeout, functionName, service]
60
+ [functionName, service, timeout]
64
61
  );
65
62
 
66
63
  return useMutation<TData, TError, TParams>({
@@ -106,16 +103,10 @@ const useCallQueryBase = <
106
103
  functionName: keyof TFnToParams,
107
104
  params: TParams,
108
105
  service: string,
109
- options?: Omit<QueryOptions<TData, TError, TParams, TSelect>, "queryFn"> & {
110
- avoidTimeout?: boolean;
111
- customTimeout?: number;
112
- }
106
+ options?: Omit<QueryOptions<TData, TError, TParams, TSelect>, "queryFn">
113
107
  ) => {
114
- const {
115
- avoidTimeout = true,
116
- customTimeout = undefined,
117
- ...rest
118
- } = useMemo(() => options ?? {}, [options]);
108
+ const timeout = options?.timeout;
109
+ const { ...rest } = useMemo(() => options ?? {}, [options]);
119
110
  const queryFn = useCallback(
120
111
  async (refetchParams: TParams | void, overrideTargetMachine?: string) => {
121
112
  try {
@@ -124,8 +115,8 @@ const useCallQueryBase = <
124
115
  functionName: functionName.toString(),
125
116
  parameters: refetchParams ?? params,
126
117
  options: {
127
- avoidTimeout,
128
- customTimeout,
118
+ avoidTimeout: !timeout,
119
+ customTimeout: timeout,
129
120
  },
130
121
  });
131
122
  } catch (e) {
@@ -135,7 +126,7 @@ const useCallQueryBase = <
135
126
  throw new Error(e as string);
136
127
  }
137
128
  },
138
- [avoidTimeout, customTimeout, functionName, service, params]
129
+ [functionName, service, params, timeout]
139
130
  );
140
131
 
141
132
  return useQuery<TData, TError, TParams, TSelect>({