From a6d8db3dae06d5e532ea384547068719d73bc5c7 Mon Sep 17 00:00:00 2001 From: Ali Mihandoost Date: Sat, 17 Dec 2022 22:01:48 +0330 Subject: [PATCH 1/3] feat(fetch): add AlwatrDocumentStorage type --- core/fetch/src/type.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/fetch/src/type.ts b/core/fetch/src/type.ts index 745d3586a..32e316370 100644 --- a/core/fetch/src/type.ts +++ b/core/fetch/src/type.ts @@ -128,3 +128,15 @@ export type AlwatrServiceResponse, TMeta = Recor | AlwatrServiceResponseSuccess | AlwatrServiceResponseSuccessWithMeta | AlwatrServiceResponseFailed; + +export type AlwatrDocumentMeta = { + formatVersion: number; + reversion: number; + lastUpdated: number; + lastAutoId: number; +}; + +export type AlwatrDocumentStorage = Omit< + AlwatrServiceResponseSuccessWithMeta, AlwatrDocumentMeta>, + 'statusCode' | 'errorCode' +>; From 7844ec75defd47f420f52ff7f92dee2f41efe025 Mon Sep 17 00:00:00 2001 From: Ali Mihandoost Date: Sat, 17 Dec 2022 22:02:11 +0330 Subject: [PATCH 2/3] feat(fetch): serviceRequest --- core/fetch/src/fetch.ts | 65 ++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/core/fetch/src/fetch.ts b/core/fetch/src/fetch.ts index 3962916f6..60ecbaedd 100644 --- a/core/fetch/src/fetch.ts +++ b/core/fetch/src/fetch.ts @@ -6,15 +6,11 @@ import type { CacheStrategy, AlwatrDocumentObject, AlwatrServiceResponse, + AlwatrServiceResponseSuccessWithMeta, + AlwatrServiceResponseSuccess, } from './type.js'; -export { - FetchOptions, - CacheDuplicate, - CacheStrategy, - AlwatrDocumentObject, - AlwatrServiceResponse, -}; +export {FetchOptions, CacheDuplicate, CacheStrategy, AlwatrDocumentObject, AlwatrServiceResponse}; const logger = createLogger('alwatr/fetch'); @@ -28,6 +24,46 @@ const cacheSupported = 'caches' in globalThis; const duplicateRequestStorage: Record> = {}; +/** + * Fetch from alwatr services and return standard response. + */ +export async function serviceRequest, TMeta = Record>( + options: FetchOptions, +): Promise | AlwatrServiceResponseSuccessWithMeta> { + logger.logMethod('serviceRequest'); + + const response = await fetch(options); + + let responseJson: AlwatrServiceResponse; + try { + responseJson = await response.json(); + } + catch (err) { + let responseText: string | null = null; + try { + responseText = await response.text(); + } + catch { + logger.accident('serviceRequest', 'invalid_response', 'Cannot extract response.text()'); + } + logger.error('serviceRequest', 'invalid_json', err, {responseText}); + throw new Error('invalid_json'); + } + + if (responseJson.ok !== true) { + logger.error('serviceRequest', 'fetch_nok', {responseJson}); + if (typeof responseJson.errorCode === 'string') { + throw new Error(responseJson.errorCode); + } + // else + throw new Error('fetch_nok'); + } + + // TODO: generate fetch signals hook (for easier handle loading and show error toast) + + return responseJson; +} + /** * It's a wrapper around the browser's `fetch` function that adds retry pattern, timeout, cacheStrategy, * remove duplicates, etc. @@ -45,10 +81,10 @@ const duplicateRequestStorage: Record> = {}; * }); * ``` */ -export function fetch(_options: FetchOptions): Promise { - const options = _processOptions(_options); - logger.logMethodArgs('fetch', {options}); - return _handleCacheStrategy(options); +export function fetch(options: FetchOptions): Promise { + const _options = _processOptions(options); + logger.logMethodArgs('fetch', {options: _options}); + return _handleCacheStrategy(_options); } /** @@ -140,11 +176,12 @@ async function _handleCacheStrategy(options: Required): Promise Date: Sat, 17 Dec 2022 23:15:09 +0330 Subject: [PATCH 3/3] chore(fetch): enhance loge --- core/fetch/src/fetch.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/fetch/src/fetch.ts b/core/fetch/src/fetch.ts index 60ecbaedd..635c6ae3e 100644 --- a/core/fetch/src/fetch.ts +++ b/core/fetch/src/fetch.ts @@ -83,7 +83,7 @@ export async function serviceRequest, TMeta = Re */ export function fetch(options: FetchOptions): Promise { const _options = _processOptions(options); - logger.logMethodArgs('fetch', {options: _options}); + logger.logMethodArgs('fetch', {options, _options}); return _handleCacheStrategy(_options); }