@dxtmisha/wiki 0.39.6 → 0.39.8
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/defineProperty-Bjg6wMoX.js +39 -0
- package/dist/library.d.ts +0 -1
- package/dist/library.js +25 -25
- package/dist/media.js +12 -0
- package/dist/storybook.js +26929 -11
- package/package.json +1 -1
- package/src/library.ts +0 -1
- package/src/media/functional/functional-basic/api/api.en.mdx +45 -0
- package/src/media/functional/functional-basic/api/api.ru.mdx +45 -0
- package/src/media/functional/functional-basic/api/api.vi.mdx +45 -0
- package/src/media/functional/functional-basic/classes/Api/Api.en.mdx +54 -54
- package/src/media/functional/functional-basic/classes/Api/Api.ru.mdx +54 -54
- package/src/media/functional/functional-basic/classes/Api/Api.vi.mdx +54 -54
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.en.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.ru.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.vi.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.en.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.ru.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.vi.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.en.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.ru.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.vi.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.en.mdx +28 -14
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.ru.mdx +33 -19
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.vi.mdx +33 -19
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.en.mdx +56 -0
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.ru.mdx +56 -0
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.vi.mdx +55 -0
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.en.mdx +101 -49
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.ru.mdx +101 -49
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.vi.mdx +98 -47
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.en.mdx +44 -26
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.ru.mdx +45 -27
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.vi.mdx +44 -26
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.en.mdx +50 -21
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.ru.mdx +54 -25
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.vi.mdx +55 -26
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.en.mdx +29 -32
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.ru.mdx +33 -36
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.vi.mdx +33 -36
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.en.mdx +34 -53
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.ru.mdx +33 -52
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.vi.mdx +39 -58
- package/src/media/functional/functional-basic/classes/Cache/Cache.en.mdx +7 -4
- package/src/media/functional/functional-basic/classes/Cache/Cache.ru.mdx +7 -4
- package/src/media/functional/functional-basic/classes/Cache/Cache.vi.mdx +28 -25
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.en.mdx +45 -53
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.ru.mdx +46 -54
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.vi.mdx +47 -55
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.en.mdx +13 -1
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.ru.mdx +13 -1
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.vi.mdx +13 -0
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.en.mdx +88 -44
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.ru.mdx +88 -44
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.vi.mdx +85 -41
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.en.mdx +43 -22
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.ru.mdx +46 -25
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.vi.mdx +43 -22
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.en.mdx +84 -0
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.ru.mdx +84 -0
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.vi.mdx +100 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.en.mdx +153 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.ru.mdx +153 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.vi.mdx +153 -0
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.en.mdx +32 -25
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.ru.mdx +32 -25
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.vi.mdx +32 -27
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.en.mdx +36 -4
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.ru.mdx +36 -4
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.vi.mdx +36 -4
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.en.mdx +101 -70
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.ru.mdx +100 -69
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.vi.mdx +101 -70
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.en.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.ru.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.vi.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.en.mdx +44 -96
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.ru.mdx +44 -96
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.vi.mdx +44 -96
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.en.mdx +49 -28
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.ru.mdx +21 -0
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.vi.mdx +63 -42
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.en.mdx +97 -109
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.ru.mdx +86 -98
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.vi.mdx +99 -111
- package/src/media/functional/functional-basic/classes/Geo/Geo.en.mdx +3 -3
- package/src/media/functional/functional-basic/classes/Geo/Geo.ru.mdx +5 -5
- package/src/media/functional/functional-basic/classes/Geo/Geo.vi.mdx +5 -5
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.en.mdx +83 -40
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.ru.mdx +83 -40
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.vi.mdx +87 -44
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.en.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.ru.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.vi.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.en.mdx +56 -105
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.ru.mdx +53 -102
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.vi.mdx +55 -105
- package/src/media/functional/functional-basic/classes/Hash/Hash.en.mdx +18 -7
- package/src/media/functional/functional-basic/classes/Hash/Hash.ru.mdx +18 -7
- package/src/media/functional/functional-basic/classes/Hash/Hash.vi.mdx +18 -7
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.en.mdx +54 -0
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.ru.mdx +54 -0
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.vi.mdx +54 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.en.mdx +78 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.ru.mdx +78 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.vi.mdx +78 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.en.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.ru.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.vi.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.en.mdx +131 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.ru.mdx +131 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.vi.mdx +131 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.en.mdx +97 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.ru.mdx +97 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.vi.mdx +97 -0
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.en.mdx +13 -5
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.ru.mdx +13 -5
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.vi.mdx +13 -5
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.en.mdx +37 -19
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.ru.mdx +37 -19
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.vi.mdx +35 -17
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.en.mdx +31 -19
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.ru.mdx +31 -19
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.vi.mdx +32 -20
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.en.mdx +29 -15
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.ru.mdx +28 -14
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.vi.mdx +28 -14
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.en.mdx +7 -3
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.ru.mdx +7 -3
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.vi.mdx +7 -3
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.en.mdx +17 -13
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.ru.mdx +17 -13
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.vi.mdx +17 -13
- package/src/media/functional/functional-basic/functions/createElement/createElement.en.mdx +2 -0
- package/src/media/functional/functional-basic/functions/createElement/createElement.ru.mdx +2 -0
- package/src/media/functional/functional-basic/functions/createElement/createElement.vi.mdx +2 -0
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.en.mdx +1 -3
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.ru.mdx +1 -3
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.vi.mdx +1 -3
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.en.mdx +13 -10
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.ru.mdx +14 -11
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.vi.mdx +12 -9
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.en.mdx +14 -13
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.ru.mdx +15 -14
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.vi.mdx +14 -13
- package/src/media/functional/functional-basic/functions/forEach/forEach.en.mdx +1 -1
- package/src/media/functional/functional-basic/functions/forEach/forEach.ru.mdx +1 -1
- package/src/media/functional/functional-basic/functions/forEach/forEach.vi.mdx +1 -1
- package/src/media/functional/functional-basic/functions/frame/frame.en.mdx +7 -4
- package/src/media/functional/functional-basic/functions/frame/frame.ru.mdx +6 -3
- package/src/media/functional/functional-basic/functions/frame/frame.vi.mdx +7 -4
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.en.mdx +34 -0
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.ru.mdx +34 -0
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.vi.mdx +35 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.en.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.ru.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.vi.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.en.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.ru.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.vi.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.en.mdx +17 -3
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.ru.mdx +17 -3
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.vi.mdx +18 -4
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.en.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.ru.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.vi.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.en.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.ru.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.vi.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.en.mdx +11 -4
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.ru.mdx +14 -7
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.vi.mdx +13 -6
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.en.mdx +3 -2
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.ru.mdx +3 -2
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.vi.mdx +3 -2
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.en.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.ru.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.vi.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toString/toString.en.mdx +28 -0
- package/src/media/functional/functional-basic/functions/toString/toString.ru.mdx +28 -0
- package/src/media/functional/functional-basic/functions/toString/toString.vi.mdx +28 -0
- package/src/media/functional/ui/about/about.en.mdx +45 -0
- package/src/media/functional/ui/about/about.ru.mdx +45 -0
- package/src/media/functional/ui/about/about.vi.mdx +45 -0
- package/src/media/functional/ui/component/component.en.mdx +104 -0
- package/src/media/functional/ui/component/component.ru.mdx +106 -0
- package/src/media/functional/ui/component/component.vi.mdx +104 -0
- package/src/media/functional/ui/setup/setup.en.mdx +72 -0
- package/src/media/functional/ui/setup/setup.ru.mdx +72 -0
- package/src/media/functional/ui/setup/setup.vi.mdx +72 -0
- package/src/media/functional/ui/wiki-data.en.mdx +114 -0
- package/src/media/functional/ui/wiki-data.ru.mdx +114 -0
- package/src/media/functional/ui/wiki-data.vi.mdx +114 -0
- package/dist/WikiStorybookDescriptions-IKMchHA-.js +0 -26959
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/en/functional-basic/Classes/ApiCache - API Response Caching'/>
|
|
4
|
+
|
|
5
|
+
# ApiCache Class
|
|
6
|
+
|
|
7
|
+
A class for caching API responses. It allows storing query results in memory or an external storage, preventing redundant network calls within a specified period. In the current implementation, caching is active by default only on the server side (SSR) to speed up rendering and reduce API load during concurrent requests.
|
|
8
|
+
|
|
9
|
+
> `ApiCache` is an **auxiliary class**, designed for low-level cache management. In most cases, it is recommended to interact with caching through the `cache` parameter in `ApiInstance` or the global `Api` object.
|
|
10
|
+
|
|
11
|
+
## Key Features
|
|
12
|
+
|
|
13
|
+
- **Automated Key Management** — generates unique cache keys based on request parameters (path, method, body, etc.).
|
|
14
|
+
- **Flexible TTL (Time To Live)** — allows setting the storage duration for each request individually or using a default (24 hours).
|
|
15
|
+
- **SSR Optimization** — prevents unnecessary API calls in the Node.js environment. Disabled by default in the browser (only works if explicitly enabled through configuration parameters).
|
|
16
|
+
- **Listener Support** — ability to connect external storage (e.g., Redis, Nitro Storage) via callback functions.
|
|
17
|
+
- **Background Cleanup** — automatically removes expired entries when accessing the cache.
|
|
18
|
+
|
|
19
|
+
## Methods
|
|
20
|
+
|
|
21
|
+
### Action
|
|
22
|
+
|
|
23
|
+
Methods for managing cache entries.
|
|
24
|
+
|
|
25
|
+
- `get<T>(key: string): Promise<T | undefined>` — Retrieves a value from the cache.
|
|
26
|
+
- `getByFetch<T>(fetch: ApiFetch): Promise<T | undefined>` — Retrieves a value using request options as the key source.
|
|
27
|
+
- `set<T>(key: string, value: T, age?: number): Promise<void>` — Stores a value in the cache.
|
|
28
|
+
- `setByFetch<T>(fetch: ApiFetch, value: T): Promise<void>` — Stores a value using request options.
|
|
29
|
+
- `remove(key: string): Promise<void>` — Manually removes an entry.
|
|
30
|
+
|
|
31
|
+
### Configuration
|
|
32
|
+
|
|
33
|
+
- `init(getListener, setListener, removeListener, cacheStepAgeClearOld?): void` — Configures the cache with storage listeners.
|
|
34
|
+
- `reset(): void` — Clears in-memory items and detaches listeners.
|
|
35
|
+
|
|
36
|
+
## Types
|
|
37
|
+
|
|
38
|
+
#### `ApiCacheItem<T>`
|
|
39
|
+
The structure of a cached record.
|
|
40
|
+
- `value: T` — The cached data.
|
|
41
|
+
- `age: number` — TTL in seconds.
|
|
42
|
+
- `cacheAge: number` — Creation timestamp (ms).
|
|
43
|
+
|
|
44
|
+
#### `ApiCacheList`
|
|
45
|
+
An internal dictionary for in-memory storage fallback.
|
|
46
|
+
- `[key: string]: ApiCacheItem` — Key-value pairs of cached items.
|
|
47
|
+
|
|
48
|
+
## Initialization and External Storage
|
|
49
|
+
|
|
50
|
+
By default, `ApiCache` stores records in the process RAM and works only on the server side. While this is fast, it has limitations in production environments:
|
|
51
|
+
1. **Cluster Synchronization**: In a multi-instance setup, caches are not shared between processes.
|
|
52
|
+
2. **Process Restarts**: Memory is cleared whenever the server restarts or a serverless function "cold starts".
|
|
53
|
+
3. **Memory Limits**: Storing large amounts of data in RAM can lead to increased memory consumption.
|
|
54
|
+
|
|
55
|
+
To solve these issues, you must initialize `ApiCache` with the `init` method, providing listeners that bridge it to an external storage mechanism.
|
|
56
|
+
|
|
57
|
+
> Important: You must call `ApiCache.init()` during your application's bootstrap phase (before the first API request) to ensure the cache is correctly configured.
|
|
58
|
+
|
|
59
|
+
### Node.js (Custom Storage)
|
|
60
|
+
|
|
61
|
+
In a standard Node.js environment, you can use listeners to interact with a centralized database or a persistent cache like Redis.
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { ApiCache } from '@dxtmisha/functional-basic'
|
|
65
|
+
|
|
66
|
+
// Configuration with storage listeners
|
|
67
|
+
ApiCache.init(
|
|
68
|
+
// 1. Get data from external storage
|
|
69
|
+
async (key) => await myExternalStorage.get(key),
|
|
70
|
+
|
|
71
|
+
// 2. Save data to external storage
|
|
72
|
+
async (key, value) => {
|
|
73
|
+
await myExternalStorage.put(key, value)
|
|
74
|
+
return true // Return true to indicate successful external storage
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
// 3. Remove data from external storage
|
|
78
|
+
async (key) => {
|
|
79
|
+
await myExternalStorage.delete(key)
|
|
80
|
+
return true
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
// 4. Optional: threshold for background cleanup trigger
|
|
84
|
+
16384
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Nuxt / Nitro
|
|
89
|
+
|
|
90
|
+
In Nuxt/Nitro, the recommended approach is to use the built-in `useStorage` helper within a server plugin. This allows you to leverage Redis, FS, or other Nitro-supported storage drivers.
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// server/plugins/api-cache.ts
|
|
94
|
+
import { ApiCache } from '@dxtmisha/functional-basic'
|
|
95
|
+
|
|
96
|
+
export default defineNitroPlugin(() => {
|
|
97
|
+
const storage = useStorage('cache') // Nitro Cache region
|
|
98
|
+
|
|
99
|
+
ApiCache.init(
|
|
100
|
+
async (key) => await storage.getItem(key),
|
|
101
|
+
async (key, value) => {
|
|
102
|
+
await storage.setItem(key, value)
|
|
103
|
+
return true
|
|
104
|
+
},
|
|
105
|
+
async (key) => {
|
|
106
|
+
await storage.removeItem(key)
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
})
|
|
111
|
+
```
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/ru/functional-basic/Classes/ApiCache - Кэширование ответов API'/>
|
|
4
|
+
|
|
5
|
+
# Класс ApiCache
|
|
6
|
+
|
|
7
|
+
Класс для кэширования ответов API. Он позволяет сохранять результаты запросов в памяти или во внешнем хранилище, предотвращая избыточные сетевые вызовы в течение заданного периода. В текущей реализации кэширование по умолчанию активно только на стороне сервера (SSR) для ускорения рендеринга и снижения нагрузки на API при одновременных запросах.
|
|
8
|
+
|
|
9
|
+
> `ApiCache` является **вспомогательным классом**, предназначенным для низкоуровневого управления кэшем. В большинстве случаев рекомендуется взаимодействовать с кэшированием через параметр `cache` в `ApiInstance` или глобальный объект `Api`.
|
|
10
|
+
|
|
11
|
+
## Основные возможности
|
|
12
|
+
|
|
13
|
+
- **Автоматическое управление ключами** — генерирует уникальные ключи кэша на основе параметров запроса (путь, метод, тело запроса и т.д.).
|
|
14
|
+
- **Гибкий TTL (Time To Live)** — позволяет устанавливать время хранения для каждого запроса индивидуально или использовать значение по умолчанию (24 часа).
|
|
15
|
+
- **Оптимизация SSR** — предотвращает ненужные вызовы API в среде Node.js. По умолчанию отключено в браузере (работает только если явно включено через параметры конфигурации).
|
|
16
|
+
- **Поддержка слушателей** — возможность подключения внешнего хранилища (например, Redis, Nitro Storage) через функции обратного вызова.
|
|
17
|
+
- **Фоновая очистка** — автоматически удаляет устаревшие записи при обращении к кэшу.
|
|
18
|
+
|
|
19
|
+
## Методы
|
|
20
|
+
|
|
21
|
+
### Действие
|
|
22
|
+
|
|
23
|
+
Методы для управления записями кэша.
|
|
24
|
+
|
|
25
|
+
- `get<T>(key: string): Promise<T | undefined>` — Извлекает значение из кэша.
|
|
26
|
+
- `getByFetch<T>(fetch: ApiFetch): Promise<T | undefined>` — Извлекает значение, используя опции запроса как источник ключа.
|
|
27
|
+
- `set<T>(key: string, value: T, age?: number): Promise<void>` — Сохраняет значение в кэше.
|
|
28
|
+
- `setByFetch<T>(fetch: ApiFetch, value: T): Promise<void>` — Сохраняет значение на основе опций запроса.
|
|
29
|
+
- `remove(key: string): Promise<void>` — Удаляет запись вручную.
|
|
30
|
+
|
|
31
|
+
### Конфигурация
|
|
32
|
+
|
|
33
|
+
- `init(getListener, setListener, removeListener, cacheStepAgeClearOld?): void` — Настраивает кэш слушателями хранилища.
|
|
34
|
+
- `reset(): void` — Очищает элементы в памяти и отключает слушателей.
|
|
35
|
+
|
|
36
|
+
## Типы данных
|
|
37
|
+
|
|
38
|
+
#### `ApiCacheItem<T>`
|
|
39
|
+
Структура кэшированной записи.
|
|
40
|
+
- `value: T` — Значение данных.
|
|
41
|
+
- `age: number` — TTL в секундах.
|
|
42
|
+
- `cacheAge: number` — Метка времени создания (мс).
|
|
43
|
+
|
|
44
|
+
#### `ApiCacheList`
|
|
45
|
+
Внутренний словарь для резервного хранения в оперативной памяти.
|
|
46
|
+
- `[key: string]: ApiCacheItem` — Пары ключ-значение кэшированных элементов.
|
|
47
|
+
|
|
48
|
+
## Инициализация и внешнее хранилище
|
|
49
|
+
|
|
50
|
+
По умолчанию `ApiCache` сохраняет записи в оперативной памяти (RAM) процесса и работает только на стороне сервера. Хотя это очень быстро, в продуктовой среде такой подход имеет ограничения:
|
|
51
|
+
1. **Синхронизация в кластере**: В многоэкземплярной конфигурации кэши не разделяются между процессами.
|
|
52
|
+
2. **Перезагрузка процесса**: Память очищается при каждом перезапуск сервера или «холодном старте» серверных функций.
|
|
53
|
+
3. **Лимиты памяти**: Хранение больших объемов данных в RAM может привести к чрезмерному потреблению ресурсов.
|
|
54
|
+
|
|
55
|
+
Для решения этих задач необходимо инициализировать `ApiCache` с помощью метода `init`, предоставив слушателей (listeners) для связи с внешним механизмом хранения.
|
|
56
|
+
|
|
57
|
+
> Важно: Метод `ApiCache.init()` должен быть вызван на этапе запуска приложения (до первого API-запроса), чтобы гарантировать правильную конфигурацию кэша.
|
|
58
|
+
|
|
59
|
+
### Node.js (Произвольное хранилище)
|
|
60
|
+
|
|
61
|
+
В стандартной среде Node.js вы можете использовать слушателей для взаимодействия с централизованной базой данных или персистентным кэшем, таким как Redis.
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { ApiCache } from '@dxtmisha/functional-basic'
|
|
65
|
+
|
|
66
|
+
// Конфигурация со слушателями хранилища
|
|
67
|
+
ApiCache.init(
|
|
68
|
+
// 1. Получение данных из внешнего хранилища
|
|
69
|
+
async (key) => await myExternalStorage.get(key),
|
|
70
|
+
|
|
71
|
+
// 2. Сохранение данных во внешнее хранилище
|
|
72
|
+
async (key, value) => {
|
|
73
|
+
await myExternalStorage.put(key, value)
|
|
74
|
+
return true // Возвращаем true для подтверждения внешнего сохранения
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
// 3. Удаление данных из внешнего хранилища
|
|
78
|
+
async (key) => {
|
|
79
|
+
await myExternalStorage.delete(key)
|
|
80
|
+
return true
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
// 4. Опционально: порог срабатывания фоновой очистки
|
|
84
|
+
16384
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Nuxt / Nitro
|
|
89
|
+
|
|
90
|
+
В Nuxt/Nitro рекомендуемый подход — использование встроенного хелпера `useStorage` внутри серверного плагина. Это позволяет задействовать Redis, файловую систему или любой другой драйвер, поддерживаемый Nitro.
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// server/plugins/api-cache.ts
|
|
94
|
+
import { ApiCache } from '@dxtmisha/functional-basic'
|
|
95
|
+
|
|
96
|
+
export default defineNitroPlugin(() => {
|
|
97
|
+
const storage = useStorage('cache') // Регион кэша Nitro
|
|
98
|
+
|
|
99
|
+
ApiCache.init(
|
|
100
|
+
async (key) => await storage.getItem(key),
|
|
101
|
+
async (key, value) => {
|
|
102
|
+
await storage.setItem(key, value)
|
|
103
|
+
return true
|
|
104
|
+
},
|
|
105
|
+
async (key) => {
|
|
106
|
+
await storage.removeItem(key)
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
})
|
|
111
|
+
```
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/vi/functional-basic/Classes/ApiCache - Bộ nhớ đệm phản hồi API'/>
|
|
4
|
+
|
|
5
|
+
# Lớp ApiCache
|
|
6
|
+
|
|
7
|
+
Một lớp để lưu bộ nhớ đệm (caching) cho các phản hồi API. Nó cho phép lưu trữ kết quả truy vấn trong bộ nhớ hoặc kho lưu trữ bên ngoài, ngăn chặn các cuộc gọi mạng dư thừa trong một khoảng thời gian cụ thể. Trong phiên bản hiện tại, việc lưu bộ nhớ đệm chỉ hoạt động ở phía máy chủ (SSR) để tăng tốc độ hiển thị và giảm tải API trong quá trình xử lý nhiều yêu cầu đồng thời.
|
|
8
|
+
|
|
9
|
+
> `ApiCache` là một **lớp bổ trợ**, được thiết kế để quản lý bộ nhớ đệm ở cấp độ thấp. Trong hầu hết các trường hợp, bạn nên tương tác với việc lưu bộ nhớ đệm thông qua tham số `cache` trong `ApiInstance` hoặc đối tượng `Api` toàn cục.
|
|
10
|
+
|
|
11
|
+
## Các tính năng chính
|
|
12
|
+
|
|
13
|
+
- **Quản lý khóa tự động** — tạo các khóa cache duy nhất dựa trên các tham số yêu cầu (đường dẫn, phương thức, thân yêu cầu, v.v.).
|
|
14
|
+
- **TTL linh hoạt (Time To Live)** — cho phép thiết lập thời gian lưu trữ cho từng yêu cầu riêng lẻ hoặc sử dụng mặc định (24 giờ).
|
|
15
|
+
- **Tối ưu hóa SSR** — ngăn chặn các cuộc gọi API không cần thiết trong môi trường Node.js. Chế độ này mặc định bị tắt trong trình duyệt.
|
|
16
|
+
- **Hỗ trợ Bộ lắng nghe (Listener)** — khả năng kết nối kho lưu trữ bên ngoài (ví dụ: Redis, Nitro Storage) thông qua các hàm callback.
|
|
17
|
+
- **Dọn dẹp chạy ngầm** — tự động xóa các mục đã hết hạn khi truy cập bộ nhớ đệm.
|
|
18
|
+
|
|
19
|
+
## Các phương thức
|
|
20
|
+
|
|
21
|
+
### Hành động
|
|
22
|
+
|
|
23
|
+
Các phương thức để quản lý các mục lưu trữ trong cache.
|
|
24
|
+
|
|
25
|
+
- `get<T>(key: string): Promise<T | undefined>` — Lấy một giá trị từ cache.
|
|
26
|
+
- `getByFetch<T>(fetch: ApiFetch): Promise<T | undefined>` — Lấy một giá trị sử dụng các tùy chọn yêu cầu làm nguồn tạo khóa.
|
|
27
|
+
- `set<T>(key: string, value: T, age?: number): Promise<void>` — Lưu một giá trị vào cache.
|
|
28
|
+
- `setByFetch<T>(fetch: ApiFetch, value: T): Promise<void>` — Lưu một giá trị dựa trên các tùy chọn yêu cầu.
|
|
29
|
+
- `remove(key: string): Promise<void>` — Xóa một mục cache thủ công.
|
|
30
|
+
|
|
31
|
+
### Cấu hình
|
|
32
|
+
|
|
33
|
+
- `init(getListener, setListener, removeListener, cacheStepAgeClearOld?): void` — Cấu hình cache với các listener của bộ lưu trữ.
|
|
34
|
+
- `reset(): void` — Xóa các mục trong bộ nhớ RAM và ngắt kết nối các listener.
|
|
35
|
+
|
|
36
|
+
## Các kiểu dữ liệu
|
|
37
|
+
|
|
38
|
+
#### `ApiCacheItem<T>`
|
|
39
|
+
Cấu trúc của một bản ghi trong bộ nhớ đệm.
|
|
40
|
+
- `value: T` — Dữ liệu được lưu.
|
|
41
|
+
- `age: number` — TTL tính bằng giây.
|
|
42
|
+
- `cacheAge: number` — Dấu thời gian (ms) khi bản ghi được tạo.
|
|
43
|
+
|
|
44
|
+
#### `ApiCacheList`
|
|
45
|
+
Từ điển nội bộ dành cho việc lưu trữ dự phòng trong bộ nhớ RAM.
|
|
46
|
+
- `[key: string]: ApiCacheItem` — Các cặp khóa-giá trị của các mục được lưu vào bộ nhớ đệm.
|
|
47
|
+
|
|
48
|
+
## Khởi tạo và Kho lưu trữ bên ngoài
|
|
49
|
+
|
|
50
|
+
Theo mặc định, `ApiCache` lưu trữ các bản ghi trong RAM của tiến trình. Mặc dù cách này rất nhanh, nhưng nó có những hạn chế khi triển khai thực tế:
|
|
51
|
+
1. **Đồng bộ hóa trong cụм (Cluster)**: Trong thiết lập đa thực thể, bộ nhớ đệm không được chia sẻ giữa các tiến trình.
|
|
52
|
+
2. **Khởi động lại tiến trình**: Bộ nhớ sẽ bị xóa bất khi nào máy chủ khởi động lại hoặc có một "cold start" của các hàm serverless.
|
|
53
|
+
3. **Giới hạn bộ nhớ**: Lưu trữ lượng lớn dữ liệu trong RAM có thể dẫnถึง việc tiêu thụ bộ nhớ quá mức.
|
|
54
|
+
|
|
55
|
+
Để giải quyết những vấn đề này, bạn phải khởi tạo `ApiCache` bằng phương thức `init`, cung cấp các bộ lắng nghe (listeners) đóng vai trò cầu nối với cơ chế lưu trữ bên ngoài.
|
|
56
|
+
|
|
57
|
+
> Quan trọng: Bạn phải gọi `ApiCache.init()` trong giai đoạn khởi tạo ứng dụng (trước yêu cầu API đầu tiên) để đảm bảo bộ nhớ đệm được cấu hình chính xác.
|
|
58
|
+
|
|
59
|
+
### Node.js (Kho lưu trữ tùy chỉnh)
|
|
60
|
+
|
|
61
|
+
Trong môi trường Node.js tiêu chuẩn, bạn có thể sử dụng các bộ lắng nghe để tương tác với một cơ sở dữ liệu tập trung hoặc một bộ nhớ đệm bền vững như Redis.
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { ApiCache } from '@dxtmisha/functional-basic'
|
|
65
|
+
|
|
66
|
+
// Cấu hình với các bộ lắng nghe lưu trữ
|
|
67
|
+
ApiCache.init(
|
|
68
|
+
// 1. Lấy dữ liệu từ kho lưu trữ bên ngoài
|
|
69
|
+
async (key) => await myExternalStorage.get(key),
|
|
70
|
+
|
|
71
|
+
// 2. Lưu dữ liệu vào kho lưu trữ bên ngoài
|
|
72
|
+
async (key, value) => {
|
|
73
|
+
await myExternalStorage.put(key, value)
|
|
74
|
+
return true // Trả về true để xác nhận đã lưu trữ bên ngoài thành công
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
// 3. Xóa dữ liệu khỏi kho lưu trữ bên ngoài
|
|
78
|
+
async (key) => {
|
|
79
|
+
await myExternalStorage.delete(key)
|
|
80
|
+
return true
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
// 4. Tùy chọn: ngưỡng kích hoạt dọn dẹp chạy ngầm
|
|
84
|
+
16384
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Nuxt / Nitro
|
|
89
|
+
|
|
90
|
+
Trong Nuxt/Nitro, cách tiếp cận được khuyến nghị là sử dụng helper `useStorage` tích hợp sẵn bên trong một plugin máy chủ. Điều này cho phép bạn tận dụng Redis, FS, hoặc bất kỳ trình điều khiển lưu trữ nào khác được Nitro hỗ trợ.
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// server/plugins/api-cache.ts
|
|
94
|
+
import { ApiCache } from '@dxtmisha/functional-basic'
|
|
95
|
+
|
|
96
|
+
export default defineNitroPlugin(() => {
|
|
97
|
+
const storage = useStorage('cache') // Nitro Cache region
|
|
98
|
+
|
|
99
|
+
ApiCache.init(
|
|
100
|
+
async (key) => await storage.getItem(key),
|
|
101
|
+
async (key, value) => {
|
|
102
|
+
await storage.setItem(key, value)
|
|
103
|
+
return true
|
|
104
|
+
},
|
|
105
|
+
async (key) => {
|
|
106
|
+
await storage.removeItem(key)
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
})
|
|
111
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/en/functional-basic/Classes/ApiDataReturn - API Response Data Processing'/>
|
|
4
|
+
|
|
5
|
+
# ApiDataReturn Class
|
|
6
|
+
|
|
7
|
+
A class for handling and processing data received from an API request. It transforms raw response data into a structured format, extracts metadata, and maps content according to the requested configuration.
|
|
8
|
+
|
|
9
|
+
> `ApiDataReturn` is an **auxiliary class**, designed for handling and formatting API response data. In most cases, it is recommended to interact with results through the response returned by `ApiInstance` methods or the global `Api` object.
|
|
10
|
+
|
|
11
|
+
## Key Features
|
|
12
|
+
|
|
13
|
+
- **Automated Parsing** — intelligently parses JSON responses or returns raw text based on Content-Type headers.
|
|
14
|
+
- **Data Normalization** — ensures that the returned object follows a consistent structure, even if the server response varies.
|
|
15
|
+
- **Metadata Extraction** — automatically extracts common fields like `success`, `status`, `code`, and `message` from the root of the response and merges them into the data object.
|
|
16
|
+
- **Flexible Configuration** — supports custom processing logic via `queryReturn` and controls whether to unwrap the `data` field using `toData`.
|
|
17
|
+
|
|
18
|
+
## Methods
|
|
19
|
+
|
|
20
|
+
### Action
|
|
21
|
+
|
|
22
|
+
- `async init(): Promise<this>` — Initializes the class by reading and parsing data from the response object.
|
|
23
|
+
- `get(): ApiData<T>` — Returns the processed and formatted data.
|
|
24
|
+
- `getAndStatus(status: ApiStatus): ApiData<T>` — Returns the processed data injected with a `statusObject` from the provided status instance.
|
|
25
|
+
- `getData(): ApiData<T> | undefined` — Returns the raw, unformatted data as initially read from the response.
|
|
26
|
+
|
|
27
|
+
## Internal Logic (Protected)
|
|
28
|
+
|
|
29
|
+
- `readData<T>(): Promise<ApiData<T>>` — Low-level method that reads the response body and parses it as JSON or text.
|
|
30
|
+
- `initData(): ApiData<T>` — Formats the raw data according to configuration, handling property unwrapping.
|
|
31
|
+
- `initItem(data: Record<string, any>): ApiData<T>` — Merges metadata fields from the response root into the main data object.
|
|
32
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/ru/functional-basic/Classes/ApiDataReturn - Обработка данных ответа API'/>
|
|
4
|
+
|
|
5
|
+
# Класс ApiDataReturn
|
|
6
|
+
|
|
7
|
+
Класс для обработки и подготовки данных, полученных в результате запроса к API. Он преобразует необработанные данные ответа в структурированный формат, извлекает метаданные и сопоставляет содержимое в соответствии с запрошенной конфигурацией.
|
|
8
|
+
|
|
9
|
+
> `ApiDataReturn` является **вспомогательным классом**, предназначенным для обработки и форматирования данных ответа API. В большинстве случаев рекомендуется взаимодействовать с результатами через ответ, возвращаемый методами `ApiInstance` или глобальным объектом `Api`.
|
|
10
|
+
|
|
11
|
+
## Ключевые особенности
|
|
12
|
+
|
|
13
|
+
- **Автоматический парсинг** — интеллектуально анализирует JSON-ответы или возвращает необработанный текст на основе заголовков Content-Type.
|
|
14
|
+
- **Нормализация данных** — гарантирует, что возвращаемый объект соответствует согласованной структуре, даже если ответ сервера различается.
|
|
15
|
+
- **Извлечение метаданных** — автоматически извлекает общие поля, такие как `success`, `status`, `code` и `message`, из корня ответа и объединяет их с объектом данных.
|
|
16
|
+
- **Гибкая конфигурация** — поддерживает пользовательскую логику обработки через `queryReturn` и управляет развертыванием поля `data` с помощью `toData`.
|
|
17
|
+
|
|
18
|
+
## Методы
|
|
19
|
+
|
|
20
|
+
### Действие
|
|
21
|
+
|
|
22
|
+
- `async init(): Promise<this>` — Инициализирует класс, считывая и анализируя данные из объекта ответа.
|
|
23
|
+
- `get(): ApiData<T>` — Возвращает обработанные и отформатированные данные.
|
|
24
|
+
- `getAndStatus(status: ApiStatus): ApiData<T>` — Возвращает обработанные данные с внедренным объектом `statusObject` из предоставленного экземпляра статуса.
|
|
25
|
+
- `getData(): ApiData<T> | undefined` — Возвращает исходные, неотформатированные данные, как они были изначально считаны из ответа.
|
|
26
|
+
|
|
27
|
+
## Внутренняя логика (Protected)
|
|
28
|
+
|
|
29
|
+
- `readData<T>(): Promise<ApiData<T>>` — Низкоуровневый метод, который считывает тело ответа и парсит его как JSON или текст.
|
|
30
|
+
- `initData(): ApiData<T>` — Форматирует необработанные данные в соответствии с конфигурацией, обрабатывая развертывание свойств.
|
|
31
|
+
- `initItem(data: Record<string, any>): ApiData<T>` — Переносит поля метаданных из корня ответа в основной объект данных.
|
|
32
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/vi/functional-basic/Classes/ApiDataReturn - Xử lý dữ liệu phản hồi API'/>
|
|
4
|
+
|
|
5
|
+
# Lớp ApiDataReturn
|
|
6
|
+
|
|
7
|
+
Lớp dùng để xử lý và chuẩn bị dữ liệu nhận được từ yêu cầu API. Nó chuyển đổi dữ liệu phản hồi thô thành định dạng có cấu trúc, trích xuất metadata và ánh xạ nội dung theo cấu hình đã yêu cầu.
|
|
8
|
+
|
|
9
|
+
> `ApiDataReturn` là một **lớp phụ trợ**, được thiết kế để xử lý và định dạng dữ liệu phản hồi API. Trong hầu hết các trường hợp, khuyến khích tương tác với kết quả thông qua phản hồi được trả về bởi các phương thức của `ApiInstance` hoặc đối tượng `Api` toàn cục.
|
|
10
|
+
|
|
11
|
+
## Các tính năng chính
|
|
12
|
+
|
|
13
|
+
- **Phân tích tự động** — phân tích thông minh các phản hồi JSON hoặc trả về văn bản thô dựa trên tiêu đề Content-Type.
|
|
14
|
+
- **Chuẩn hóa dữ liệu** — đảm bảo rằng đối tượng trả về tuân theo một cấu trúc nhất quán, ngay cả khi phản hồi của máy chủ thay đổi.
|
|
15
|
+
- **Trích xuất Metadata** — tự động trích xuất các trường chung như `success`, `status`, `code` và `message` từ gốc của phản hồi và hợp nhất chúng vào đối tượng dữ liệu.
|
|
16
|
+
- **Cấu hình linh hoạt** — hỗ trợ logic xử lý tùy chỉnh thông qua `queryReturn` và kiểm soát việc giải nén trường `data` bằng `toData`.
|
|
17
|
+
|
|
18
|
+
## Các phương thức
|
|
19
|
+
|
|
20
|
+
### Hành động
|
|
21
|
+
|
|
22
|
+
- `async init(): Promise<this>` — Khởi tạo lớp bằng cách đọc và phân tích dữ liệu từ đối tượng phản hồi.
|
|
23
|
+
- `get(): ApiData<T>` — Trả về dữ liệu đã được xử lý và định dạng.
|
|
24
|
+
- `getAndStatus(status: ApiStatus): ApiData<T>` — Trả về dữ liệu đã xử lý được chèn thêm `statusObject` từ đối tượng status được cung cấp.
|
|
25
|
+
- `getData(): ApiData<T> | undefined` — Trả về dữ liệu thô, chưa định dạng như lúc ban đầu được đọc từ phản hồi.
|
|
26
|
+
|
|
27
|
+
## Logic nội bộ (Protected)
|
|
28
|
+
|
|
29
|
+
- `readData<T>(): Promise<ApiData<T>>` — Phương thức cấp thấp đọc thân phản hồi và phân tích nó dưới dạng JSON hoặc văn bản.
|
|
30
|
+
- `initData(): ApiData<T>` — Định dạng dữ liệu thô theo cấu hình, xử lý việc giải nén các thuộc tính.
|
|
31
|
+
- `initItem(data: Record<string, any>): ApiData<T>` — Hợp nhất các trường metadata từ gốc phản hồi vào đối tượng dữ liệu chính.
|
|
32
|
+
|
|
@@ -4,45 +4,41 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
4
4
|
|
|
5
5
|
# ApiDefault Class
|
|
6
6
|
|
|
7
|
-
A class for managing default data for API requests. It allows setting base parameters that should be included in every request, supporting both standard objects and `FormData`.
|
|
7
|
+
A class for managing default data for API requests. It allows setting base parameters that should be included in every request, supporting both standard objects and `FormData`. This is useful for centrally defining common fields such as tokens, application IDs, or localization settings.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
> `ApiDefault` is an **auxiliary class**, designed for managing request defaults. In most cases, it is recommended to define these through the `requestDefault` parameter in the global `Api` configuration.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
- **Support for Multiple Formats** — works seamlessly with both plain JavaScript objects and `FormData`.
|
|
13
|
-
- **Intelligent Merging** — merges defaults with request-specific data, prioritizing the actual request data if keys overlap.
|
|
14
|
-
- **Easy Checks** — simple methods to check if any default data is currently set.
|
|
11
|
+
## Key Features
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
- **Centralized Defaults** — Define common parameters once for all API calls.
|
|
14
|
+
- **Support for Multiple Formats** — Works seamlessly with both plain JavaScript objects and `FormData`.
|
|
15
|
+
- **Intelligent Merging** — Merges defaults with request-specific data, prioritizing the actual request data if keys overlap.
|
|
16
|
+
- **Chainable API** — Supports a fluent interface for setting parameters.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
## Methods
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
import { ApiDefault } from '@dxtmisha/functional'
|
|
20
|
+
### Action
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
const apiDefault = new ApiDefault()
|
|
22
|
+
#### `request`
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
apiDefault.set({ lang: 'en', version: 'v1' })
|
|
24
|
+
Merges the stored default data into a provided request object or `FormData` instance. If the input is a plain object, it returns a new merged object. If the input is `FormData`, it adds missing keys directly to the instance.
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const mergedRequest = apiDefault.request(requestData)
|
|
32
|
-
// Result: { lang: 'en', version: 'v1', user_id: 5 }
|
|
26
|
+
**Parameters:**
|
|
27
|
+
- `request: ApiFetch['request']` — The original request data (Object, FormData, or String).
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
const fd = new FormData()
|
|
36
|
-
fd.append('photo', fileBlob)
|
|
37
|
-
apiDefault.request(fd)
|
|
38
|
-
// Result: fd now contains 'lang' and 'version' if they were missing
|
|
39
|
-
```
|
|
29
|
+
**Returns:** `ApiFetch['request']` — The transformed request data.
|
|
40
30
|
|
|
41
|
-
|
|
31
|
+
### Check
|
|
42
32
|
|
|
43
33
|
- `is(): boolean` — Checks if any default data has been set.
|
|
44
|
-
- `get(): ApiDefaultValue` — Returns the current default data.
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
- `get(): ApiDefaultValue | undefined` — Returns the current default data object.
|
|
35
|
+
|
|
36
|
+
### Configuration
|
|
37
|
+
|
|
38
|
+
- `set(request: ApiDefaultValue): this` — Sets the default data for all future requests.
|
|
47
39
|
|
|
40
|
+
## Types
|
|
48
41
|
|
|
42
|
+
#### `ApiDefaultValue`
|
|
43
|
+
A plain object representing default parameters.
|
|
44
|
+
- `[key: string]: any` — Key-value pairs to be used as defaults.
|
|
@@ -4,45 +4,41 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
4
4
|
|
|
5
5
|
# Класс ApiDefault
|
|
6
6
|
|
|
7
|
-
Класс для управления данными по умолчанию для API-запросов. Он позволяет устанавливать базовые параметры, которые должны быть включены в каждый запрос, поддерживая как стандартные объекты, так и `FormData`.
|
|
7
|
+
Класс для управления данными по умолчанию для API-запросов. Он позволяет устанавливать базовые параметры, которые должны быть включены в каждый запрос, поддерживая как стандартные объекты, так и `FormData`. Это полезно для централизованного определения общих полей, таких как токены, ID приложения или настройки локализации.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
> `ApiDefault` является **вспомогательным классом**, предназначенным для управления значениями по умолчанию в запросах. В большинстве случаев рекомендуется определять их через параметр `requestDefault` в глобальной конфигурации `Api`.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
- **Поддержка различных форматов** — бесшовно работает как с обычными объектами JavaScript, так и с `FormData`.
|
|
13
|
-
- **Интеллектуальное слияние** — объединяет значения по умолчанию с данными конкретного запроса, отдавая приоритет данным запроса при совпадении ключей.
|
|
14
|
-
- **Простые проверки** — удобные методы для проверки наличия установленных данных по умолчанию.
|
|
11
|
+
## Ключевые особенности
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
- **Централизованные значения** — Определите общие параметры один раз для всех вызовов API.
|
|
14
|
+
- **Поддержка различных форматов** — Бесшовно работает как с обычными объектами JavaScript, так и с `FormData`.
|
|
15
|
+
- **Интеллектуальное слияние** — Объединяет значения по умолчанию с данными конкретного запроса, отдавая приоритет данным запроса при совпадении ключей.
|
|
16
|
+
- **Chainable API** — Поддерживает цепочку вызовов при установке параметров.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
## Методы
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
import { ApiDefault } from '@dxtmisha/functional'
|
|
20
|
+
### Действие
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
const apiDefault = new ApiDefault()
|
|
22
|
+
#### `request`
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
apiDefault.set({ lang: 'ru', version: 'v1' })
|
|
24
|
+
Объединяет сохраненные данные по умолчанию с предоставленным объектом запроса или экземпляром `FormData`. Если входные данные являются объектом, метод возвращает новый объединенный объект. Если входные данные — `FormData`, недостающие ключи добавляются напрямую в экземпляр.
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const mergedRequest = apiDefault.request(requestData)
|
|
32
|
-
// Результат: { lang: 'ru', version: 'v1', user_id: 5 }
|
|
26
|
+
**Параметры:**
|
|
27
|
+
- `request: ApiFetch['request']` — Исходные данные запроса (Object, FormData или String).
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
const fd = new FormData()
|
|
36
|
-
fd.append('photo', fileBlob)
|
|
37
|
-
apiDefault.request(fd)
|
|
38
|
-
// Результат: fd теперь содержит 'lang' и 'version', если они отсутствовали
|
|
39
|
-
```
|
|
29
|
+
**Возвращает:** `ApiFetch['request']` — Трансформированные данные запроса.
|
|
40
30
|
|
|
41
|
-
|
|
31
|
+
### Проверка
|
|
42
32
|
|
|
43
33
|
- `is(): boolean` — Проверяет, были ли установлены какие-либо данные по умолчанию.
|
|
44
|
-
- `get(): ApiDefaultValue` — Возвращает
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
- `get(): ApiDefaultValue | undefined` — Возвращает текущий объект данных по умолчанию.
|
|
35
|
+
|
|
36
|
+
### Конфигурация
|
|
37
|
+
|
|
38
|
+
- `set(request: ApiDefaultValue): this` — Устанавливает данные по умолчанию для всех будущих запросов.
|
|
47
39
|
|
|
40
|
+
## Типы
|
|
48
41
|
|
|
42
|
+
#### `ApiDefaultValue`
|
|
43
|
+
Обычный объект, представляющий параметры по умолчанию.
|
|
44
|
+
- `[key: string]: any` — Пары ключе-значение, используемые по умолчанию.
|