@fjell/client-api 4.4.67 → 4.4.68

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.js CHANGED
@@ -857,11 +857,31 @@ var getFindOperation = (api, apiOptions, utilities) => {
857
857
  );
858
858
  const httpDuration = Date.now() - httpStartTime;
859
859
  if (!response || typeof response !== "object") {
860
- throw new Error("Invalid response: expected FindOperationResult object");
860
+ logger10.error("Invalid response from find operation", {
861
+ component: "client-api",
862
+ operation: "find",
863
+ finder,
864
+ responseType: typeof response,
865
+ response,
866
+ suggestion: "Server should return FindOperationResult with { items: [], metadata: {...} } structure"
867
+ });
868
+ throw new Error(
869
+ `Invalid response from find operation: expected FindOperationResult object with items and metadata, got ${typeof response}. This indicates a server-side API issue.`
870
+ );
861
871
  }
862
872
  const items = response.items || [];
863
873
  if (!Array.isArray(items)) {
864
- throw new Error("Invalid response: items must be an array");
874
+ logger10.error("Invalid response items from find operation", {
875
+ component: "client-api",
876
+ operation: "find",
877
+ finder,
878
+ itemsType: typeof items,
879
+ response,
880
+ suggestion: "Server should return FindOperationResult.items as an array"
881
+ });
882
+ throw new Error(
883
+ `Invalid response from find operation: items must be an array, got ${typeof items}. This indicates a server-side API issue.`
884
+ );
865
885
  }
866
886
  const processedItems = await utilities.processArray(Promise.resolve(items));
867
887
  const attemptDuration = Date.now() - attemptStartTime;
@@ -1690,10 +1710,51 @@ import { FjellHttpError, isFjellHttpError as isFjellHttpError2, extractErrorInfo
1690
1710
 
1691
1711
  // src/http/HttpWrapper.ts
1692
1712
  var logger21 = {
1693
- debug: (message, context) => console.debug(message, context),
1694
- info: (message, context) => console.info(message, context),
1695
- warning: (message, context) => console.warn(message, context),
1696
- error: (message, context) => console.error(message, context)
1713
+ debug: (message, context) => {
1714
+ const logData = {
1715
+ component: "client-api",
1716
+ subcomponent: "HttpWrapper",
1717
+ level: "debug",
1718
+ message,
1719
+ ...context,
1720
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1721
+ };
1722
+ console.debug(JSON.stringify(logData));
1723
+ },
1724
+ info: (message, context) => {
1725
+ const logData = {
1726
+ component: "client-api",
1727
+ subcomponent: "HttpWrapper",
1728
+ level: "info",
1729
+ message,
1730
+ ...context,
1731
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1732
+ };
1733
+ console.info(JSON.stringify(logData));
1734
+ },
1735
+ warning: (message, context) => {
1736
+ const logData = {
1737
+ component: "client-api",
1738
+ subcomponent: "HttpWrapper",
1739
+ level: "warning",
1740
+ message,
1741
+ ...context,
1742
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1743
+ };
1744
+ console.warn(JSON.stringify(logData));
1745
+ },
1746
+ error: (message, context) => {
1747
+ const logData = {
1748
+ component: "client-api",
1749
+ subcomponent: "HttpWrapper",
1750
+ level: "error",
1751
+ message,
1752
+ ...context,
1753
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1754
+ suggestion: context?.suggestion || "Check error details, retry configuration, and network connectivity"
1755
+ };
1756
+ console.error(JSON.stringify(logData));
1757
+ }
1697
1758
  };
1698
1759
  var DEFAULT_RETRY_CONFIG = {
1699
1760
  maxRetries: 3,
@@ -1776,10 +1837,20 @@ var HttpWrapper = class {
1776
1837
  await sleep(delay);
1777
1838
  }
1778
1839
  }
1779
- logger21.error(`${operationName} failed after ${this.retryConfig.maxRetries + 1} attempts`, {
1840
+ logger21.error(`${operationName} failed after all retry attempts`, {
1841
+ operation: operationName,
1780
1842
  errorCode: lastError?.code,
1781
1843
  errorMessage: lastError?.message,
1844
+ errorType: lastError?.constructor?.name,
1845
+ isRetryable: lastError?.isRetryable,
1846
+ totalAttempts: this.retryConfig.maxRetries + 1,
1782
1847
  duration: Date.now() - startTime,
1848
+ retryConfig: {
1849
+ maxRetries: this.retryConfig.maxRetries,
1850
+ initialDelayMs: this.retryConfig.initialDelayMs,
1851
+ backoffMultiplier: this.retryConfig.backoffMultiplier
1852
+ },
1853
+ suggestion: lastError?.isRetryable ? "Error is retryable but all attempts exhausted. Check network connectivity, server status, and increase retry limits if needed." : "Error is not retryable. Check request parameters, authentication, and server-side validation.",
1783
1854
  ...context
1784
1855
  });
1785
1856
  throw lastError;
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/ops/all.ts", "../src/logger.ts", "../src/ops/action.ts", "../src/ops/allAction.ts", "../src/ops/one.ts", "../src/ops/errorHandling.ts", "../src/ops/create.ts", "../src/ops/update.ts", "../src/ops/upsert.ts", "../src/ops/get.ts", "../src/ops/remove.ts", "../src/ops/find.ts", "../src/ops/findOne.ts", "../src/ops/facet.ts", "../src/ops/allFacet.ts", "../src/ops/index.ts", "../src/Utilities.ts", "../src/AItemAPI.ts", "../src/CItemAPI.ts", "../src/PItemAPI.ts", "../src/Instance.ts", "../src/InstanceFactory.ts", "../src/Registry.ts", "../src/errors/index.ts", "../src/index.ts", "../src/http/HttpWrapper.ts"],
4
- "sourcesContent": ["import {\n AllMethod,\n AllOperationResult,\n AllOptions,\n Item,\n ItemQuery,\n LocKeyArray,\n queryToParams,\n} from \"@fjell/core\";\nimport { HttpApi, QueryParams } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'all');\n\nexport const getAllOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): AllMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const all = async (\n query: ItemQuery = {} as ItemQuery,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = [],\n allOptions?: AllOptions\n ): Promise<AllOperationResult<V>> => {\n utilities.verifyLocations(locations);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n // Build query params from ItemQuery\n const params: QueryParams = queryToParams(query);\n\n // Override with AllOptions if provided (takes precedence)\n if (allOptions && 'limit' in allOptions && allOptions.limit != null) {\n params.limit = String(allOptions.limit);\n }\n if (allOptions && 'offset' in allOptions && allOptions.offset != null) {\n params.offset = String(allOptions.offset);\n }\n\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.allAuthenticated, params });\n\n logger.default('all', { query, locations, allOptions, requestOptions });\n logger.debug('QUERY_CACHE: client-api.all() - Making API request', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n allOptions: JSON.stringify(allOptions),\n path: utilities.getPath(loc),\n params: JSON.stringify(params),\n isAuthenticated: apiOptions.allAuthenticated\n });\n\n // Server returns AllOperationResult<V> with items and metadata\n const result = await api.httpGet<AllOperationResult<V>>(\n utilities.getPath(loc),\n requestOptions,\n );\n\n // Handle case where server returns {} or result.items is undefined\n // Extract items array from result, defaulting to empty array if missing\n let itemsArray: V[] = [];\n if (result) {\n if (result.items && Array.isArray(result.items)) {\n itemsArray = result.items;\n } else if (Array.isArray(result)) {\n itemsArray = result;\n } else {\n // Log unexpected response format\n logger.warning('Unexpected response format from server', {\n result,\n resultType: typeof result,\n hasItems: 'items' in result,\n resultKeys: result && typeof result === 'object' ? Object.keys(result) : []\n });\n itemsArray = [];\n }\n }\n\n // Ensure itemsArray is always a valid array before processing\n if (!Array.isArray(itemsArray)) {\n logger.error('itemsArray is not an array, defaulting to empty array', { itemsArray });\n itemsArray = [];\n }\n\n // Process items through utilities (date conversion, validation, etc.)\n const processedItems = await utilities.processArray(Promise.resolve(itemsArray));\n\n logger.debug('QUERY_CACHE: client-api.all() - API response received', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n itemCount: processedItems.length,\n total: result?.metadata?.total,\n hasMore: result?.metadata?.hasMore,\n itemKeys: processedItems.map(item => JSON.stringify(item.key))\n });\n\n // Return AllOperationResult with processed items\n return {\n items: processedItems,\n metadata: result?.metadata || { total: 0, returned: 0, offset: 0, hasMore: false }\n };\n }\n\n return all;\n}\n\n", "import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/client-api');\n\nexport default LibLogger;\n", "import { ActionOperationMethod, ComKey, Item, LocKeyArray, OperationParams, PriKey } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'action');\n\nexport const getActionOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n ): ActionOperationMethod<V, S, L1, L2, L3, L4, L5> => {\n const action = async (\n ik: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>,\n action: string,\n params?: OperationParams,\n ): Promise<[V, Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]> => {\n const requestOptions = Object.assign({}, apiOptions.postOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n logger.default('action', { ik, action, params, requestOptions });\n\n const response = await api.httpPost<[V, Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]>(\n `${utilities.getPath(ik)}/${action}`,\n params || {},\n requestOptions,\n );\n\n const [item, affectedItems] = response;\n return [\n await utilities.processOne(Promise.resolve(item)),\n affectedItems\n ];\n };\n return action;\n}\n", " \nimport { AllActionOperationMethod, ComKey, Item, LocKeyArray, OperationParams, PriKey } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'allAction');\n\nexport const getAllActionOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n ): AllActionOperationMethod<V, S, L1, L2, L3, L4, L5> => {\n const allAction = async (\n action: string,\n params?: OperationParams,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | []\n ): Promise<[V[], Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]> => {\n const requestOptions = Object.assign({}, apiOptions.postOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations || [];\n logger.default('allAction', { action, params, locations: loc, requestOptions });\n utilities.verifyLocations(loc);\n\n const response = await api.httpPost<[V[], Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]>(\n `${utilities.getPath(loc)}/${action}`,\n params || {},\n requestOptions,\n );\n\n // Handle edge cases where response might not be an array\n let items: V[] = [];\n let affectedItems: Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>> = [];\n\n if (Array.isArray(response)) {\n // Check if this is a properly formatted tuple response [items, affectedItems]\n if (response.length === 2 && Array.isArray(response[0])) {\n [items, affectedItems] = response;\n } else {\n // Handle other array responses - return as-is\n return response as any;\n }\n } else if (response && typeof response === 'object' && Object.keys(response).length === 0) {\n // Handle empty object response {}\n items = [];\n affectedItems = [];\n } else if (typeof response === 'string' && response === '{}') {\n // Handle string response \"{}\"\n items = [];\n affectedItems = [];\n }\n\n const processedItems = await utilities.processArray(Promise.resolve(items));\n if (Array.isArray(processedItems)) {\n processedItems.forEach(item => utilities.validatePK(item));\n }\n return [\n processedItems,\n affectedItems\n ];\n };\n return allAction;\n}\n", "import {\n AllOperationResult,\n Item,\n ItemQuery,\n LocKeyArray,\n OneMethod,\n QueryParams,\n queryToParams\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'one');\n\nexport const getOneOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): OneMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const one = async (\n query: ItemQuery = {} as ItemQuery,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = []\n ): Promise<V | null> => {\n utilities.verifyLocations(locations);\n\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n // Add limit: 1 to optimize the query\n const params: QueryParams = queryToParams(query);\n params.limit = '1';\n \n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.readAuthenticated, params });\n logger.default('one', { query, locations, requestOptions });\n logger.debug('QUERY_CACHE: client-api.one() - Making API request', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n path: utilities.getPath(loc),\n params: JSON.stringify(params),\n isAuthenticated: apiOptions.readAuthenticated\n });\n\n // Server returns AllOperationResult<V> with items and metadata\n const result = await api.httpGet<AllOperationResult<V>>(\n utilities.getPath(loc),\n requestOptions,\n );\n\n // Process items through utilities (date conversion, validation, etc.)\n const items = await utilities.processArray(Promise.resolve(result.items));\n\n let item: V | null = null;\n if (items.length > 0) {\n item = items[0];\n logger.debug('QUERY_CACHE: client-api.one() - API response received', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n itemKey: JSON.stringify(item.key)\n });\n } else {\n logger.debug('QUERY_CACHE: client-api.one() - API returned no items', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations)\n });\n }\n\n return item;\n }\n\n return one;\n}\n", "/**\n * Shared error handling utilities for all HTTP operations\n */\n\nimport { isFjellHttpError } from '@fjell/http-api';\n\n/**\n * Determines if an error should be retried based on error type and status code\n */\nexport function shouldRetryError(error: any): boolean {\n // Check FjellHttpError retryable flag first\n if (isFjellHttpError(error)) {\n return error.isRetryable();\n }\n\n // Retry on network errors and timeouts\n if (error.code === 'ECONNREFUSED' ||\n error.code === 'ENOTFOUND' ||\n error.code === 'ENETUNREACH' ||\n error.message?.includes('timeout') ||\n error.message?.includes('network')) {\n return true;\n }\n\n // Retry on HTTP 5xx errors and 429 (rate limiting)\n if (error.status >= 500 || error.status === 429) {\n return true;\n }\n\n // Don't retry on 4xx client errors (except 429)\n if (error.status >= 400 && error.status < 500 && error.status !== 429) {\n return false;\n }\n\n // Default to retrying unknown errors\n return true;\n}\n\n/**\n * Calculates retry delay with exponential backoff and jitter\n */\nexport function calculateRetryDelay(attempt: number, config: any): number {\n const exponentialDelay = (config.initialDelayMs || 1000) * Math.pow(config.backoffMultiplier || 2, attempt);\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs || 30000);\n\n // Add jitter: random value between 50% and 100% of calculated delay\n const jitter = 0.5 + (Math.random() * 0.5);\n return Math.floor(cappedDelay * jitter);\n}\n\n/**\n * Enhances error with additional context information\n * Preserves FjellHttpError without modification\n */\nexport function enhanceError(error: any, context: any): any {\n if (!error) return new Error('Unknown error occurred');\n\n // Don't modify FjellHttpError - it already has full context\n if (isFjellHttpError(error)) {\n return error;\n }\n\n // If it's already enhanced, return as-is\n if (error.context) return error;\n\n // Add context to the error\n const enhancedError = new Error(error.message || 'HTTP operation failed');\n Object.assign(enhancedError, {\n code: error.code || error.status || 'UNKNOWN_ERROR',\n status: error.status,\n context,\n originalError: error\n });\n\n return enhancedError;\n}\n\n/**\n * Gets default retry configuration merged with provided options\n */\nexport function getRetryConfig(apiOptions: any): any {\n return {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n}\n\n/**\n * Handles custom error handler execution with error protection\n */\nexport function executeErrorHandler(\n errorHandler: ((error: any, context?: Record<string, any>) => void) | undefined,\n error: any,\n context: any,\n logger: any\n): void {\n if (!errorHandler) return;\n\n try {\n errorHandler(error, context);\n } catch (handlerError: any) {\n logger.error('Custom error handler failed', {\n originalError: error.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n}\n\n/**\n * Common retry loop logic for HTTP operations\n */\nexport async function executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n operationContext: Record<string, any>,\n apiOptions: any,\n logger: any,\n specialErrorHandling?: (error: any) => T | null | undefined\n): Promise<T> {\n const retryConfig = getRetryConfig(apiOptions);\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n logger.debug(`Executing ${operationName} (attempt ${attempt + 1})`, operationContext);\n\n const result = await operation();\n\n if (attempt > 0) {\n logger.info(`${operationName} operation succeeded after ${attempt} retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n duration: Date.now() - startTime\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n\n // Handle special error cases (like 404 returning null)\n if (specialErrorHandling) {\n const specialResult = specialErrorHandling(error);\n if (specialResult !== void 0) {\n return specialResult as T;\n }\n }\n\n // Don't retry on the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug(`Not retrying ${operationName} operation due to non-retryable error`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n attempt: attempt + 1\n });\n break;\n }\n\n // Calculate delay with exponential backoff\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`Retrying ${operationName} operation (attempt ${attempt + 2}) after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n delay,\n attemptNumber: attempt + 1\n });\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n // Handle final error\n const finalError = enhanceError(lastError, operationContext);\n\n // Execute custom error handler if provided\n executeErrorHandler(apiOptions.errorHandler, finalError, operationContext, logger);\n\n logger.error(`${operationName} operation failed after ${retryConfig.maxRetries + 1} attempts`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n duration: Date.now() - startTime,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n}\n", "import {\n CreateMethod,\n CreateOptions,\n Item,\n LocKeyArray\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'create');\n\nexport const getCreateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): CreateMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const create = async (\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n options?: CreateOptions<S, L1, L2, L3, L4, L5>\n ): Promise<V> => {\n // Extract locations or key from options for backward compatibility\n const locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = options?.locations || [];\n const requestOptions = Object.assign({}, apiOptions.postOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n logger.default('create', { item, options, locations, requestOptions });\n utilities.verifyLocations(locations);\n \n // If a key was provided in options, include it in the item\n let itemToCreate = item;\n if (options?.key) {\n itemToCreate = { ...item, ...options.key };\n }\n\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n const operationContext = {\n operation: 'create',\n path: utilities.getPath(loc),\n itemType: typeof item,\n hasLocations: locations.length > 0\n };\n\n // Retry configuration from options or defaults\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n logger.debug(`Creating item (attempt ${attempt + 1})`, operationContext);\n\n const result = await utilities.processOne(api.httpPost<V>(\n utilities.getPath(loc),\n itemToCreate,\n requestOptions,\n ));\n\n utilities.validatePK(result);\n\n if (attempt > 0) {\n logger.info(`Create operation succeeded after ${attempt} retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n duration: Date.now() - startTime\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n\n // Don't retry on the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Determine if error is retryable\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('Not retrying create operation due to non-retryable error', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n attempt: attempt + 1\n });\n break;\n }\n\n // Calculate delay with exponential backoff\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`Retrying create operation (attempt ${attempt + 2}) after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n delay,\n attemptNumber: attempt + 1\n });\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n // Handle final error\n const finalError = enhanceError(lastError, operationContext);\n\n // Call custom error handler if provided\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('Custom error handler failed', {\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`Create operation failed after ${retryConfig.maxRetries + 1} attempts`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n duration: Date.now() - startTime,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n };\n\n return create;\n}\n", "import {\n ComKey,\n Item,\n PriKey,\n UpdateMethod\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'update');\n\nexport const getUpdateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): UpdateMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const update = async (\n ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n ): Promise<V> => {\n const requestOptions = Object.assign({}, apiOptions.putOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n const keyStr = JSON.stringify(ik);\n \n logger.default('update', { ik, item, requestOptions });\n\n const operationContext = {\n operation: 'update',\n path: utilities.getPath(ik),\n keyType: typeof ik,\n key: keyStr\n };\n\n logger.debug('CLIENT_API: update() started', {\n ...operationContext,\n isAuthenticated: apiOptions.writeAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: update() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n const result = await utilities.processOne(\n api.httpPut<V>(\n utilities.getPath(ik),\n item,\n requestOptions,\n )\n );\n const httpDuration = Date.now() - httpStartTime;\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n\n if (attempt > 0) {\n logger.info(`CLIENT_API: update() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration\n });\n } else {\n logger.debug(`CLIENT_API: update() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n logger.debug('CLIENT_API: update() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: update() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: update() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: update() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return update;\n}\n", "import {\n ComKey,\n Item,\n LocKeyArray,\n PriKey,\n UpdateOptions\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'upsert');\n\nexport const getUpsertOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n ) => {\n\n const upsert = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n locations?: LocKeyArray<L1, L2, L3, L4, L5>,\n options?: UpdateOptions\n ): Promise<V> => {\n const requestOptions = Object.assign({}, apiOptions.putOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n logger.default('upsert', { key, item, locations, options, requestOptions });\n\n // Add locations to query params if provided\n const path = utilities.getPath(key);\n let url = locations && locations.length > 0\n ? `${path}?locations=${encodeURIComponent(JSON.stringify(locations))}`\n : path;\n\n // Add update options to query params if provided\n if (options) {\n const separator = url.includes('?') ? '&' : '?';\n url += `${separator}options=${encodeURIComponent(JSON.stringify(options))}`;\n }\n\n return await utilities.processOne(\n api.httpPut<V>(\n url,\n { ...item, upsert: true },\n requestOptions,\n ));\n }\n\n return upsert;\n}\n\n", "import {\n ComKey,\n GetMethod,\n Item,\n PriKey,\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'get');\n\nexport const getGetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): GetMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const get = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n ): Promise<V | null> => {\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.readAuthenticated });\n const keyStr = JSON.stringify(ik);\n \n logger.default('get', { ik, requestOptions });\n\n const operationContext = {\n operation: 'get',\n path: utilities.getPath(ik),\n keyType: typeof ik,\n key: keyStr\n };\n\n logger.debug('CLIENT_API: get() started', {\n ...operationContext,\n isAuthenticated: apiOptions.readAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: get() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n const result = await utilities.processOne(\n api.httpGet<V>(\n utilities.getPath(ik),\n requestOptions,\n )\n );\n const httpDuration = Date.now() - httpStartTime;\n\n utilities.validatePK(result);\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n\n if (attempt > 0) {\n logger.info(`CLIENT_API: get() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration\n });\n } else {\n logger.debug(`CLIENT_API: get() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration,\n hasResult: !!result\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n // Handle 404 errors specially - return null instead of throwing\n if (error.status === 404) {\n logger.debug('CLIENT_API: get() - item not found (404)', {\n ...operationContext,\n attemptDuration,\n totalDuration: Date.now() - startTime\n });\n return null;\n }\n\n logger.debug('CLIENT_API: get() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: get() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: get() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: get() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return get;\n}\n", "import {\n ComKey,\n Item,\n PriKey,\n RemoveMethod\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'remove');\n\nexport const getRemoveOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): RemoveMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const remove = async (\n ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n ): Promise<V | void> => {\n const requestOptions = Object.assign({}, apiOptions.deleteOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n const keyStr = JSON.stringify(ik);\n \n logger.default('remove', { ik, requestOptions });\n\n const operationContext = {\n operation: 'remove',\n path: utilities.getPath(ik),\n keyType: typeof ik,\n key: keyStr\n };\n\n logger.debug('CLIENT_API: remove() started', {\n ...operationContext,\n isAuthenticated: apiOptions.writeAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: remove() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n const result = await api.httpDelete<V | boolean | void>(utilities.getPath(ik), requestOptions);\n const httpDuration = Date.now() - httpStartTime;\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n\n if (attempt > 0) {\n logger.info(`CLIENT_API: remove() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration\n });\n } else {\n logger.debug(`CLIENT_API: remove() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration\n });\n }\n\n // If result is a boolean, return void for compatibility\n if (typeof result === 'boolean') {\n return;\n }\n \n // Otherwise return the item (if the server returns it)\n return result as V | void;\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n // Handle 404 errors specially - item already deleted, consider success\n if (error.status === 404) {\n logger.debug('CLIENT_API: remove() - item not found (404), treating as success', {\n ...operationContext,\n attemptDuration,\n totalDuration: Date.now() - startTime\n });\n return;\n }\n\n logger.debug('CLIENT_API: remove() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: remove() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: remove() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: remove() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return remove;\n}\n", "import {\n FindMethod,\n FindOperationResult,\n FindOptions,\n Item,\n LocKeyArray,\n QueryParams\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { finderToParams } from \"../AItemAPI\";\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'find');\n\nexport const getFindOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): FindMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const find = async (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = [],\n findOptions?: FindOptions\n ): Promise<FindOperationResult<V>> => {\n utilities.verifyLocations(locations);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n const mergedParams: QueryParams = finderToParams(finder, finderParams);\n \n // Add pagination options to query parameters\n if (findOptions?.limit != null) {\n mergedParams.limit = findOptions.limit.toString();\n }\n if (findOptions?.offset != null) {\n mergedParams.offset = findOptions.offset.toString();\n }\n \n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.allAuthenticated, params: mergedParams });\n logger.default('find', { finder, finderParams, locations, findOptions, requestOptions });\n\n const operationContext = {\n operation: 'find',\n finder,\n path: utilities.getPath(loc),\n params: JSON.stringify(mergedParams),\n locations: JSON.stringify(locations)\n };\n\n logger.debug('CLIENT_API: find() started', {\n ...operationContext,\n findOptions,\n isAuthenticated: apiOptions.allAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: find() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n // Expect FindOperationResult from server\n const response = await api.httpGet<FindOperationResult<V>>(\n utilities.getPath(loc),\n requestOptions,\n );\n const httpDuration = Date.now() - httpStartTime;\n\n // Validate response shape to prevent downstream errors\n if (!response || typeof response !== 'object') {\n throw new Error('Invalid response: expected FindOperationResult object');\n }\n\n // Handle case where response.items might be undefined\n const items = response.items || [];\n if (!Array.isArray(items)) {\n throw new Error('Invalid response: items must be an array');\n }\n \n // Process items array (convert dates, etc.)\n const processedItems = await utilities.processArray(Promise.resolve(items));\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n \n if (attempt > 0) {\n logger.info(`CLIENT_API: find() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration,\n itemCount: processedItems.length\n });\n } else {\n logger.debug(`CLIENT_API: find() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration,\n itemCount: processedItems.length,\n total: response.metadata?.total || 0\n });\n }\n\n return {\n items: processedItems,\n metadata: response.metadata || {\n total: processedItems.length,\n returned: processedItems.length,\n offset: findOptions?.offset ?? 0,\n limit: findOptions?.limit,\n hasMore: false\n }\n };\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n logger.debug('CLIENT_API: find() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: find() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: find() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: find() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return find as unknown as FindMethod<V, S, L1, L2, L3, L4, L5>;\n}\n", "import {\n FindOneMethod,\n Item,\n LocKeyArray,\n QueryParams\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { finderToParams } from \"../AItemAPI\";\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'find');\n\nexport const getFindOneOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): FindOneMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const findOne = async (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = []\n ): Promise<V> => {\n utilities.verifyLocations(locations);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n const params: QueryParams = finderToParams(finder, finderParams);\n params.one = true;\n\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.allAuthenticated, params });\n logger.default('findOne', { finder, finderParams, locations, requestOptions });\n logger.debug('QUERY_CACHE: client-api.findOne() - Making API request', {\n finder,\n finderParams: JSON.stringify(finderParams),\n locations: JSON.stringify(locations),\n path: utilities.getPath(loc),\n params: JSON.stringify(params),\n isAuthenticated: apiOptions.allAuthenticated\n });\n\n const results = await utilities.processArray(\n api.httpGet<V[]>(\n utilities.getPath(loc),\n requestOptions,\n ));\n \n const result = results[0];\n if (result) {\n utilities.validatePK(result);\n logger.debug('QUERY_CACHE: client-api.findOne() - API response received', {\n finder,\n finderParams: JSON.stringify(finderParams),\n locations: JSON.stringify(locations),\n itemKey: JSON.stringify(result.key)\n });\n } else {\n logger.debug('QUERY_CACHE: client-api.findOne() - API returned no items', {\n finder,\n finderParams: JSON.stringify(finderParams),\n locations: JSON.stringify(locations)\n });\n }\n \n return result;\n }\n\n return findOne;\n}\n", "import {\n ComKey,\n FacetOperationMethod,\n Item,\n PriKey,\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'facet');\n\nexport const getFacetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): FacetOperationMethod<S, L1, L2, L3, L4, L5> => {\n\n /**\n * Executes a facet operation on an item.\n *\n * A facet is a piece of information that is related to an item - it represents\n * a specific aspect or characteristic of the item. Unlike actions which may\n * return items or perform operations, facets are informational queries that\n * return data about a particular facet of an item.\n *\n * @param ik - The item key (composite or primary key) identifying the item\n * @param facet - The name of the facet to query\n * @param body - Optional request body for the facet operation\n * @param options - Optional HTTP request options\n * @returns Promise resolving to the facet data\n */\n const facet = async (\n ik: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>,\n facet: string,\n params: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n ): Promise<any> => {\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.writeAuthenticated, params });\n logger.default('facet', { ik, facet, requestOptions });\n\n return api.httpGet<any>(\n `${utilities.getPath(ik)}/${facet}`,\n requestOptions,\n );\n\n };\n\n return facet;\n}\n", "import {\n AllFacetOperationMethod,\n Item,\n LocKeyArray\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'allFacet');\n\nexport const getAllFacetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): AllFacetOperationMethod<L1, L2, L3, L4, L5> => {\n\n const allFacet = async (\n facet: string,\n params: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = []\n ): Promise<V[]> => {\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.writeAuthenticated, params });\n logger.default('allFacet', { facet, locations, requestOptions });\n utilities.verifyLocations(locations);\n\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n // TODO: This should respond to either a single object, or multiple objects in an array.\n return api.httpGet<V[]>(\n `${utilities.getPath(loc)}/${facet}`,\n requestOptions,\n )\n };\n\n return allFacet;\n}\n", "/* eslint-disable indent */\nimport { Item } from \"@fjell/core\"\nimport { getAllOperation } from \"./all\"\nimport { getActionOperation } from \"./action\"\nimport { Utilities } from \"../Utilities\"\nimport { HttpApi } from \"@fjell/http-api\"\nimport { getAllActionOperation } from \"./allAction\"\nimport { getOneOperation } from \"./one\"\nimport { getCreateOperation } from \"./create\"\nimport { getUpdateOperation } from \"./update\"\nimport { getUpsertOperation } from \"./upsert\"\nimport { getGetOperation } from \"./get\"\nimport { getRemoveOperation } from \"./remove\"\nimport { getFindOperation } from \"./find\"\nimport { ClientApiOptions } from \"../ClientApiOptions\"\nimport { ClientApi } from \"../ClientApi\"\nimport { getFindOneOperation } from \"./findOne\"\nimport { getFacetOperation } from \"./facet\"\nimport { getAllFacetOperation } from \"./allFacet\"\n\nexport const getOperations =\n <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>,\n\n ): ClientApi<V, S, L1, L2, L3, L4, L5> => {\n return {\n action: getActionOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n all: getAllOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n allAction: getAllActionOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n allFacet: getAllFacetOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n create: getCreateOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n facet: getFacetOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n findOne: getFindOneOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n find: getFindOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n get: getGetOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n one: getOneOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n remove: getRemoveOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n update: getUpdateOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n upsert: getUpsertOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n }\n }", "import {\n ComKey,\n validatePK as coreValidatePK,\n generateKeyArray,\n isPriKey,\n Item,\n LocKey,\n LocKeyArray,\n PriKey,\n} from \"@fjell/core\";\n\nimport LibLogger from \"./logger\";\nimport deepmerge from \"deepmerge\";\n\nconst logger = LibLogger.get('client-api', 'Utility');\n\nexport interface Utilities<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> {\n verifyLocations: (locations: LocKeyArray<L1, L2, L3, L4, L5> | [] | never) => boolean;\n processOne: (apiCall: Promise<V>) => Promise<V>;\n processArray: (api: Promise<V[]>) => Promise<V[]>;\n convertDoc: (doc: V) => V;\n getPath: (key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S> | LocKeyArray<L1, L2, L3, L4, L5> | []) => string;\n validatePK: (item: Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[]) =>\n Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[];\n}\n\nexport const createUtilities = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(pkType: S, pathNames: string[]): Utilities<V, S, L1, L2, L3, L4, L5> => {\n\n logger.default('createUtilities', { pkType, pathNames });\n\n const verifyLocations = (\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] | never,\n ): boolean => {\n\n if (locations && locations.length < pathNames.length - 1) {\n throw new Error('Not enough locations for pathNames: locations:'\n + locations.length + ' pathNames:' + pathNames.length);\n }\n return true;\n }\n\n const processOne = async (\n apiCall: Promise<V>,\n ): Promise<V> => {\n logger.default('processOne', { apiCall });\n const response = await apiCall;\n logger.default('processOne response', {\n responseType: typeof response,\n hasData: !!response\n });\n return convertDoc(response);\n };\n\n const processArray = async (\n api: Promise<V[]>,\n ): Promise<V[]> => {\n logger.default('processArray', { api });\n const response = await api;\n logger.default('processArray response', {\n responseType: typeof response,\n isArray: Array.isArray(response),\n length: Array.isArray(response) ? response.length : 0\n });\n if (response && Array.isArray(response)) {\n return response.map((subjectChat: V) =>\n convertDoc(subjectChat),\n ) as unknown as V[];\n } else {\n logger.error('Response was not an array', { response });\n throw new Error('Response was not an array');\n }\n };\n\n const convertDoc = (doc: V): V => {\n logger.default('convertDoc', { doc });\n if (doc && doc.events) {\n const events = doc.events;\n for (const key in events) {\n events[key] = deepmerge(events[key], { at: events[key].at ? new Date(events[key].at) : null });\n }\n\n return doc as unknown as V;\n } else {\n return doc;\n }\n };\n\n const getPath =\n (\n key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S> | LocKeyArray<L1, L2, L3, L4, L5> | [],\n ):\n string => {\n\n const localPathNames = [...pathNames];\n logger.default('getPath', { key, pathNames: localPathNames });\n\n const keys = generateKeyArray(key);\n\n // For contained items (ComKey), we need to process location keys first\n // to match the URL structure: /parents/{parentId}/children/{childId}\n if (keys.length > 1) {\n // Separate PriKeys and LocKeys\n const priKeys = keys.filter(k => isPriKey(k));\n const locKeys = keys.filter(k => !isPriKey(k));\n \n // Location keys come in child->parent order, but paths must be parent->child\n // So reverse the locKeys to get parent->child order for path building\n const reversedLocKeys = [...locKeys].reverse();\n \n // Reorder: reversed LocKeys first, then PriKeys\n const reorderedKeys = [...reversedLocKeys, ...priKeys];\n logger.default('Reordered keys for contained item', {\n original: keys,\n locKeys,\n reversedLocKeys,\n reordered: reorderedKeys,\n priKeys\n });\n \n let path: string = addPath('', reorderedKeys, localPathNames);\n\n // If there is only one collection left in the collections array, this means that\n // we received LocKeys and we need to add the last collection to the reference\n if (localPathNames.length === 1) {\n path = `${path}/${localPathNames[0]}`;\n }\n\n logger.default('getPath created', { key, path });\n return path;\n } else {\n // For primary items or single keys\n // If it's a LocKey array, we still need to reverse it for path building\n const priKeys = keys.filter(k => isPriKey(k));\n const locKeys = keys.filter(k => !isPriKey(k));\n \n // Reverse locKeys if present (child->parent to parent->child)\n const reversedLocKeys = locKeys.length > 0 ? [...locKeys].reverse() : [];\n const orderedKeys = [...reversedLocKeys, ...priKeys];\n \n let path: string = addPath('', orderedKeys, localPathNames);\n\n // If there is only one collection left in the collections array, this means that\n // we received LocKeys and we need to add the last collection to the reference\n if (localPathNames.length === 1) {\n path = `${path}/${localPathNames[0]}`;\n }\n\n logger.default('getPath created', { key, path });\n return path;\n }\n };\n\n const addPath = (\n base: string,\n keys: Array<PriKey<S> | LocKey<L1 | L2 | L3 | L4 | L5>>,\n localPathNames: string[],\n ): string => {\n logger.default('addPath', { base, keys, pathNames: localPathNames });\n if (keys.length < localPathNames.length - 1) {\n logger.error('addPath should never have keys with a length less than the length of pathNames - 1',\n { keys, localPathNames });\n throw new Error('addPath should never have keys with a length less than the length of pathNames - 1: '\n + keys.length + ' ' + localPathNames.length + ' ' + JSON.stringify(keys, localPathNames));\n } else if (keys.length > localPathNames.length) {\n logger.error('addPath should never have keys with a length greater than the length of pathNames',\n { keys, pathNames });\n throw new Error('addPath should never have keys with a length greater than the length of pathNames: '\n + keys.length + ' ' + localPathNames.length + ' ' + JSON.stringify(keys, localPathNames));\n }\n if (keys.length === 0) {\n // If you've recursively consumed all of the keys, return the base.\n logger.default('addPath returning base', { base });\n return base;\n } else {\n const currentKey = keys[0];\n const keyType = isPriKey(currentKey) ? currentKey.kt : currentKey.kt;\n \n // Find the best matching pathName for this key type\n const matchingPathNameIndex = localPathNames.findIndex(pathName => {\n const singularPathName = pathName.endsWith('s') ? pathName.slice(0, -1) : pathName;\n const pluralKeyType = keyType + 's';\n \n // Try various matching strategies\n return pathName === pluralKeyType || // photos === photo+s\n pathName === keyType + 'es' || // matches === match+es\n singularPathName === keyType || // photo === photo\n pathName.toLowerCase() === keyType.toLowerCase() || // case insensitive\n pathName.toLowerCase() === pluralKeyType.toLowerCase(); // case insensitive plural\n });\n \n if (matchingPathNameIndex !== -1) {\n // Found a matching pathName\n const pathName = localPathNames.splice(matchingPathNameIndex, 1)[0];\n const key = keys.shift()!;\n const id = isPriKey(key) ? (key as PriKey<S>).pk : (key as LocKey<L1 | L2 | L3 | L4 | L5>).lk;\n const nextBase = `${base}/${pathName}/${id}`;\n logger.default('Adding Path (matched)', {\n pathName,\n keyType,\n isPriKey: isPriKey(key),\n key,\n nextBase\n });\n return addPath(nextBase, keys, localPathNames);\n } else {\n // No match found, use first available pathName\n const pathName = localPathNames.shift()!;\n const key = keys.shift()!;\n const id = isPriKey(key) ? (key as PriKey<S>).pk : (key as LocKey<L1 | L2 | L3 | L4 | L5>).lk;\n const nextBase = `${base}/${pathName}/${id}`;\n logger.default('Adding Path (no match, using first)', {\n pathName,\n keyType,\n isPriKey: isPriKey(key),\n key,\n nextBase\n });\n return addPath(nextBase, keys, localPathNames);\n }\n }\n\n }\n\n const validatePK = (\n item: Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[]):\n Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[] => {\n return coreValidatePK<S, L1, L2, L3, L4, L5>(item, pkType);\n }\n\n return {\n verifyLocations,\n processOne,\n convertDoc,\n processArray,\n getPath,\n validatePK,\n }\n}\n", "/* eslint-disable indent */\nimport { Item } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"./ClientApiOptions\";\nimport { getOperations } from \"./ops\";\nimport { createUtilities } from \"./Utilities\";\nimport { ClientApi } from \"./ClientApi\";\n\nimport LibLogger from \"./logger\";\n\nconst logger = LibLogger.get('AItemAPI');\n\nexport type PathNamesArray<\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> =\n ([L5] extends [never] ?\n ([L4] extends [never] ?\n ([L3] extends [never] ?\n ([L2] extends [never] ?\n ([L1] extends [never] ?\n [string] :\n [string, string]) :\n [string, string, string]) :\n [string, string, string, string]) :\n [string, string, string, string, string]) :\n [string, string, string, string, string, string]);\n\nexport const finderToParams = (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>\n): Record<string, string> => {\n return {\n finder,\n finderParams: JSON.stringify(finderParams),\n };\n};\n\nexport const createAItemAPI = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n api: HttpApi,\n pkType: S,\n pathNames: PathNamesArray<L1, L2, L3, L4, L5>,\n options?: ClientApiOptions,\n): ClientApi<V, S, L1, L2, L3, L4, L5> => {\n\n logger.default('createAItemAPI', { pkType, pathNames, options });\n\n let mergedOptions: ClientApiOptions;\n\n const defaultOptions: ClientApiOptions = {\n readAuthenticated: true,\n allAuthenticated: true,\n writeAuthenticated: true,\n getOptions: {},\n postOptions: {},\n putOptions: {},\n deleteOptions: {},\n };\n\n if (options) {\n mergedOptions = Object.assign({}, defaultOptions, options);\n } else {\n mergedOptions = defaultOptions;\n }\n\n const utilities = createUtilities<V, S, L1, L2, L3, L4, L5>(pkType, pathNames);\n const operations = getOperations<V, S, L1, L2, L3, L4, L5>(api, mergedOptions, utilities);\n\n return {\n action: operations.action,\n all: operations.all,\n allAction: operations.allAction,\n allFacet: operations.allFacet,\n create: operations.create,\n facet: operations.facet,\n find: operations.find,\n findOne: operations.findOne,\n get: operations.get,\n one: operations.one,\n remove: operations.remove,\n update: operations.update,\n upsert: operations.upsert,\n }\n}", "\nimport {\n AllOperationResult,\n AllOptions,\n FindOperationResult,\n FindOptions,\n Item,\n ItemQuery,\n LocKeyArray,\n} from \"@fjell/core\";\nimport {\n HttpApi\n} from \"@fjell/http-api\";\nimport { createAItemAPI, PathNamesArray } from \"./AItemAPI\";\n\nimport LibLogger from \"./logger\";\nimport { ClientApi } from \"./ClientApi\";\nimport { ClientApiOptions } from \"./ClientApiOptions\";\n\nconst logger = LibLogger.get('CItemAPI');\n\n/**\n * CItemApi extends ClientApi for contained items.\n * No additional methods needed - pure Operations interface.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface CItemApi<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n> extends ClientApi<V, S, L1, L2, L3, L4, L5> {\n // Inherits all methods from ClientApi (which extends core Operations)\n}\n\n/**\n * Helper function to ensure items are extracted from { items, metadata } response structure.\n * This provides defensive handling in case the underlying API doesn't extract items properly.\n */\nfunction ensureItemsExtracted<T>(\n result: any,\n operationName: string\n): { items: T[]; metadata: any } {\n // If result already has the correct structure with items array, return as-is\n if (result && typeof result === 'object' && Array.isArray(result.items)) {\n return result;\n }\n \n // If result is the raw { items, metadata } structure but items wasn't extracted\n if (result && typeof result === 'object' && 'items' in result && 'metadata' in result) {\n logger.debug(`${operationName}: Extracting items from response structure`, {\n hasItems: Array.isArray(result.items),\n itemsType: typeof result.items,\n itemsLength: Array.isArray(result.items) ? result.items.length : 'N/A'\n });\n return {\n items: Array.isArray(result.items) ? result.items : [],\n metadata: result.metadata || {}\n };\n }\n \n // If result is an array (legacy format), wrap it\n if (Array.isArray(result)) {\n logger.debug(`${operationName}: Wrapping array result in { items, metadata } structure`);\n return {\n items: result,\n metadata: {\n total: result.length,\n returned: result.length,\n offset: 0,\n hasMore: false\n }\n };\n }\n \n // Fallback: return empty result\n logger.warning(`${operationName}: Unexpected response format, returning empty result`, {\n resultType: typeof result,\n resultKeys: result && typeof result === 'object' ? Object.keys(result) : []\n });\n return {\n items: [],\n metadata: {}\n };\n}\n\nexport const createCItemApi = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(api: HttpApi, type: S, pathNames: PathNamesArray<L1, L2, L3, L4, L5>, options?: ClientApiOptions): CItemApi<V, S, L1, L2, L3, L4, L5> => {\n\n logger.default('createCItemApi', { api, type, pathNames, options });\n\n const aItemAPI = createAItemAPI(api, type, pathNames, options);\n\n // Wrap methods that return { items, metadata } to ensure items are always extracted\n const all = async (\n query?: ItemQuery,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [],\n allOptions?: AllOptions\n ): Promise<AllOperationResult<V>> => {\n const result = allOptions != null\n ? await aItemAPI.all(query, locations, allOptions)\n : await aItemAPI.all(query, locations);\n const extracted = ensureItemsExtracted<V>(result, 'all');\n return extracted as AllOperationResult<V>;\n };\n\n const find = async (\n finder: string,\n finderParams?: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [],\n findOptions?: FindOptions\n ): Promise<FindOperationResult<V>> => {\n const result = findOptions != null\n ? await aItemAPI.find(finder, finderParams, locations, findOptions)\n : await aItemAPI.find(finder, finderParams, locations);\n const extracted = ensureItemsExtracted<V>(result, 'find');\n return extracted as FindOperationResult<V>;\n };\n\n return {\n action: aItemAPI.action,\n all,\n allAction: aItemAPI.allAction,\n allFacet: aItemAPI.allFacet,\n one: aItemAPI.one,\n get: aItemAPI.get,\n create: aItemAPI.create,\n remove: aItemAPI.remove,\n update: aItemAPI.update,\n upsert: aItemAPI.upsert,\n facet: aItemAPI.facet,\n find,\n findOne: aItemAPI.findOne,\n } as unknown as CItemApi<V, S, L1, L2, L3, L4, L5>;\n}\n", "import { AllOperationResult, AllOptions, ComKey, FindOperationResult, FindOptions, Item, ItemQuery, PriKey } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\nimport { createAItemAPI } from \"./AItemAPI\";\nimport { ClientApi } from \"./ClientApi\";\n\nimport LibLogger from \"./logger\";\nimport { ClientApiOptions } from \"./ClientApiOptions\";\nconst logger = LibLogger.get('PItemAPI');\n\n/**\n * Helper function to ensure items are extracted from { items, metadata } response structure.\n * This provides defensive handling in case the underlying API doesn't extract items properly.\n */\nfunction ensureItemsExtracted<T>(\n result: any,\n operationName: string\n): { items: T[]; metadata: any } {\n // If result already has the correct structure with items array, return as-is\n if (result && typeof result === 'object' && Array.isArray(result.items)) {\n return result;\n }\n \n // If result is the raw { items, metadata } structure but items wasn't extracted\n if (result && typeof result === 'object' && 'items' in result && 'metadata' in result) {\n logger.debug(`${operationName}: Extracting items from response structure`, {\n hasItems: Array.isArray(result.items),\n itemsType: typeof result.items,\n itemsLength: Array.isArray(result.items) ? result.items.length : 'N/A'\n });\n return {\n items: Array.isArray(result.items) ? result.items : [],\n metadata: result.metadata || {}\n };\n }\n \n // If result is an array (legacy format), wrap it\n if (Array.isArray(result)) {\n logger.debug(`${operationName}: Wrapping array result in { items, metadata } structure`);\n return {\n items: result,\n metadata: {\n total: result.length,\n returned: result.length,\n offset: 0,\n hasMore: false\n }\n };\n }\n \n // Fallback: return empty result\n logger.warning(`${operationName}: Unexpected response format, returning empty result`, {\n resultType: typeof result,\n resultKeys: result && typeof result === 'object' ? Object.keys(result) : []\n });\n return {\n items: [],\n metadata: {}\n };\n}\n\n// PItemApi now directly extends ClientApi without re-declaring methods\n// This ensures compatibility with core Operations interface\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface PItemApi<\n V extends Item<S>,\n S extends string\n> extends ClientApi<V, S> {\n // Inherits all methods from ClientApi\n}\n\nexport const createPItemApi = <V extends Item<S>, S extends string>(\n api: HttpApi,\n type: S,\n pathName: string,\n options?: ClientApiOptions\n): PItemApi<V, S> => {\n\n logger.default('createPItemApi', { type, pathName, options });\n\n const aItemAPI = createAItemAPI<V, S>(api, type, [pathName], options);\n\n // Simplified wrapper functions that adapt to primary-only API (no locations)\n const action = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n action: string,\n params?: any,\n ) => await aItemAPI.action(ik, action, params);\n\n const all = async (query?: ItemQuery, locations?: [], allOptions?: AllOptions): Promise<AllOperationResult<V>> => {\n const result = await aItemAPI.all(query || {}, locations || [], allOptions);\n const extracted = ensureItemsExtracted<V>(result, 'all');\n return extracted as AllOperationResult<V>;\n };\n\n const allAction = async (action: string, params?: any) =>\n await aItemAPI.allAction(action, params, []);\n\n const allFacet = async (facet: string, params?: any) =>\n await aItemAPI.allFacet(facet, params);\n\n const one = async (query?: ItemQuery) =>\n await aItemAPI.one(query || {}, []);\n\n const get = async (ik: PriKey<S> | ComKey<S, never, never, never, never, never>) =>\n await aItemAPI.get(ik);\n\n const create = async (item: Partial<Item<S>>, options?: any) =>\n await aItemAPI.create(item, options);\n\n const remove = async (ik: PriKey<S> | ComKey<S, never, never, never, never, never>) =>\n await aItemAPI.remove(ik);\n\n const update = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n item: Partial<Item<S>>,\n ) => await aItemAPI.update(ik, item);\n\n const upsert = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n item: Partial<Item<S>>,\n locations?: any\n ) => await aItemAPI.upsert(ik, item, locations);\n\n const facet = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n facet: string,\n params?: any,\n ) => await aItemAPI.facet(ik, facet, params);\n\n const find = async (finder: string, finderParams?: any, locations?: [], findOptions?: FindOptions): Promise<FindOperationResult<V>> => {\n const result = await (aItemAPI.find as any)(finder, finderParams, locations || [], findOptions);\n const extracted = ensureItemsExtracted<V>(result, 'find');\n return extracted as FindOperationResult<V>;\n };\n\n const findOne = async (finder: string, finderParams?: any) =>\n await aItemAPI.findOne(finder, finderParams);\n\n return {\n action,\n all,\n allAction,\n allFacet,\n one,\n get,\n create,\n remove,\n update,\n upsert,\n facet,\n find,\n findOne,\n } as PItemApi<V, S>;\n\n};\n", "\nimport LibLogger from \"./logger\";\nimport { Item } from \"@fjell/core\";\nimport { Instance as BaseInstance, createInstance as createBaseInstance, Registry } from \"@fjell/registry\";\nimport { ClientApi } from \"./ClientApi\";\nimport { Coordinate } from \"@fjell/core\";\n\nconst logger = LibLogger.get(\"Instance\");\n\n/**\n * The Client API Instance interface represents a client API model instance that extends the base Instance\n * from @fjell/registry and adds client API operations for interacting with remote data.\n *\n * The interface extends the base Instance (which provides coordinate and registry) with:\n * - clientApi: Provides methods for interacting with remote data through HTTP APIs (get, create, update, etc.)\n *\n * @template V - The type of the data model item, extending Item\n * @template S - The string literal type representing the model's key type\n * @template L1-L5 - Optional string literal types for location hierarchy levels\n */\nexport interface Instance<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> extends BaseInstance<S, L1, L2, L3, L4, L5> {\n /** The client API object that provides methods for interacting with remote data */\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>;\n}\n\nexport const createInstance = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n registry: Registry,\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>,\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>,\n ): Instance<V, S, L1, L2, L3, L4, L5> => {\n logger.debug(\"createInstance\", { coordinate, clientApi, registry });\n const baseInstance = createBaseInstance(registry, coordinate);\n return { ...baseInstance, clientApi };\n}\n", "import { Item } from \"@fjell/core\";\nimport { ClientApi } from \"./ClientApi\";\nimport { InstanceFactory as BaseInstanceFactory, Registry, RegistryHub } from \"@fjell/registry\";\nimport { createInstance, Instance } from \"./Instance\";\nimport { Coordinate } from \"@fjell/core\";\nimport LibLogger from \"./logger\";\n\nconst logger = LibLogger.get(\"InstanceFactory\");\n\nexport type InstanceFactory<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> = (\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>\n) => BaseInstanceFactory<S, L1, L2, L3, L4, L5>;\n\n/**\n * Factory function for creating client-api instances\n */\nexport const createInstanceFactory = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>\n ): BaseInstanceFactory<S, L1, L2, L3, L4, L5> => {\n return (coordinate: Coordinate<S, L1, L2, L3, L4, L5>, context: { registry: Registry, registryHub?: RegistryHub }) => {\n logger.debug(\"Creating client-api instance\", { coordinate, registry: context.registry, clientApi });\n\n return createInstance(context.registry, coordinate, clientApi) as Instance<V, S, L1, L2, L3, L4, L5>;\n };\n};\n", "import LibLogger from './logger';\nimport {\n Registry as BaseRegistry,\n createRegistry as createBaseRegistry,\n RegistryFactory,\n RegistryHub\n} from '@fjell/registry';\n\nconst logger = LibLogger.get(\"Registry\");\n\n/**\n * Extended Registry interface for client-api-specific functionality\n */\nexport interface Registry extends BaseRegistry {\n type: 'client-api';\n}\n\n/**\n * Factory function for creating client-api registries\n */\nexport const createRegistryFactory = (): RegistryFactory => {\n return (type: string, registryHub?: RegistryHub): BaseRegistry => {\n if (type !== 'client-api') {\n throw new Error(`Client API registry factory can only create 'client-api' type registries, got: ${type}`);\n }\n\n logger.debug(\"Creating client-api registry\", { type, registryHub });\n\n const baseRegistry = createBaseRegistry(type, registryHub);\n\n // Cast to Registry for type safety\n return baseRegistry as Registry;\n };\n};\n\n/**\n * Creates a new client-api registry instance\n */\nexport const createRegistry = (registryHub?: RegistryHub): Registry => {\n const baseRegistry = createBaseRegistry('client-api', registryHub);\n\n return {\n ...baseRegistry,\n } as Registry;\n};\n", "/**\n * Base class for all Client API errors\n */\nexport abstract class ClientApiError extends Error {\n abstract readonly code: string;\n abstract readonly isRetryable: boolean;\n readonly timestamp: Date;\n readonly context?: Record<string, any>;\n\n constructor(message: string, context?: Record<string, any>) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n this.context = context;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n isRetryable: this.isRetryable,\n timestamp: this.timestamp,\n context: this.context,\n stack: this.stack\n };\n }\n}\n\n/**\n * Network-related errors (connection issues, timeouts)\n */\nexport class NetworkError extends ClientApiError {\n readonly code = 'NETWORK_ERROR';\n readonly isRetryable = true;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Network error: ${message}`, context);\n }\n}\n\n/**\n * HTTP timeout errors\n */\nexport class TimeoutError extends ClientApiError {\n readonly code = 'TIMEOUT_ERROR';\n readonly isRetryable = true;\n\n constructor(timeout: number, context?: Record<string, any>) {\n super(`Request timed out after ${timeout}ms`, context);\n }\n}\n\n/**\n * Authentication errors (401 Unauthorized)\n */\nexport class AuthenticationError extends ClientApiError {\n readonly code = 'AUTHENTICATION_ERROR';\n readonly isRetryable = false;\n\n constructor(message?: string, context?: Record<string, any>) {\n super(message || 'Authentication failed - invalid or expired credentials', context);\n }\n}\n\n/**\n * Authorization errors (403 Forbidden)\n */\nexport class AuthorizationError extends ClientApiError {\n readonly code = 'AUTHORIZATION_ERROR';\n readonly isRetryable = false;\n\n constructor(message?: string, context?: Record<string, any>) {\n super(message || 'Access forbidden - insufficient permissions', context);\n }\n}\n\n/**\n * Resource not found errors (404 Not Found)\n */\nexport class NotFoundError extends ClientApiError {\n readonly code = 'NOT_FOUND_ERROR';\n readonly isRetryable = false;\n\n constructor(resource: string, identifier?: string, context?: Record<string, any>) {\n const message = identifier\n ? `${resource} with identifier '${identifier}' not found`\n : `${resource} not found`;\n super(message, context);\n }\n}\n\n/**\n * Request validation errors (400 Bad Request)\n */\nexport class ValidationError extends ClientApiError {\n readonly code = 'VALIDATION_ERROR';\n readonly isRetryable = false;\n readonly validationErrors?: Array<{ field: string; message: string }>;\n\n constructor(message: string, validationErrors?: Array<{ field: string; message: string }>, context?: Record<string, any>) {\n super(`Validation error: ${message}`, context);\n this.validationErrors = validationErrors;\n }\n}\n\n/**\n * Conflict errors (409 Conflict)\n */\nexport class ConflictError extends ClientApiError {\n readonly code = 'CONFLICT_ERROR';\n readonly isRetryable = false;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Conflict: ${message}`, context);\n }\n}\n\n/**\n * Rate limiting errors (429 Too Many Requests)\n */\nexport class RateLimitError extends ClientApiError {\n readonly code = 'RATE_LIMIT_ERROR';\n readonly isRetryable = true;\n readonly retryAfter?: number;\n\n constructor(retryAfter?: number, context?: Record<string, any>) {\n const message = retryAfter\n ? `Rate limit exceeded - retry after ${retryAfter} seconds`\n : 'Rate limit exceeded';\n super(message, context);\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Server errors (5xx status codes)\n */\nexport class ServerError extends ClientApiError {\n readonly code = 'SERVER_ERROR';\n readonly isRetryable = true;\n readonly statusCode: number;\n\n constructor(statusCode: number, message?: string, context?: Record<string, any>) {\n super(message || `Server error (${statusCode})`, context);\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Request payload too large errors (413)\n */\nexport class PayloadTooLargeError extends ClientApiError {\n readonly code = 'PAYLOAD_TOO_LARGE_ERROR';\n readonly isRetryable = false;\n\n constructor(maxSize?: string, context?: Record<string, any>) {\n const message = maxSize\n ? `Request payload too large - maximum size is ${maxSize}`\n : 'Request payload too large';\n super(message, context);\n }\n}\n\n/**\n * Generic HTTP errors for unhandled status codes\n */\nexport class HttpError extends ClientApiError {\n readonly code = 'HTTP_ERROR';\n readonly isRetryable: boolean;\n readonly statusCode: number;\n readonly statusText: string;\n\n constructor(statusCode: number, statusText: string, message?: string, context?: Record<string, any>) {\n super(message || `HTTP error ${statusCode}: ${statusText}`, context);\n this.statusCode = statusCode;\n this.statusText = statusText;\n\n // 5xx errors are generally retryable, 4xx are not\n this.isRetryable = statusCode >= 500;\n }\n}\n\n/**\n * Configuration errors\n */\nexport class ConfigurationError extends ClientApiError {\n readonly code = 'CONFIGURATION_ERROR';\n readonly isRetryable = false;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Configuration error: ${message}`, context);\n }\n}\n\n/**\n * Parse/serialization errors\n */\nexport class ParseError extends ClientApiError {\n readonly code = 'PARSE_ERROR';\n readonly isRetryable = false;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Parse error: ${message}`, context);\n }\n}\n\n/**\n * Create appropriate error from HTTP response\n */\nexport function createHttpError(\n statusCode: number,\n statusText: string,\n responseBody?: any,\n context?: Record<string, any>\n): ClientApiError {\n const errorContext = { statusCode, statusText, responseBody, ...context };\n\n switch (statusCode) {\n case 400:\n if (responseBody?.validationErrors) {\n return new ValidationError(\n responseBody.message || 'Request validation failed',\n responseBody.validationErrors,\n errorContext\n );\n }\n return new ValidationError(responseBody?.message || statusText, [], errorContext);\n\n case 401:\n return new AuthenticationError(responseBody?.message, errorContext);\n\n case 403:\n return new AuthorizationError(responseBody?.message, errorContext);\n\n case 404:\n return new NotFoundError(\n responseBody?.resource || 'Resource',\n responseBody?.identifier,\n errorContext\n );\n\n case 409:\n return new ConflictError(responseBody?.message || statusText, errorContext);\n\n case 413:\n return new PayloadTooLargeError(responseBody?.maxSize, errorContext);\n\n case 429: {\n let retryAfter: number | undefined;\n if (responseBody?.retryAfter) {\n retryAfter = responseBody.retryAfter;\n } else if (context?.headers?.['retry-after']) {\n retryAfter = parseInt(context.headers['retry-after']);\n }\n return new RateLimitError(retryAfter, errorContext);\n }\n\n default:\n if (statusCode >= 500) {\n return new ServerError(statusCode, responseBody?.message || statusText, errorContext);\n }\n\n return new HttpError(statusCode, statusText, responseBody?.message, errorContext);\n }\n}\n\n/**\n * Create appropriate error from network/connection issues\n */\nexport function createNetworkError(error: any, context?: Record<string, any>): ClientApiError {\n const errorContext = { originalError: error, ...context };\n\n if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {\n return new TimeoutError(error.timeout || 5000, errorContext);\n }\n\n if (error.code === 'ECONNREFUSED' ||\n error.code === 'ENOTFOUND' ||\n error.code === 'ENETUNREACH' ||\n error.message?.includes('network')) {\n return new NetworkError(error.message || 'Network connection failed', errorContext);\n }\n\n // For unknown errors, treat as network issues that might be retryable\n return new NetworkError(error.message || 'Unknown network error', errorContext);\n}\n\n/**\n * Type guard to check if error is retryable\n */\nexport function isRetryableError(error: any): boolean {\n return error instanceof ClientApiError && error.isRetryable;\n}\n\n/**\n * Type guard to check if error is a Client API error\n */\nexport function isClientApiError(error: any): error is ClientApiError {\n return error instanceof ClientApiError;\n}\n", "export type { CItemApi } from \"./CItemAPI\";\nexport type { PItemApi } from \"./PItemAPI\";\nexport type { ClientApi } from \"./ClientApi\";\nexport type { ClientApiOptions } from \"./ClientApiOptions\";\n\nexport { createCItemApi } from \"./CItemAPI\";\nexport { createPItemApi } from \"./PItemAPI\";\n\n// Registry components\nexport * from './Instance';\nexport * from './InstanceFactory';\nexport * from './Registry';\n\n// Error handling\nexport * from './errors/index';\nexport * from './ops/errorHandling';\n\n// Re-export FjellHttpError from http-api for convenience\nexport { FjellHttpError, isFjellHttpError, extractErrorInfo, type ErrorInfo } from '@fjell/http-api';\n\n// HTTP wrapper\nexport * from './http/HttpWrapper';\n", "import { HttpApi } from '@fjell/http-api';\nimport {\n ClientApiError,\n createHttpError,\n createNetworkError,\n RateLimitError\n} from '../errors/index';\n\n// Simple logger interface for now\nconst logger = {\n debug: (message: string, context?: any) => console.debug(message, context),\n info: (message: string, context?: any) => console.info(message, context),\n warning: (message: string, context?: any) => console.warn(message, context),\n error: (message: string, context?: any) => console.error(message, context)\n};\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries?: number;\n /** Initial delay between retries in milliseconds (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay between retries in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 2) */\n backoffMultiplier?: number;\n /** Whether to add jitter to retry delays (default: true) */\n enableJitter?: boolean;\n /** Custom function to determine if an error should be retried */\n shouldRetry?: (error: ClientApiError, attemptNumber: number) => boolean;\n /** Called before each retry attempt */\n onRetry?: (error: ClientApiError, attemptNumber: number, delay: number) => void;\n}\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n enableJitter: true,\n shouldRetry: (error: ClientApiError, attemptNumber: number) => {\n // Don't retry after max attempts\n if (attemptNumber >= 3) return false;\n\n // Always retry retryable errors\n if (error.isRetryable) return true;\n\n // Don't retry non-retryable errors\n return false;\n },\n onRetry: (error: ClientApiError, attemptNumber: number, delay: number) => {\n logger.warning(`Retrying HTTP request (attempt ${attemptNumber + 1}) after ${delay}ms`, {\n errorCode: error.code,\n errorMessage: error.message,\n delay,\n attemptNumber\n });\n }\n};\n\n/**\n * Sleep utility for retry delays\n */\nconst sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Calculate delay for exponential backoff with optional jitter\n */\nfunction calculateDelay(\n attemptNumber: number,\n config: Required<RetryConfig>\n): number {\n const exponentialDelay = config.initialDelayMs * Math.pow(config.backoffMultiplier, attemptNumber);\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n if (!config.enableJitter) {\n return cappedDelay;\n }\n\n // Add jitter: random value between 50% and 100% of calculated delay\n const jitter = 0.5 + (Math.random() * 0.5);\n return Math.floor(cappedDelay * jitter);\n}\n\n/**\n * Enhanced HTTP wrapper with retry logic and comprehensive error handling\n */\nexport class HttpWrapper {\n private readonly api: HttpApi;\n private readonly retryConfig: Required<RetryConfig>;\n\n constructor(api: HttpApi, retryConfig: RetryConfig = {}) {\n this.api = api;\n this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };\n }\n\n /**\n * Execute HTTP operation with retry logic and error handling\n */\n async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n context?: Record<string, any>\n ): Promise<T> {\n let lastError: ClientApiError | null = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n logger.debug(`Executing ${operationName}`, {\n attempt: attempt + 1,\n maxRetries: this.retryConfig.maxRetries + 1,\n ...context\n });\n\n const result = await operation();\n\n if (attempt > 0) {\n logger.info(`${operationName} succeeded after ${attempt} retries`, {\n totalAttempts: attempt + 1,\n duration: Date.now() - startTime,\n ...context\n });\n }\n\n return result;\n } catch (error) {\n lastError = this.convertToClientApiError(error, operationName, context);\n\n // Don't retry on the last attempt\n if (attempt === this.retryConfig.maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n if (!this.retryConfig.shouldRetry(lastError, attempt)) {\n logger.debug(`Not retrying ${operationName} due to non-retryable error`, {\n errorCode: lastError.code,\n errorMessage: lastError.message,\n attempt: attempt + 1,\n ...context\n });\n break;\n }\n\n // Handle rate limiting with custom delay\n let delay = calculateDelay(attempt, this.retryConfig);\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n delay = Math.max(delay, lastError.retryAfter * 1000);\n }\n\n // Call retry callback\n this.retryConfig.onRetry(lastError, attempt, delay);\n\n // Wait before retrying\n await sleep(delay);\n }\n }\n\n // Log final failure\n logger.error(`${operationName} failed after ${this.retryConfig.maxRetries + 1} attempts`, {\n errorCode: lastError?.code,\n errorMessage: lastError?.message,\n duration: Date.now() - startTime,\n ...context\n });\n\n throw lastError;\n }\n\n /**\n * Convert any error to a ClientApiError\n */\n private convertToClientApiError(\n error: any,\n operationName: string,\n context?: Record<string, any>\n ): ClientApiError {\n const errorContext = { operation: operationName, ...context };\n\n // If it's already a ClientApiError, return as-is\n if (error instanceof ClientApiError) {\n return error;\n }\n\n // Handle HTTP response errors\n if (error.response) {\n const { status, statusText, data, headers } = error.response;\n return createHttpError(status, statusText, data, {\n ...errorContext,\n headers,\n url: error.config?.url\n });\n }\n\n // Handle request errors (network issues, timeouts, etc.)\n if (error.request) {\n return createNetworkError(error, {\n ...errorContext,\n url: error.config?.url,\n method: error.config?.method\n });\n }\n\n // Handle configuration or other errors\n return createNetworkError(error, errorContext);\n }\n\n /**\n * Wrapper for HTTP GET operations\n */\n async get<T>(\n url: string,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpGet(url, options),\n 'GET',\n { url, ...context }\n );\n }\n\n /**\n * Wrapper for HTTP POST operations\n */\n async post<T>(\n url: string,\n data?: any,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpPost(url, data, options),\n 'POST',\n { url, hasData: !!data, ...context }\n );\n }\n\n /**\n * Wrapper for HTTP PUT operations\n */\n async put<T>(\n url: string,\n data?: any,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpPut(url, data, options),\n 'PUT',\n { url, hasData: !!data, ...context }\n );\n }\n\n /**\n * Wrapper for HTTP DELETE operations\n */\n async delete<T>(\n url: string,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpDelete(url, options),\n 'DELETE',\n { url, ...context }\n );\n }\n\n /**\n * Update retry configuration\n */\n updateRetryConfig(newConfig: Partial<RetryConfig>): void {\n Object.assign(this.retryConfig, newConfig);\n }\n\n /**\n * Get current retry configuration\n */\n getRetryConfig(): Required<RetryConfig> {\n return { ...this.retryConfig };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n AllMethod,\n AllOperationResult,\n AllOptions,\n Item,\n ItemQuery,\n LocKeyArray,\n queryToParams,\n} from \"@fjell/core\";\nimport { HttpApi, QueryParams } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'all');\n\nexport const getAllOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): AllMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const all = async (\n query: ItemQuery = {} as ItemQuery,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = [],\n allOptions?: AllOptions\n ): Promise<AllOperationResult<V>> => {\n utilities.verifyLocations(locations);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n // Build query params from ItemQuery\n const params: QueryParams = queryToParams(query);\n\n // Override with AllOptions if provided (takes precedence)\n if (allOptions && 'limit' in allOptions && allOptions.limit != null) {\n params.limit = String(allOptions.limit);\n }\n if (allOptions && 'offset' in allOptions && allOptions.offset != null) {\n params.offset = String(allOptions.offset);\n }\n\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.allAuthenticated, params });\n\n logger.default('all', { query, locations, allOptions, requestOptions });\n logger.debug('QUERY_CACHE: client-api.all() - Making API request', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n allOptions: JSON.stringify(allOptions),\n path: utilities.getPath(loc),\n params: JSON.stringify(params),\n isAuthenticated: apiOptions.allAuthenticated\n });\n\n // Server returns AllOperationResult<V> with items and metadata\n const result = await api.httpGet<AllOperationResult<V>>(\n utilities.getPath(loc),\n requestOptions,\n );\n\n // Handle case where server returns {} or result.items is undefined\n // Extract items array from result, defaulting to empty array if missing\n let itemsArray: V[] = [];\n if (result) {\n if (result.items && Array.isArray(result.items)) {\n itemsArray = result.items;\n } else if (Array.isArray(result)) {\n itemsArray = result;\n } else {\n // Log unexpected response format\n logger.warning('Unexpected response format from server', {\n result,\n resultType: typeof result,\n hasItems: 'items' in result,\n resultKeys: result && typeof result === 'object' ? Object.keys(result) : []\n });\n itemsArray = [];\n }\n }\n\n // Ensure itemsArray is always a valid array before processing\n if (!Array.isArray(itemsArray)) {\n logger.error('itemsArray is not an array, defaulting to empty array', { itemsArray });\n itemsArray = [];\n }\n\n // Process items through utilities (date conversion, validation, etc.)\n const processedItems = await utilities.processArray(Promise.resolve(itemsArray));\n\n logger.debug('QUERY_CACHE: client-api.all() - API response received', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n itemCount: processedItems.length,\n total: result?.metadata?.total,\n hasMore: result?.metadata?.hasMore,\n itemKeys: processedItems.map(item => JSON.stringify(item.key))\n });\n\n // Return AllOperationResult with processed items\n return {\n items: processedItems,\n metadata: result?.metadata || { total: 0, returned: 0, offset: 0, hasMore: false }\n };\n }\n\n return all;\n}\n\n", "import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/client-api');\n\nexport default LibLogger;\n", "import { ActionOperationMethod, ComKey, Item, LocKeyArray, OperationParams, PriKey } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'action');\n\nexport const getActionOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n ): ActionOperationMethod<V, S, L1, L2, L3, L4, L5> => {\n const action = async (\n ik: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>,\n action: string,\n params?: OperationParams,\n ): Promise<[V, Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]> => {\n const requestOptions = Object.assign({}, apiOptions.postOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n logger.default('action', { ik, action, params, requestOptions });\n\n const response = await api.httpPost<[V, Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]>(\n `${utilities.getPath(ik)}/${action}`,\n params || {},\n requestOptions,\n );\n\n const [item, affectedItems] = response;\n return [\n await utilities.processOne(Promise.resolve(item)),\n affectedItems\n ];\n };\n return action;\n}\n", " \nimport { AllActionOperationMethod, ComKey, Item, LocKeyArray, OperationParams, PriKey } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'allAction');\n\nexport const getAllActionOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n ): AllActionOperationMethod<V, S, L1, L2, L3, L4, L5> => {\n const allAction = async (\n action: string,\n params?: OperationParams,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | []\n ): Promise<[V[], Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]> => {\n const requestOptions = Object.assign({}, apiOptions.postOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations || [];\n logger.default('allAction', { action, params, locations: loc, requestOptions });\n utilities.verifyLocations(loc);\n\n const response = await api.httpPost<[V[], Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>>]>(\n `${utilities.getPath(loc)}/${action}`,\n params || {},\n requestOptions,\n );\n\n // Handle edge cases where response might not be an array\n let items: V[] = [];\n let affectedItems: Array<PriKey<any> | ComKey<any, any, any, any, any, any> | LocKeyArray<any, any, any, any, any>> = [];\n\n if (Array.isArray(response)) {\n // Check if this is a properly formatted tuple response [items, affectedItems]\n if (response.length === 2 && Array.isArray(response[0])) {\n [items, affectedItems] = response;\n } else {\n // Handle other array responses - return as-is\n return response as any;\n }\n } else if (response && typeof response === 'object' && Object.keys(response).length === 0) {\n // Handle empty object response {}\n items = [];\n affectedItems = [];\n } else if (typeof response === 'string' && response === '{}') {\n // Handle string response \"{}\"\n items = [];\n affectedItems = [];\n }\n\n const processedItems = await utilities.processArray(Promise.resolve(items));\n if (Array.isArray(processedItems)) {\n processedItems.forEach(item => utilities.validatePK(item));\n }\n return [\n processedItems,\n affectedItems\n ];\n };\n return allAction;\n}\n", "import {\n AllOperationResult,\n Item,\n ItemQuery,\n LocKeyArray,\n OneMethod,\n QueryParams,\n queryToParams\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'one');\n\nexport const getOneOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): OneMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const one = async (\n query: ItemQuery = {} as ItemQuery,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = []\n ): Promise<V | null> => {\n utilities.verifyLocations(locations);\n\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n // Add limit: 1 to optimize the query\n const params: QueryParams = queryToParams(query);\n params.limit = '1';\n \n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.readAuthenticated, params });\n logger.default('one', { query, locations, requestOptions });\n logger.debug('QUERY_CACHE: client-api.one() - Making API request', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n path: utilities.getPath(loc),\n params: JSON.stringify(params),\n isAuthenticated: apiOptions.readAuthenticated\n });\n\n // Server returns AllOperationResult<V> with items and metadata\n const result = await api.httpGet<AllOperationResult<V>>(\n utilities.getPath(loc),\n requestOptions,\n );\n\n // Process items through utilities (date conversion, validation, etc.)\n const items = await utilities.processArray(Promise.resolve(result.items));\n\n let item: V | null = null;\n if (items.length > 0) {\n item = items[0];\n logger.debug('QUERY_CACHE: client-api.one() - API response received', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations),\n itemKey: JSON.stringify(item.key)\n });\n } else {\n logger.debug('QUERY_CACHE: client-api.one() - API returned no items', {\n query: JSON.stringify(query),\n locations: JSON.stringify(locations)\n });\n }\n\n return item;\n }\n\n return one;\n}\n", "/**\n * Shared error handling utilities for all HTTP operations\n */\n\nimport { isFjellHttpError } from '@fjell/http-api';\n\n/**\n * Determines if an error should be retried based on error type and status code\n */\nexport function shouldRetryError(error: any): boolean {\n // Check FjellHttpError retryable flag first\n if (isFjellHttpError(error)) {\n return error.isRetryable();\n }\n\n // Retry on network errors and timeouts\n if (error.code === 'ECONNREFUSED' ||\n error.code === 'ENOTFOUND' ||\n error.code === 'ENETUNREACH' ||\n error.message?.includes('timeout') ||\n error.message?.includes('network')) {\n return true;\n }\n\n // Retry on HTTP 5xx errors and 429 (rate limiting)\n if (error.status >= 500 || error.status === 429) {\n return true;\n }\n\n // Don't retry on 4xx client errors (except 429)\n if (error.status >= 400 && error.status < 500 && error.status !== 429) {\n return false;\n }\n\n // Default to retrying unknown errors\n return true;\n}\n\n/**\n * Calculates retry delay with exponential backoff and jitter\n */\nexport function calculateRetryDelay(attempt: number, config: any): number {\n const exponentialDelay = (config.initialDelayMs || 1000) * Math.pow(config.backoffMultiplier || 2, attempt);\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs || 30000);\n\n // Add jitter: random value between 50% and 100% of calculated delay\n const jitter = 0.5 + (Math.random() * 0.5);\n return Math.floor(cappedDelay * jitter);\n}\n\n/**\n * Enhances error with additional context information\n * Preserves FjellHttpError without modification\n */\nexport function enhanceError(error: any, context: any): any {\n if (!error) return new Error('Unknown error occurred');\n\n // Don't modify FjellHttpError - it already has full context\n if (isFjellHttpError(error)) {\n return error;\n }\n\n // If it's already enhanced, return as-is\n if (error.context) return error;\n\n // Add context to the error\n const enhancedError = new Error(error.message || 'HTTP operation failed');\n Object.assign(enhancedError, {\n code: error.code || error.status || 'UNKNOWN_ERROR',\n status: error.status,\n context,\n originalError: error\n });\n\n return enhancedError;\n}\n\n/**\n * Gets default retry configuration merged with provided options\n */\nexport function getRetryConfig(apiOptions: any): any {\n return {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n}\n\n/**\n * Handles custom error handler execution with error protection\n */\nexport function executeErrorHandler(\n errorHandler: ((error: any, context?: Record<string, any>) => void) | undefined,\n error: any,\n context: any,\n logger: any\n): void {\n if (!errorHandler) return;\n\n try {\n errorHandler(error, context);\n } catch (handlerError: any) {\n logger.error('Custom error handler failed', {\n originalError: error.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n}\n\n/**\n * Common retry loop logic for HTTP operations\n */\nexport async function executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n operationContext: Record<string, any>,\n apiOptions: any,\n logger: any,\n specialErrorHandling?: (error: any) => T | null | undefined\n): Promise<T> {\n const retryConfig = getRetryConfig(apiOptions);\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n logger.debug(`Executing ${operationName} (attempt ${attempt + 1})`, operationContext);\n\n const result = await operation();\n\n if (attempt > 0) {\n logger.info(`${operationName} operation succeeded after ${attempt} retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n duration: Date.now() - startTime\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n\n // Handle special error cases (like 404 returning null)\n if (specialErrorHandling) {\n const specialResult = specialErrorHandling(error);\n if (specialResult !== void 0) {\n return specialResult as T;\n }\n }\n\n // Don't retry on the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug(`Not retrying ${operationName} operation due to non-retryable error`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n attempt: attempt + 1\n });\n break;\n }\n\n // Calculate delay with exponential backoff\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`Retrying ${operationName} operation (attempt ${attempt + 2}) after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n delay,\n attemptNumber: attempt + 1\n });\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n // Handle final error\n const finalError = enhanceError(lastError, operationContext);\n\n // Execute custom error handler if provided\n executeErrorHandler(apiOptions.errorHandler, finalError, operationContext, logger);\n\n logger.error(`${operationName} operation failed after ${retryConfig.maxRetries + 1} attempts`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n duration: Date.now() - startTime,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n}\n", "import {\n CreateMethod,\n CreateOptions,\n Item,\n LocKeyArray\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'create');\n\nexport const getCreateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): CreateMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const create = async (\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n options?: CreateOptions<S, L1, L2, L3, L4, L5>\n ): Promise<V> => {\n // Extract locations or key from options for backward compatibility\n const locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = options?.locations || [];\n const requestOptions = Object.assign({}, apiOptions.postOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n logger.default('create', { item, options, locations, requestOptions });\n utilities.verifyLocations(locations);\n \n // If a key was provided in options, include it in the item\n let itemToCreate = item;\n if (options?.key) {\n itemToCreate = { ...item, ...options.key };\n }\n\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n const operationContext = {\n operation: 'create',\n path: utilities.getPath(loc),\n itemType: typeof item,\n hasLocations: locations.length > 0\n };\n\n // Retry configuration from options or defaults\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n logger.debug(`Creating item (attempt ${attempt + 1})`, operationContext);\n\n const result = await utilities.processOne(api.httpPost<V>(\n utilities.getPath(loc),\n itemToCreate,\n requestOptions,\n ));\n\n utilities.validatePK(result);\n\n if (attempt > 0) {\n logger.info(`Create operation succeeded after ${attempt} retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n duration: Date.now() - startTime\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n\n // Don't retry on the last attempt\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n // Determine if error is retryable\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('Not retrying create operation due to non-retryable error', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n attempt: attempt + 1\n });\n break;\n }\n\n // Calculate delay with exponential backoff\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`Retrying create operation (attempt ${attempt + 2}) after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n delay,\n attemptNumber: attempt + 1\n });\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n // Handle final error\n const finalError = enhanceError(lastError, operationContext);\n\n // Call custom error handler if provided\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('Custom error handler failed', {\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`Create operation failed after ${retryConfig.maxRetries + 1} attempts`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n duration: Date.now() - startTime,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n };\n\n return create;\n}\n", "import {\n ComKey,\n Item,\n PriKey,\n UpdateMethod\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'update');\n\nexport const getUpdateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): UpdateMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const update = async (\n ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n ): Promise<V> => {\n const requestOptions = Object.assign({}, apiOptions.putOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n const keyStr = JSON.stringify(ik);\n \n logger.default('update', { ik, item, requestOptions });\n\n const operationContext = {\n operation: 'update',\n path: utilities.getPath(ik),\n keyType: typeof ik,\n key: keyStr\n };\n\n logger.debug('CLIENT_API: update() started', {\n ...operationContext,\n isAuthenticated: apiOptions.writeAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: update() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n const result = await utilities.processOne(\n api.httpPut<V>(\n utilities.getPath(ik),\n item,\n requestOptions,\n )\n );\n const httpDuration = Date.now() - httpStartTime;\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n\n if (attempt > 0) {\n logger.info(`CLIENT_API: update() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration\n });\n } else {\n logger.debug(`CLIENT_API: update() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n logger.debug('CLIENT_API: update() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: update() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: update() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: update() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return update;\n}\n", "import {\n ComKey,\n Item,\n LocKeyArray,\n PriKey,\n UpdateOptions\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'upsert');\n\nexport const getUpsertOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n ) => {\n\n const upsert = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n locations?: LocKeyArray<L1, L2, L3, L4, L5>,\n options?: UpdateOptions\n ): Promise<V> => {\n const requestOptions = Object.assign({}, apiOptions.putOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n logger.default('upsert', { key, item, locations, options, requestOptions });\n\n // Add locations to query params if provided\n const path = utilities.getPath(key);\n let url = locations && locations.length > 0\n ? `${path}?locations=${encodeURIComponent(JSON.stringify(locations))}`\n : path;\n\n // Add update options to query params if provided\n if (options) {\n const separator = url.includes('?') ? '&' : '?';\n url += `${separator}options=${encodeURIComponent(JSON.stringify(options))}`;\n }\n\n return await utilities.processOne(\n api.httpPut<V>(\n url,\n { ...item, upsert: true },\n requestOptions,\n ));\n }\n\n return upsert;\n}\n\n", "import {\n ComKey,\n GetMethod,\n Item,\n PriKey,\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'get');\n\nexport const getGetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): GetMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const get = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n ): Promise<V | null> => {\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.readAuthenticated });\n const keyStr = JSON.stringify(ik);\n \n logger.default('get', { ik, requestOptions });\n\n const operationContext = {\n operation: 'get',\n path: utilities.getPath(ik),\n keyType: typeof ik,\n key: keyStr\n };\n\n logger.debug('CLIENT_API: get() started', {\n ...operationContext,\n isAuthenticated: apiOptions.readAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: get() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n const result = await utilities.processOne(\n api.httpGet<V>(\n utilities.getPath(ik),\n requestOptions,\n )\n );\n const httpDuration = Date.now() - httpStartTime;\n\n utilities.validatePK(result);\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n\n if (attempt > 0) {\n logger.info(`CLIENT_API: get() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration\n });\n } else {\n logger.debug(`CLIENT_API: get() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration,\n hasResult: !!result\n });\n }\n\n return result;\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n // Handle 404 errors specially - return null instead of throwing\n if (error.status === 404) {\n logger.debug('CLIENT_API: get() - item not found (404)', {\n ...operationContext,\n attemptDuration,\n totalDuration: Date.now() - startTime\n });\n return null;\n }\n\n logger.debug('CLIENT_API: get() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: get() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: get() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: get() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return get;\n}\n", "import {\n ComKey,\n Item,\n PriKey,\n RemoveMethod\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'remove');\n\nexport const getRemoveOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): RemoveMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const remove = async (\n ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n ): Promise<V | void> => {\n const requestOptions = Object.assign({}, apiOptions.deleteOptions, { isAuthenticated: apiOptions.writeAuthenticated });\n const keyStr = JSON.stringify(ik);\n \n logger.default('remove', { ik, requestOptions });\n\n const operationContext = {\n operation: 'remove',\n path: utilities.getPath(ik),\n keyType: typeof ik,\n key: keyStr\n };\n\n logger.debug('CLIENT_API: remove() started', {\n ...operationContext,\n isAuthenticated: apiOptions.writeAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: remove() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n const result = await api.httpDelete<V | boolean | void>(utilities.getPath(ik), requestOptions);\n const httpDuration = Date.now() - httpStartTime;\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n\n if (attempt > 0) {\n logger.info(`CLIENT_API: remove() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration\n });\n } else {\n logger.debug(`CLIENT_API: remove() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration\n });\n }\n\n // If result is a boolean, return void for compatibility\n if (typeof result === 'boolean') {\n return;\n }\n \n // Otherwise return the item (if the server returns it)\n return result as V | void;\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n // Handle 404 errors specially - item already deleted, consider success\n if (error.status === 404) {\n logger.debug('CLIENT_API: remove() - item not found (404), treating as success', {\n ...operationContext,\n attemptDuration,\n totalDuration: Date.now() - startTime\n });\n return;\n }\n\n logger.debug('CLIENT_API: remove() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: remove() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: remove() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: remove() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return remove;\n}\n", "import {\n FindMethod,\n FindOperationResult,\n FindOptions,\n Item,\n LocKeyArray,\n QueryParams\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { finderToParams } from \"../AItemAPI\";\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\nimport { calculateRetryDelay, enhanceError, shouldRetryError } from \"./errorHandling\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'find');\n\nexport const getFindOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): FindMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const find = async (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = [],\n findOptions?: FindOptions\n ): Promise<FindOperationResult<V>> => {\n utilities.verifyLocations(locations);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n const mergedParams: QueryParams = finderToParams(finder, finderParams);\n \n // Add pagination options to query parameters\n if (findOptions?.limit != null) {\n mergedParams.limit = findOptions.limit.toString();\n }\n if (findOptions?.offset != null) {\n mergedParams.offset = findOptions.offset.toString();\n }\n \n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.allAuthenticated, params: mergedParams });\n logger.default('find', { finder, finderParams, locations, findOptions, requestOptions });\n\n const operationContext = {\n operation: 'find',\n finder,\n path: utilities.getPath(loc),\n params: JSON.stringify(mergedParams),\n locations: JSON.stringify(locations)\n };\n\n logger.debug('CLIENT_API: find() started', {\n ...operationContext,\n findOptions,\n isAuthenticated: apiOptions.allAuthenticated\n });\n\n const retryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n ...apiOptions.retryConfig\n };\n\n let lastError: any = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const attemptStartTime = Date.now();\n try {\n logger.debug(`CLIENT_API: find() attempt ${attempt + 1}`, {\n ...operationContext,\n attempt: attempt + 1,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n const httpStartTime = Date.now();\n // Expect FindOperationResult from server\n const response = await api.httpGet<FindOperationResult<V>>(\n utilities.getPath(loc),\n requestOptions,\n );\n const httpDuration = Date.now() - httpStartTime;\n\n // Validate response shape to prevent downstream errors\n if (!response || typeof response !== 'object') {\n logger.error('Invalid response from find operation', {\n component: 'client-api',\n operation: 'find',\n finder,\n responseType: typeof response,\n response,\n suggestion: 'Server should return FindOperationResult with { items: [], metadata: {...} } structure'\n });\n throw new Error(\n `Invalid response from find operation: expected FindOperationResult object with items and metadata, got ${typeof response}. ` +\n `This indicates a server-side API issue.`\n );\n }\n\n // Handle case where response.items might be undefined\n const items = response.items || [];\n if (!Array.isArray(items)) {\n logger.error('Invalid response items from find operation', {\n component: 'client-api',\n operation: 'find',\n finder,\n itemsType: typeof items,\n response,\n suggestion: 'Server should return FindOperationResult.items as an array'\n });\n throw new Error(\n `Invalid response from find operation: items must be an array, got ${typeof items}. ` +\n `This indicates a server-side API issue.`\n );\n }\n \n // Process items array (convert dates, etc.)\n const processedItems = await utilities.processArray(Promise.resolve(items));\n\n const attemptDuration = Date.now() - attemptStartTime;\n const totalDuration = Date.now() - startTime;\n \n if (attempt > 0) {\n logger.info(`CLIENT_API: find() succeeded after retries`, {\n ...operationContext,\n totalAttempts: attempt + 1,\n httpDuration,\n attemptDuration,\n totalDuration,\n itemCount: processedItems.length\n });\n } else {\n logger.debug(`CLIENT_API: find() succeeded (first attempt)`, {\n ...operationContext,\n httpDuration,\n totalDuration,\n itemCount: processedItems.length,\n total: response.metadata?.total || 0\n });\n }\n\n return {\n items: processedItems,\n metadata: response.metadata || {\n total: processedItems.length,\n returned: processedItems.length,\n offset: findOptions?.offset ?? 0,\n limit: findOptions?.limit,\n hasMore: false\n }\n };\n } catch (error: any) {\n lastError = error;\n const attemptDuration = Date.now() - attemptStartTime;\n\n logger.debug('CLIENT_API: find() attempt failed', {\n ...operationContext,\n attempt: attempt + 1,\n attemptDuration,\n errorStatus: error.status,\n errorCode: error.code,\n errorMessage: error.message\n });\n\n if (attempt === retryConfig.maxRetries) {\n break;\n }\n\n const isRetryable = shouldRetryError(error);\n if (!isRetryable) {\n logger.debug('CLIENT_API: find() - not retrying (non-retryable error)', {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n attempt: attempt + 1,\n totalDuration: Date.now() - startTime\n });\n break;\n }\n\n const delay = calculateRetryDelay(attempt, retryConfig);\n\n logger.warning(`CLIENT_API: find() - retrying after ${delay}ms`, {\n ...operationContext,\n errorMessage: error.message,\n errorCode: error.code || error.status,\n errorStatus: error.status,\n delay,\n attemptNumber: attempt + 1,\n nextAttempt: attempt + 2,\n maxRetries: retryConfig.maxRetries + 1\n });\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n const finalError = enhanceError(lastError, operationContext);\n const totalDuration = Date.now() - startTime;\n\n if (apiOptions.errorHandler) {\n try {\n apiOptions.errorHandler(finalError, operationContext);\n } catch (handlerError: any) {\n logger.error('CLIENT_API: Custom error handler failed', {\n ...operationContext,\n originalError: finalError.message,\n handlerError: handlerError?.message || String(handlerError)\n });\n }\n }\n\n logger.error(`CLIENT_API: find() failed after all retries`, {\n ...operationContext,\n errorMessage: finalError.message,\n errorCode: finalError.code || finalError.status,\n errorStatus: finalError.status,\n totalDuration,\n totalAttempts: retryConfig.maxRetries + 1\n });\n\n throw finalError;\n }\n\n return find as unknown as FindMethod<V, S, L1, L2, L3, L4, L5>;\n}\n", "import {\n FindOneMethod,\n Item,\n LocKeyArray,\n QueryParams\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { finderToParams } from \"../AItemAPI\";\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'find');\n\nexport const getFindOneOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): FindOneMethod<V, S, L1, L2, L3, L4, L5> => {\n\n const findOne = async (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = []\n ): Promise<V> => {\n utilities.verifyLocations(locations);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n const params: QueryParams = finderToParams(finder, finderParams);\n params.one = true;\n\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.allAuthenticated, params });\n logger.default('findOne', { finder, finderParams, locations, requestOptions });\n logger.debug('QUERY_CACHE: client-api.findOne() - Making API request', {\n finder,\n finderParams: JSON.stringify(finderParams),\n locations: JSON.stringify(locations),\n path: utilities.getPath(loc),\n params: JSON.stringify(params),\n isAuthenticated: apiOptions.allAuthenticated\n });\n\n const results = await utilities.processArray(\n api.httpGet<V[]>(\n utilities.getPath(loc),\n requestOptions,\n ));\n \n const result = results[0];\n if (result) {\n utilities.validatePK(result);\n logger.debug('QUERY_CACHE: client-api.findOne() - API response received', {\n finder,\n finderParams: JSON.stringify(finderParams),\n locations: JSON.stringify(locations),\n itemKey: JSON.stringify(result.key)\n });\n } else {\n logger.debug('QUERY_CACHE: client-api.findOne() - API returned no items', {\n finder,\n finderParams: JSON.stringify(finderParams),\n locations: JSON.stringify(locations)\n });\n }\n \n return result;\n }\n\n return findOne;\n}\n", "import {\n ComKey,\n FacetOperationMethod,\n Item,\n PriKey,\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'facet');\n\nexport const getFacetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): FacetOperationMethod<S, L1, L2, L3, L4, L5> => {\n\n /**\n * Executes a facet operation on an item.\n *\n * A facet is a piece of information that is related to an item - it represents\n * a specific aspect or characteristic of the item. Unlike actions which may\n * return items or perform operations, facets are informational queries that\n * return data about a particular facet of an item.\n *\n * @param ik - The item key (composite or primary key) identifying the item\n * @param facet - The name of the facet to query\n * @param body - Optional request body for the facet operation\n * @param options - Optional HTTP request options\n * @returns Promise resolving to the facet data\n */\n const facet = async (\n ik: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>,\n facet: string,\n params: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n ): Promise<any> => {\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.writeAuthenticated, params });\n logger.default('facet', { ik, facet, requestOptions });\n\n return api.httpGet<any>(\n `${utilities.getPath(ik)}/${facet}`,\n requestOptions,\n );\n\n };\n\n return facet;\n}\n", "import {\n AllFacetOperationMethod,\n Item,\n LocKeyArray\n} from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"../ClientApiOptions\";\nimport LibLogger from \"../logger\";\nimport { Utilities } from \"../Utilities\";\n\nconst logger = LibLogger.get('client-api', 'ops', 'allFacet');\n\nexport const getAllFacetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>\n\n ): AllFacetOperationMethod<L1, L2, L3, L4, L5> => {\n\n const allFacet = async (\n facet: string,\n params: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>> = {},\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = []\n ): Promise<V[]> => {\n const requestOptions = Object.assign({}, apiOptions.getOptions, { isAuthenticated: apiOptions.writeAuthenticated, params });\n logger.default('allFacet', { facet, locations, requestOptions });\n utilities.verifyLocations(locations);\n\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations;\n\n // TODO: This should respond to either a single object, or multiple objects in an array.\n return api.httpGet<V[]>(\n `${utilities.getPath(loc)}/${facet}`,\n requestOptions,\n )\n };\n\n return allFacet;\n}\n", "/* eslint-disable indent */\nimport { Item } from \"@fjell/core\"\nimport { getAllOperation } from \"./all\"\nimport { getActionOperation } from \"./action\"\nimport { Utilities } from \"../Utilities\"\nimport { HttpApi } from \"@fjell/http-api\"\nimport { getAllActionOperation } from \"./allAction\"\nimport { getOneOperation } from \"./one\"\nimport { getCreateOperation } from \"./create\"\nimport { getUpdateOperation } from \"./update\"\nimport { getUpsertOperation } from \"./upsert\"\nimport { getGetOperation } from \"./get\"\nimport { getRemoveOperation } from \"./remove\"\nimport { getFindOperation } from \"./find\"\nimport { ClientApiOptions } from \"../ClientApiOptions\"\nimport { ClientApi } from \"../ClientApi\"\nimport { getFindOneOperation } from \"./findOne\"\nimport { getFacetOperation } from \"./facet\"\nimport { getAllFacetOperation } from \"./allFacet\"\n\nexport const getOperations =\n <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never>(\n api: HttpApi,\n apiOptions: ClientApiOptions,\n utilities: Utilities<V, S, L1, L2, L3, L4, L5>,\n\n ): ClientApi<V, S, L1, L2, L3, L4, L5> => {\n return {\n action: getActionOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n all: getAllOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n allAction: getAllActionOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n allFacet: getAllFacetOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n create: getCreateOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n facet: getFacetOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n findOne: getFindOneOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n find: getFindOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n get: getGetOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n one: getOneOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n remove: getRemoveOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n update: getUpdateOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n upsert: getUpsertOperation<V, S, L1, L2, L3, L4, L5>(\n api,\n apiOptions,\n utilities,\n ),\n }\n }", "import {\n ComKey,\n validatePK as coreValidatePK,\n generateKeyArray,\n isPriKey,\n Item,\n LocKey,\n LocKeyArray,\n PriKey,\n} from \"@fjell/core\";\n\nimport LibLogger from \"./logger\";\nimport deepmerge from \"deepmerge\";\n\nconst logger = LibLogger.get('client-api', 'Utility');\n\nexport interface Utilities<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> {\n verifyLocations: (locations: LocKeyArray<L1, L2, L3, L4, L5> | [] | never) => boolean;\n processOne: (apiCall: Promise<V>) => Promise<V>;\n processArray: (api: Promise<V[]>) => Promise<V[]>;\n convertDoc: (doc: V) => V;\n getPath: (key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S> | LocKeyArray<L1, L2, L3, L4, L5> | []) => string;\n validatePK: (item: Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[]) =>\n Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[];\n}\n\nexport const createUtilities = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(pkType: S, pathNames: string[]): Utilities<V, S, L1, L2, L3, L4, L5> => {\n\n logger.default('createUtilities', { pkType, pathNames });\n\n const verifyLocations = (\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] | never,\n ): boolean => {\n\n if (locations && locations.length < pathNames.length - 1) {\n throw new Error('Not enough locations for pathNames: locations:'\n + locations.length + ' pathNames:' + pathNames.length);\n }\n return true;\n }\n\n const processOne = async (\n apiCall: Promise<V>,\n ): Promise<V> => {\n logger.default('processOne', { apiCall });\n const response = await apiCall;\n logger.default('processOne response', {\n responseType: typeof response,\n hasData: !!response\n });\n return convertDoc(response);\n };\n\n const processArray = async (\n api: Promise<V[]>,\n ): Promise<V[]> => {\n logger.default('processArray', { api });\n const response = await api;\n logger.default('processArray response', {\n responseType: typeof response,\n isArray: Array.isArray(response),\n length: Array.isArray(response) ? response.length : 0\n });\n if (response && Array.isArray(response)) {\n return response.map((subjectChat: V) =>\n convertDoc(subjectChat),\n ) as unknown as V[];\n } else {\n logger.error('Response was not an array', { response });\n throw new Error('Response was not an array');\n }\n };\n\n const convertDoc = (doc: V): V => {\n logger.default('convertDoc', { doc });\n if (doc && doc.events) {\n const events = doc.events;\n for (const key in events) {\n events[key] = deepmerge(events[key], { at: events[key].at ? new Date(events[key].at) : null });\n }\n\n return doc as unknown as V;\n } else {\n return doc;\n }\n };\n\n const getPath =\n (\n key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S> | LocKeyArray<L1, L2, L3, L4, L5> | [],\n ):\n string => {\n\n const localPathNames = [...pathNames];\n logger.default('getPath', { key, pathNames: localPathNames });\n\n const keys = generateKeyArray(key);\n\n // For contained items (ComKey), we need to process location keys first\n // to match the URL structure: /parents/{parentId}/children/{childId}\n if (keys.length > 1) {\n // Separate PriKeys and LocKeys\n const priKeys = keys.filter(k => isPriKey(k));\n const locKeys = keys.filter(k => !isPriKey(k));\n \n // Location keys come in child->parent order, but paths must be parent->child\n // So reverse the locKeys to get parent->child order for path building\n const reversedLocKeys = [...locKeys].reverse();\n \n // Reorder: reversed LocKeys first, then PriKeys\n const reorderedKeys = [...reversedLocKeys, ...priKeys];\n logger.default('Reordered keys for contained item', {\n original: keys,\n locKeys,\n reversedLocKeys,\n reordered: reorderedKeys,\n priKeys\n });\n \n let path: string = addPath('', reorderedKeys, localPathNames);\n\n // If there is only one collection left in the collections array, this means that\n // we received LocKeys and we need to add the last collection to the reference\n if (localPathNames.length === 1) {\n path = `${path}/${localPathNames[0]}`;\n }\n\n logger.default('getPath created', { key, path });\n return path;\n } else {\n // For primary items or single keys\n // If it's a LocKey array, we still need to reverse it for path building\n const priKeys = keys.filter(k => isPriKey(k));\n const locKeys = keys.filter(k => !isPriKey(k));\n \n // Reverse locKeys if present (child->parent to parent->child)\n const reversedLocKeys = locKeys.length > 0 ? [...locKeys].reverse() : [];\n const orderedKeys = [...reversedLocKeys, ...priKeys];\n \n let path: string = addPath('', orderedKeys, localPathNames);\n\n // If there is only one collection left in the collections array, this means that\n // we received LocKeys and we need to add the last collection to the reference\n if (localPathNames.length === 1) {\n path = `${path}/${localPathNames[0]}`;\n }\n\n logger.default('getPath created', { key, path });\n return path;\n }\n };\n\n const addPath = (\n base: string,\n keys: Array<PriKey<S> | LocKey<L1 | L2 | L3 | L4 | L5>>,\n localPathNames: string[],\n ): string => {\n logger.default('addPath', { base, keys, pathNames: localPathNames });\n if (keys.length < localPathNames.length - 1) {\n logger.error('addPath should never have keys with a length less than the length of pathNames - 1',\n { keys, localPathNames });\n throw new Error('addPath should never have keys with a length less than the length of pathNames - 1: '\n + keys.length + ' ' + localPathNames.length + ' ' + JSON.stringify(keys, localPathNames));\n } else if (keys.length > localPathNames.length) {\n logger.error('addPath should never have keys with a length greater than the length of pathNames',\n { keys, pathNames });\n throw new Error('addPath should never have keys with a length greater than the length of pathNames: '\n + keys.length + ' ' + localPathNames.length + ' ' + JSON.stringify(keys, localPathNames));\n }\n if (keys.length === 0) {\n // If you've recursively consumed all of the keys, return the base.\n logger.default('addPath returning base', { base });\n return base;\n } else {\n const currentKey = keys[0];\n const keyType = isPriKey(currentKey) ? currentKey.kt : currentKey.kt;\n \n // Find the best matching pathName for this key type\n const matchingPathNameIndex = localPathNames.findIndex(pathName => {\n const singularPathName = pathName.endsWith('s') ? pathName.slice(0, -1) : pathName;\n const pluralKeyType = keyType + 's';\n \n // Try various matching strategies\n return pathName === pluralKeyType || // photos === photo+s\n pathName === keyType + 'es' || // matches === match+es\n singularPathName === keyType || // photo === photo\n pathName.toLowerCase() === keyType.toLowerCase() || // case insensitive\n pathName.toLowerCase() === pluralKeyType.toLowerCase(); // case insensitive plural\n });\n \n if (matchingPathNameIndex !== -1) {\n // Found a matching pathName\n const pathName = localPathNames.splice(matchingPathNameIndex, 1)[0];\n const key = keys.shift()!;\n const id = isPriKey(key) ? (key as PriKey<S>).pk : (key as LocKey<L1 | L2 | L3 | L4 | L5>).lk;\n const nextBase = `${base}/${pathName}/${id}`;\n logger.default('Adding Path (matched)', {\n pathName,\n keyType,\n isPriKey: isPriKey(key),\n key,\n nextBase\n });\n return addPath(nextBase, keys, localPathNames);\n } else {\n // No match found, use first available pathName\n const pathName = localPathNames.shift()!;\n const key = keys.shift()!;\n const id = isPriKey(key) ? (key as PriKey<S>).pk : (key as LocKey<L1 | L2 | L3 | L4 | L5>).lk;\n const nextBase = `${base}/${pathName}/${id}`;\n logger.default('Adding Path (no match, using first)', {\n pathName,\n keyType,\n isPriKey: isPriKey(key),\n key,\n nextBase\n });\n return addPath(nextBase, keys, localPathNames);\n }\n }\n\n }\n\n const validatePK = (\n item: Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[]):\n Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[] => {\n return coreValidatePK<S, L1, L2, L3, L4, L5>(item, pkType);\n }\n\n return {\n verifyLocations,\n processOne,\n convertDoc,\n processArray,\n getPath,\n validatePK,\n }\n}\n", "/* eslint-disable indent */\nimport { Item } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\n\nimport { ClientApiOptions } from \"./ClientApiOptions\";\nimport { getOperations } from \"./ops\";\nimport { createUtilities } from \"./Utilities\";\nimport { ClientApi } from \"./ClientApi\";\n\nimport LibLogger from \"./logger\";\n\nconst logger = LibLogger.get('AItemAPI');\n\nexport type PathNamesArray<\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> =\n ([L5] extends [never] ?\n ([L4] extends [never] ?\n ([L3] extends [never] ?\n ([L2] extends [never] ?\n ([L1] extends [never] ?\n [string] :\n [string, string]) :\n [string, string, string]) :\n [string, string, string, string]) :\n [string, string, string, string, string]) :\n [string, string, string, string, string, string]);\n\nexport const finderToParams = (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>\n): Record<string, string> => {\n return {\n finder,\n finderParams: JSON.stringify(finderParams),\n };\n};\n\nexport const createAItemAPI = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n api: HttpApi,\n pkType: S,\n pathNames: PathNamesArray<L1, L2, L3, L4, L5>,\n options?: ClientApiOptions,\n): ClientApi<V, S, L1, L2, L3, L4, L5> => {\n\n logger.default('createAItemAPI', { pkType, pathNames, options });\n\n let mergedOptions: ClientApiOptions;\n\n const defaultOptions: ClientApiOptions = {\n readAuthenticated: true,\n allAuthenticated: true,\n writeAuthenticated: true,\n getOptions: {},\n postOptions: {},\n putOptions: {},\n deleteOptions: {},\n };\n\n if (options) {\n mergedOptions = Object.assign({}, defaultOptions, options);\n } else {\n mergedOptions = defaultOptions;\n }\n\n const utilities = createUtilities<V, S, L1, L2, L3, L4, L5>(pkType, pathNames);\n const operations = getOperations<V, S, L1, L2, L3, L4, L5>(api, mergedOptions, utilities);\n\n return {\n action: operations.action,\n all: operations.all,\n allAction: operations.allAction,\n allFacet: operations.allFacet,\n create: operations.create,\n facet: operations.facet,\n find: operations.find,\n findOne: operations.findOne,\n get: operations.get,\n one: operations.one,\n remove: operations.remove,\n update: operations.update,\n upsert: operations.upsert,\n }\n}", "\nimport {\n AllOperationResult,\n AllOptions,\n FindOperationResult,\n FindOptions,\n Item,\n ItemQuery,\n LocKeyArray,\n} from \"@fjell/core\";\nimport {\n HttpApi\n} from \"@fjell/http-api\";\nimport { createAItemAPI, PathNamesArray } from \"./AItemAPI\";\n\nimport LibLogger from \"./logger\";\nimport { ClientApi } from \"./ClientApi\";\nimport { ClientApiOptions } from \"./ClientApiOptions\";\n\nconst logger = LibLogger.get('CItemAPI');\n\n/**\n * CItemApi extends ClientApi for contained items.\n * No additional methods needed - pure Operations interface.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface CItemApi<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n> extends ClientApi<V, S, L1, L2, L3, L4, L5> {\n // Inherits all methods from ClientApi (which extends core Operations)\n}\n\n/**\n * Helper function to ensure items are extracted from { items, metadata } response structure.\n * This provides defensive handling in case the underlying API doesn't extract items properly.\n */\nfunction ensureItemsExtracted<T>(\n result: any,\n operationName: string\n): { items: T[]; metadata: any } {\n // If result already has the correct structure with items array, return as-is\n if (result && typeof result === 'object' && Array.isArray(result.items)) {\n return result;\n }\n \n // If result is the raw { items, metadata } structure but items wasn't extracted\n if (result && typeof result === 'object' && 'items' in result && 'metadata' in result) {\n logger.debug(`${operationName}: Extracting items from response structure`, {\n hasItems: Array.isArray(result.items),\n itemsType: typeof result.items,\n itemsLength: Array.isArray(result.items) ? result.items.length : 'N/A'\n });\n return {\n items: Array.isArray(result.items) ? result.items : [],\n metadata: result.metadata || {}\n };\n }\n \n // If result is an array (legacy format), wrap it\n if (Array.isArray(result)) {\n logger.debug(`${operationName}: Wrapping array result in { items, metadata } structure`);\n return {\n items: result,\n metadata: {\n total: result.length,\n returned: result.length,\n offset: 0,\n hasMore: false\n }\n };\n }\n \n // Fallback: return empty result\n logger.warning(`${operationName}: Unexpected response format, returning empty result`, {\n resultType: typeof result,\n resultKeys: result && typeof result === 'object' ? Object.keys(result) : []\n });\n return {\n items: [],\n metadata: {}\n };\n}\n\nexport const createCItemApi = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(api: HttpApi, type: S, pathNames: PathNamesArray<L1, L2, L3, L4, L5>, options?: ClientApiOptions): CItemApi<V, S, L1, L2, L3, L4, L5> => {\n\n logger.default('createCItemApi', { api, type, pathNames, options });\n\n const aItemAPI = createAItemAPI(api, type, pathNames, options);\n\n // Wrap methods that return { items, metadata } to ensure items are always extracted\n const all = async (\n query?: ItemQuery,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [],\n allOptions?: AllOptions\n ): Promise<AllOperationResult<V>> => {\n const result = allOptions != null\n ? await aItemAPI.all(query, locations, allOptions)\n : await aItemAPI.all(query, locations);\n const extracted = ensureItemsExtracted<V>(result, 'all');\n return extracted as AllOperationResult<V>;\n };\n\n const find = async (\n finder: string,\n finderParams?: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [],\n findOptions?: FindOptions\n ): Promise<FindOperationResult<V>> => {\n const result = findOptions != null\n ? await aItemAPI.find(finder, finderParams, locations, findOptions)\n : await aItemAPI.find(finder, finderParams, locations);\n const extracted = ensureItemsExtracted<V>(result, 'find');\n return extracted as FindOperationResult<V>;\n };\n\n return {\n action: aItemAPI.action,\n all,\n allAction: aItemAPI.allAction,\n allFacet: aItemAPI.allFacet,\n one: aItemAPI.one,\n get: aItemAPI.get,\n create: aItemAPI.create,\n remove: aItemAPI.remove,\n update: aItemAPI.update,\n upsert: aItemAPI.upsert,\n facet: aItemAPI.facet,\n find,\n findOne: aItemAPI.findOne,\n } as unknown as CItemApi<V, S, L1, L2, L3, L4, L5>;\n}\n", "import { AllOperationResult, AllOptions, ComKey, FindOperationResult, FindOptions, Item, ItemQuery, PriKey } from \"@fjell/core\";\nimport { HttpApi } from \"@fjell/http-api\";\nimport { createAItemAPI } from \"./AItemAPI\";\nimport { ClientApi } from \"./ClientApi\";\n\nimport LibLogger from \"./logger\";\nimport { ClientApiOptions } from \"./ClientApiOptions\";\nconst logger = LibLogger.get('PItemAPI');\n\n/**\n * Helper function to ensure items are extracted from { items, metadata } response structure.\n * This provides defensive handling in case the underlying API doesn't extract items properly.\n */\nfunction ensureItemsExtracted<T>(\n result: any,\n operationName: string\n): { items: T[]; metadata: any } {\n // If result already has the correct structure with items array, return as-is\n if (result && typeof result === 'object' && Array.isArray(result.items)) {\n return result;\n }\n \n // If result is the raw { items, metadata } structure but items wasn't extracted\n if (result && typeof result === 'object' && 'items' in result && 'metadata' in result) {\n logger.debug(`${operationName}: Extracting items from response structure`, {\n hasItems: Array.isArray(result.items),\n itemsType: typeof result.items,\n itemsLength: Array.isArray(result.items) ? result.items.length : 'N/A'\n });\n return {\n items: Array.isArray(result.items) ? result.items : [],\n metadata: result.metadata || {}\n };\n }\n \n // If result is an array (legacy format), wrap it\n if (Array.isArray(result)) {\n logger.debug(`${operationName}: Wrapping array result in { items, metadata } structure`);\n return {\n items: result,\n metadata: {\n total: result.length,\n returned: result.length,\n offset: 0,\n hasMore: false\n }\n };\n }\n \n // Fallback: return empty result\n logger.warning(`${operationName}: Unexpected response format, returning empty result`, {\n resultType: typeof result,\n resultKeys: result && typeof result === 'object' ? Object.keys(result) : []\n });\n return {\n items: [],\n metadata: {}\n };\n}\n\n// PItemApi now directly extends ClientApi without re-declaring methods\n// This ensures compatibility with core Operations interface\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface PItemApi<\n V extends Item<S>,\n S extends string\n> extends ClientApi<V, S> {\n // Inherits all methods from ClientApi\n}\n\nexport const createPItemApi = <V extends Item<S>, S extends string>(\n api: HttpApi,\n type: S,\n pathName: string,\n options?: ClientApiOptions\n): PItemApi<V, S> => {\n\n logger.default('createPItemApi', { type, pathName, options });\n\n const aItemAPI = createAItemAPI<V, S>(api, type, [pathName], options);\n\n // Simplified wrapper functions that adapt to primary-only API (no locations)\n const action = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n action: string,\n params?: any,\n ) => await aItemAPI.action(ik, action, params);\n\n const all = async (query?: ItemQuery, locations?: [], allOptions?: AllOptions): Promise<AllOperationResult<V>> => {\n const result = await aItemAPI.all(query || {}, locations || [], allOptions);\n const extracted = ensureItemsExtracted<V>(result, 'all');\n return extracted as AllOperationResult<V>;\n };\n\n const allAction = async (action: string, params?: any) =>\n await aItemAPI.allAction(action, params, []);\n\n const allFacet = async (facet: string, params?: any) =>\n await aItemAPI.allFacet(facet, params);\n\n const one = async (query?: ItemQuery) =>\n await aItemAPI.one(query || {}, []);\n\n const get = async (ik: PriKey<S> | ComKey<S, never, never, never, never, never>) =>\n await aItemAPI.get(ik);\n\n const create = async (item: Partial<Item<S>>, options?: any) =>\n await aItemAPI.create(item, options);\n\n const remove = async (ik: PriKey<S> | ComKey<S, never, never, never, never, never>) =>\n await aItemAPI.remove(ik);\n\n const update = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n item: Partial<Item<S>>,\n ) => await aItemAPI.update(ik, item);\n\n const upsert = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n item: Partial<Item<S>>,\n locations?: any\n ) => await aItemAPI.upsert(ik, item, locations);\n\n const facet = async (\n ik: PriKey<S> | ComKey<S, never, never, never, never, never>,\n facet: string,\n params?: any,\n ) => await aItemAPI.facet(ik, facet, params);\n\n const find = async (finder: string, finderParams?: any, locations?: [], findOptions?: FindOptions): Promise<FindOperationResult<V>> => {\n const result = await (aItemAPI.find as any)(finder, finderParams, locations || [], findOptions);\n const extracted = ensureItemsExtracted<V>(result, 'find');\n return extracted as FindOperationResult<V>;\n };\n\n const findOne = async (finder: string, finderParams?: any) =>\n await aItemAPI.findOne(finder, finderParams);\n\n return {\n action,\n all,\n allAction,\n allFacet,\n one,\n get,\n create,\n remove,\n update,\n upsert,\n facet,\n find,\n findOne,\n } as PItemApi<V, S>;\n\n};\n", "\nimport LibLogger from \"./logger\";\nimport { Item } from \"@fjell/core\";\nimport { Instance as BaseInstance, createInstance as createBaseInstance, Registry } from \"@fjell/registry\";\nimport { ClientApi } from \"./ClientApi\";\nimport { Coordinate } from \"@fjell/core\";\n\nconst logger = LibLogger.get(\"Instance\");\n\n/**\n * The Client API Instance interface represents a client API model instance that extends the base Instance\n * from @fjell/registry and adds client API operations for interacting with remote data.\n *\n * The interface extends the base Instance (which provides coordinate and registry) with:\n * - clientApi: Provides methods for interacting with remote data through HTTP APIs (get, create, update, etc.)\n *\n * @template V - The type of the data model item, extending Item\n * @template S - The string literal type representing the model's key type\n * @template L1-L5 - Optional string literal types for location hierarchy levels\n */\nexport interface Instance<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> extends BaseInstance<S, L1, L2, L3, L4, L5> {\n /** The client API object that provides methods for interacting with remote data */\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>;\n}\n\nexport const createInstance = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n registry: Registry,\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>,\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>,\n ): Instance<V, S, L1, L2, L3, L4, L5> => {\n logger.debug(\"createInstance\", { coordinate, clientApi, registry });\n const baseInstance = createBaseInstance(registry, coordinate);\n return { ...baseInstance, clientApi };\n}\n", "import { Item } from \"@fjell/core\";\nimport { ClientApi } from \"./ClientApi\";\nimport { InstanceFactory as BaseInstanceFactory, Registry, RegistryHub } from \"@fjell/registry\";\nimport { createInstance, Instance } from \"./Instance\";\nimport { Coordinate } from \"@fjell/core\";\nimport LibLogger from \"./logger\";\n\nconst logger = LibLogger.get(\"InstanceFactory\");\n\nexport type InstanceFactory<\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> = (\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>\n) => BaseInstanceFactory<S, L1, L2, L3, L4, L5>;\n\n/**\n * Factory function for creating client-api instances\n */\nexport const createInstanceFactory = <\n V extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n clientApi: ClientApi<V, S, L1, L2, L3, L4, L5>\n ): BaseInstanceFactory<S, L1, L2, L3, L4, L5> => {\n return (coordinate: Coordinate<S, L1, L2, L3, L4, L5>, context: { registry: Registry, registryHub?: RegistryHub }) => {\n logger.debug(\"Creating client-api instance\", { coordinate, registry: context.registry, clientApi });\n\n return createInstance(context.registry, coordinate, clientApi) as Instance<V, S, L1, L2, L3, L4, L5>;\n };\n};\n", "import LibLogger from './logger';\nimport {\n Registry as BaseRegistry,\n createRegistry as createBaseRegistry,\n RegistryFactory,\n RegistryHub\n} from '@fjell/registry';\n\nconst logger = LibLogger.get(\"Registry\");\n\n/**\n * Extended Registry interface for client-api-specific functionality\n */\nexport interface Registry extends BaseRegistry {\n type: 'client-api';\n}\n\n/**\n * Factory function for creating client-api registries\n */\nexport const createRegistryFactory = (): RegistryFactory => {\n return (type: string, registryHub?: RegistryHub): BaseRegistry => {\n if (type !== 'client-api') {\n throw new Error(`Client API registry factory can only create 'client-api' type registries, got: ${type}`);\n }\n\n logger.debug(\"Creating client-api registry\", { type, registryHub });\n\n const baseRegistry = createBaseRegistry(type, registryHub);\n\n // Cast to Registry for type safety\n return baseRegistry as Registry;\n };\n};\n\n/**\n * Creates a new client-api registry instance\n */\nexport const createRegistry = (registryHub?: RegistryHub): Registry => {\n const baseRegistry = createBaseRegistry('client-api', registryHub);\n\n return {\n ...baseRegistry,\n } as Registry;\n};\n", "/**\n * Base class for all Client API errors\n */\nexport abstract class ClientApiError extends Error {\n abstract readonly code: string;\n abstract readonly isRetryable: boolean;\n readonly timestamp: Date;\n readonly context?: Record<string, any>;\n\n constructor(message: string, context?: Record<string, any>) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n this.context = context;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n isRetryable: this.isRetryable,\n timestamp: this.timestamp,\n context: this.context,\n stack: this.stack\n };\n }\n}\n\n/**\n * Network-related errors (connection issues, timeouts)\n */\nexport class NetworkError extends ClientApiError {\n readonly code = 'NETWORK_ERROR';\n readonly isRetryable = true;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Network error: ${message}`, context);\n }\n}\n\n/**\n * HTTP timeout errors\n */\nexport class TimeoutError extends ClientApiError {\n readonly code = 'TIMEOUT_ERROR';\n readonly isRetryable = true;\n\n constructor(timeout: number, context?: Record<string, any>) {\n super(`Request timed out after ${timeout}ms`, context);\n }\n}\n\n/**\n * Authentication errors (401 Unauthorized)\n */\nexport class AuthenticationError extends ClientApiError {\n readonly code = 'AUTHENTICATION_ERROR';\n readonly isRetryable = false;\n\n constructor(message?: string, context?: Record<string, any>) {\n super(message || 'Authentication failed - invalid or expired credentials', context);\n }\n}\n\n/**\n * Authorization errors (403 Forbidden)\n */\nexport class AuthorizationError extends ClientApiError {\n readonly code = 'AUTHORIZATION_ERROR';\n readonly isRetryable = false;\n\n constructor(message?: string, context?: Record<string, any>) {\n super(message || 'Access forbidden - insufficient permissions', context);\n }\n}\n\n/**\n * Resource not found errors (404 Not Found)\n */\nexport class NotFoundError extends ClientApiError {\n readonly code = 'NOT_FOUND_ERROR';\n readonly isRetryable = false;\n\n constructor(resource: string, identifier?: string, context?: Record<string, any>) {\n const message = identifier\n ? `${resource} with identifier '${identifier}' not found`\n : `${resource} not found`;\n super(message, context);\n }\n}\n\n/**\n * Request validation errors (400 Bad Request)\n */\nexport class ValidationError extends ClientApiError {\n readonly code = 'VALIDATION_ERROR';\n readonly isRetryable = false;\n readonly validationErrors?: Array<{ field: string; message: string }>;\n\n constructor(message: string, validationErrors?: Array<{ field: string; message: string }>, context?: Record<string, any>) {\n super(`Validation error: ${message}`, context);\n this.validationErrors = validationErrors;\n }\n}\n\n/**\n * Conflict errors (409 Conflict)\n */\nexport class ConflictError extends ClientApiError {\n readonly code = 'CONFLICT_ERROR';\n readonly isRetryable = false;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Conflict: ${message}`, context);\n }\n}\n\n/**\n * Rate limiting errors (429 Too Many Requests)\n */\nexport class RateLimitError extends ClientApiError {\n readonly code = 'RATE_LIMIT_ERROR';\n readonly isRetryable = true;\n readonly retryAfter?: number;\n\n constructor(retryAfter?: number, context?: Record<string, any>) {\n const message = retryAfter\n ? `Rate limit exceeded - retry after ${retryAfter} seconds`\n : 'Rate limit exceeded';\n super(message, context);\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Server errors (5xx status codes)\n */\nexport class ServerError extends ClientApiError {\n readonly code = 'SERVER_ERROR';\n readonly isRetryable = true;\n readonly statusCode: number;\n\n constructor(statusCode: number, message?: string, context?: Record<string, any>) {\n super(message || `Server error (${statusCode})`, context);\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Request payload too large errors (413)\n */\nexport class PayloadTooLargeError extends ClientApiError {\n readonly code = 'PAYLOAD_TOO_LARGE_ERROR';\n readonly isRetryable = false;\n\n constructor(maxSize?: string, context?: Record<string, any>) {\n const message = maxSize\n ? `Request payload too large - maximum size is ${maxSize}`\n : 'Request payload too large';\n super(message, context);\n }\n}\n\n/**\n * Generic HTTP errors for unhandled status codes\n */\nexport class HttpError extends ClientApiError {\n readonly code = 'HTTP_ERROR';\n readonly isRetryable: boolean;\n readonly statusCode: number;\n readonly statusText: string;\n\n constructor(statusCode: number, statusText: string, message?: string, context?: Record<string, any>) {\n super(message || `HTTP error ${statusCode}: ${statusText}`, context);\n this.statusCode = statusCode;\n this.statusText = statusText;\n\n // 5xx errors are generally retryable, 4xx are not\n this.isRetryable = statusCode >= 500;\n }\n}\n\n/**\n * Configuration errors\n */\nexport class ConfigurationError extends ClientApiError {\n readonly code = 'CONFIGURATION_ERROR';\n readonly isRetryable = false;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Configuration error: ${message}`, context);\n }\n}\n\n/**\n * Parse/serialization errors\n */\nexport class ParseError extends ClientApiError {\n readonly code = 'PARSE_ERROR';\n readonly isRetryable = false;\n\n constructor(message: string, context?: Record<string, any>) {\n super(`Parse error: ${message}`, context);\n }\n}\n\n/**\n * Create appropriate error from HTTP response\n */\nexport function createHttpError(\n statusCode: number,\n statusText: string,\n responseBody?: any,\n context?: Record<string, any>\n): ClientApiError {\n const errorContext = { statusCode, statusText, responseBody, ...context };\n\n switch (statusCode) {\n case 400:\n if (responseBody?.validationErrors) {\n return new ValidationError(\n responseBody.message || 'Request validation failed',\n responseBody.validationErrors,\n errorContext\n );\n }\n return new ValidationError(responseBody?.message || statusText, [], errorContext);\n\n case 401:\n return new AuthenticationError(responseBody?.message, errorContext);\n\n case 403:\n return new AuthorizationError(responseBody?.message, errorContext);\n\n case 404:\n return new NotFoundError(\n responseBody?.resource || 'Resource',\n responseBody?.identifier,\n errorContext\n );\n\n case 409:\n return new ConflictError(responseBody?.message || statusText, errorContext);\n\n case 413:\n return new PayloadTooLargeError(responseBody?.maxSize, errorContext);\n\n case 429: {\n let retryAfter: number | undefined;\n if (responseBody?.retryAfter) {\n retryAfter = responseBody.retryAfter;\n } else if (context?.headers?.['retry-after']) {\n retryAfter = parseInt(context.headers['retry-after']);\n }\n return new RateLimitError(retryAfter, errorContext);\n }\n\n default:\n if (statusCode >= 500) {\n return new ServerError(statusCode, responseBody?.message || statusText, errorContext);\n }\n\n return new HttpError(statusCode, statusText, responseBody?.message, errorContext);\n }\n}\n\n/**\n * Create appropriate error from network/connection issues\n */\nexport function createNetworkError(error: any, context?: Record<string, any>): ClientApiError {\n const errorContext = { originalError: error, ...context };\n\n if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {\n return new TimeoutError(error.timeout || 5000, errorContext);\n }\n\n if (error.code === 'ECONNREFUSED' ||\n error.code === 'ENOTFOUND' ||\n error.code === 'ENETUNREACH' ||\n error.message?.includes('network')) {\n return new NetworkError(error.message || 'Network connection failed', errorContext);\n }\n\n // For unknown errors, treat as network issues that might be retryable\n return new NetworkError(error.message || 'Unknown network error', errorContext);\n}\n\n/**\n * Type guard to check if error is retryable\n */\nexport function isRetryableError(error: any): boolean {\n return error instanceof ClientApiError && error.isRetryable;\n}\n\n/**\n * Type guard to check if error is a Client API error\n */\nexport function isClientApiError(error: any): error is ClientApiError {\n return error instanceof ClientApiError;\n}\n", "export type { CItemApi } from \"./CItemAPI\";\nexport type { PItemApi } from \"./PItemAPI\";\nexport type { ClientApi } from \"./ClientApi\";\nexport type { ClientApiOptions } from \"./ClientApiOptions\";\n\nexport { createCItemApi } from \"./CItemAPI\";\nexport { createPItemApi } from \"./PItemAPI\";\n\n// Registry components\nexport * from './Instance';\nexport * from './InstanceFactory';\nexport * from './Registry';\n\n// Error handling\nexport * from './errors/index';\nexport * from './ops/errorHandling';\n\n// Re-export FjellHttpError from http-api for convenience\nexport { FjellHttpError, isFjellHttpError, extractErrorInfo, type ErrorInfo } from '@fjell/http-api';\n\n// HTTP wrapper\nexport * from './http/HttpWrapper';\n", "import { HttpApi } from '@fjell/http-api';\nimport {\n ClientApiError,\n createHttpError,\n createNetworkError,\n RateLimitError\n} from '../errors/index';\n\n// Structured logger interface for agentic debugging\nconst logger = {\n debug: (message: string, context?: any) => {\n const logData = {\n component: 'client-api',\n subcomponent: 'HttpWrapper',\n level: 'debug',\n message,\n ...context,\n timestamp: new Date().toISOString()\n };\n console.debug(JSON.stringify(logData));\n },\n info: (message: string, context?: any) => {\n const logData = {\n component: 'client-api',\n subcomponent: 'HttpWrapper',\n level: 'info',\n message,\n ...context,\n timestamp: new Date().toISOString()\n };\n console.info(JSON.stringify(logData));\n },\n warning: (message: string, context?: any) => {\n const logData = {\n component: 'client-api',\n subcomponent: 'HttpWrapper',\n level: 'warning',\n message,\n ...context,\n timestamp: new Date().toISOString()\n };\n console.warn(JSON.stringify(logData));\n },\n error: (message: string, context?: any) => {\n const logData = {\n component: 'client-api',\n subcomponent: 'HttpWrapper',\n level: 'error',\n message,\n ...context,\n timestamp: new Date().toISOString(),\n suggestion: context?.suggestion || 'Check error details, retry configuration, and network connectivity'\n };\n console.error(JSON.stringify(logData));\n }\n};\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries?: number;\n /** Initial delay between retries in milliseconds (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay between retries in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 2) */\n backoffMultiplier?: number;\n /** Whether to add jitter to retry delays (default: true) */\n enableJitter?: boolean;\n /** Custom function to determine if an error should be retried */\n shouldRetry?: (error: ClientApiError, attemptNumber: number) => boolean;\n /** Called before each retry attempt */\n onRetry?: (error: ClientApiError, attemptNumber: number, delay: number) => void;\n}\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n enableJitter: true,\n shouldRetry: (error: ClientApiError, attemptNumber: number) => {\n // Don't retry after max attempts\n if (attemptNumber >= 3) return false;\n\n // Always retry retryable errors\n if (error.isRetryable) return true;\n\n // Don't retry non-retryable errors\n return false;\n },\n onRetry: (error: ClientApiError, attemptNumber: number, delay: number) => {\n logger.warning(`Retrying HTTP request (attempt ${attemptNumber + 1}) after ${delay}ms`, {\n errorCode: error.code,\n errorMessage: error.message,\n delay,\n attemptNumber\n });\n }\n};\n\n/**\n * Sleep utility for retry delays\n */\nconst sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Calculate delay for exponential backoff with optional jitter\n */\nfunction calculateDelay(\n attemptNumber: number,\n config: Required<RetryConfig>\n): number {\n const exponentialDelay = config.initialDelayMs * Math.pow(config.backoffMultiplier, attemptNumber);\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n if (!config.enableJitter) {\n return cappedDelay;\n }\n\n // Add jitter: random value between 50% and 100% of calculated delay\n const jitter = 0.5 + (Math.random() * 0.5);\n return Math.floor(cappedDelay * jitter);\n}\n\n/**\n * Enhanced HTTP wrapper with retry logic and comprehensive error handling\n */\nexport class HttpWrapper {\n private readonly api: HttpApi;\n private readonly retryConfig: Required<RetryConfig>;\n\n constructor(api: HttpApi, retryConfig: RetryConfig = {}) {\n this.api = api;\n this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };\n }\n\n /**\n * Execute HTTP operation with retry logic and error handling\n */\n async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n context?: Record<string, any>\n ): Promise<T> {\n let lastError: ClientApiError | null = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n logger.debug(`Executing ${operationName}`, {\n attempt: attempt + 1,\n maxRetries: this.retryConfig.maxRetries + 1,\n ...context\n });\n\n const result = await operation();\n\n if (attempt > 0) {\n logger.info(`${operationName} succeeded after ${attempt} retries`, {\n totalAttempts: attempt + 1,\n duration: Date.now() - startTime,\n ...context\n });\n }\n\n return result;\n } catch (error) {\n lastError = this.convertToClientApiError(error, operationName, context);\n\n // Don't retry on the last attempt\n if (attempt === this.retryConfig.maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n if (!this.retryConfig.shouldRetry(lastError, attempt)) {\n logger.debug(`Not retrying ${operationName} due to non-retryable error`, {\n errorCode: lastError.code,\n errorMessage: lastError.message,\n attempt: attempt + 1,\n ...context\n });\n break;\n }\n\n // Handle rate limiting with custom delay\n let delay = calculateDelay(attempt, this.retryConfig);\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n delay = Math.max(delay, lastError.retryAfter * 1000);\n }\n\n // Call retry callback\n this.retryConfig.onRetry(lastError, attempt, delay);\n\n // Wait before retrying\n await sleep(delay);\n }\n }\n\n // Log final failure with comprehensive context\n logger.error(`${operationName} failed after all retry attempts`, {\n operation: operationName,\n errorCode: lastError?.code,\n errorMessage: lastError?.message,\n errorType: lastError?.constructor?.name,\n isRetryable: lastError?.isRetryable,\n totalAttempts: this.retryConfig.maxRetries + 1,\n duration: Date.now() - startTime,\n retryConfig: {\n maxRetries: this.retryConfig.maxRetries,\n initialDelayMs: this.retryConfig.initialDelayMs,\n backoffMultiplier: this.retryConfig.backoffMultiplier\n },\n suggestion: lastError?.isRetryable\n ? 'Error is retryable but all attempts exhausted. Check network connectivity, server status, and increase retry limits if needed.'\n : 'Error is not retryable. Check request parameters, authentication, and server-side validation.',\n ...context\n });\n\n throw lastError;\n }\n\n /**\n * Convert any error to a ClientApiError\n */\n private convertToClientApiError(\n error: any,\n operationName: string,\n context?: Record<string, any>\n ): ClientApiError {\n const errorContext = { operation: operationName, ...context };\n\n // If it's already a ClientApiError, return as-is\n if (error instanceof ClientApiError) {\n return error;\n }\n\n // Handle HTTP response errors\n if (error.response) {\n const { status, statusText, data, headers } = error.response;\n return createHttpError(status, statusText, data, {\n ...errorContext,\n headers,\n url: error.config?.url\n });\n }\n\n // Handle request errors (network issues, timeouts, etc.)\n if (error.request) {\n return createNetworkError(error, {\n ...errorContext,\n url: error.config?.url,\n method: error.config?.method\n });\n }\n\n // Handle configuration or other errors\n return createNetworkError(error, errorContext);\n }\n\n /**\n * Wrapper for HTTP GET operations\n */\n async get<T>(\n url: string,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpGet(url, options),\n 'GET',\n { url, ...context }\n );\n }\n\n /**\n * Wrapper for HTTP POST operations\n */\n async post<T>(\n url: string,\n data?: any,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpPost(url, data, options),\n 'POST',\n { url, hasData: !!data, ...context }\n );\n }\n\n /**\n * Wrapper for HTTP PUT operations\n */\n async put<T>(\n url: string,\n data?: any,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpPut(url, data, options),\n 'PUT',\n { url, hasData: !!data, ...context }\n );\n }\n\n /**\n * Wrapper for HTTP DELETE operations\n */\n async delete<T>(\n url: string,\n options?: any,\n context?: Record<string, any>\n ): Promise<T> {\n return this.executeWithRetry(\n () => this.api.httpDelete(url, options),\n 'DELETE',\n { url, ...context }\n );\n }\n\n /**\n * Update retry configuration\n */\n updateRetryConfig(newConfig: Partial<RetryConfig>): void {\n Object.assign(this.retryConfig, newConfig);\n }\n\n /**\n * Get current retry configuration\n */\n getRetryConfig(): Required<RetryConfig> {\n return { ...this.retryConfig };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["logger", "action", "logger", "queryToParams", "logger", "queryToParams", "logger", "logger", "logger", "totalDuration", "logger", "logger", "totalDuration", "logger", "totalDuration", "logger", "totalDuration", "logger", "logger", "facet", "logger", "logger", "logger", "logger", "logger", "ensureItemsExtracted", "action", "facet", "options", "logger", "logger", "logger", "isFjellHttpError", "logger"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fjell/client-api",
3
3
  "description": "Client API for Fjell",
4
- "version": "4.4.67",
4
+ "version": "4.4.68",
5
5
  "keywords": [
6
6
  "client",
7
7
  "api",
@@ -38,10 +38,10 @@
38
38
  "docs:test": "cd docs && npm run test"
39
39
  },
40
40
  "dependencies": {
41
- "@fjell/core": "^4.4.72",
42
- "@fjell/http-api": "^4.4.62",
41
+ "@fjell/core": "^4.4.73",
42
+ "@fjell/http-api": "^4.4.63",
43
43
  "@fjell/logging": "^4.4.65",
44
- "@fjell/registry": "^4.4.80",
44
+ "@fjell/registry": "^4.4.81",
45
45
  "deepmerge": "^4.3.1"
46
46
  },
47
47
  "devDependencies": {