@itd-api/cache 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -18
- package/dist/index.cjs +790 -696
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -256
- package/dist/index.d.ts +167 -256
- package/dist/index.js +786 -691
- package/dist/index.js.map +1 -1
- package/package.json +11 -10
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/key.ts","../src/mutations.ts","../src/routes.ts","../src/plugin.ts"],"names":["LRUCache"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Ошибка настройки или использования плагина кэша. */\nexport class CacheError extends Error {\n override readonly name = 'CacheError';\n}\n","import type { RawRequestOptions } from 'itd-api';\nimport type { CacheRouteId } from './routes.js';\n\nconst OMITTED_FIELDS = new Set([\n 'method',\n 'path',\n 'service',\n 'baseUrl',\n 'query',\n 'body',\n 'headers',\n 'raw',\n 'skipAuth',\n 'signal',\n 'timeout',\n 'retry',\n 'skipQueue',\n 'skipAuthRefresh',\n 'cache',\n]);\n\n/** Строка query в том же порядке и с теми же правилами, что использует itd-api. */\nfunction queryKey(query: RawRequestOptions['query']): string {\n if (!query) return '';\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) search.append(key, String(item));\n } else {\n search.append(key, String(value));\n }\n }\n\n return search.toString();\n}\n\n/**\n * Собирает ключ из значений, влияющих на адрес, тело или разобранный ответ.\n *\n * Заголовки и транспортные опции намеренно не входят. Если тело либо опция другого\n * плагина не сериализуются как JSON, запрос выполняется без кэша.\n */\nexport function buildCacheKey(route: CacheRouteId, request: RawRequestOptions): string | undefined {\n const extras: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(request)) {\n if (!OMITTED_FIELDS.has(key) && value !== undefined) extras[key] = value;\n }\n\n try {\n return JSON.stringify({\n route,\n method: request.method.toUpperCase(),\n service: request.service ?? null,\n baseUrl: request.baseUrl ?? null,\n path: request.path,\n query: queryKey(request.query),\n body: request.body ?? null,\n raw: request.raw ?? false,\n skipAuth: request.skipAuth ?? null,\n extras,\n });\n } catch {\n return undefined;\n }\n}\n","import type { CacheRouteId } from './routes.js';\n\nexport type MutationInvalidation = readonly CacheRouteId[] | 'all';\n\nexport interface CacheMutation {\n method: string;\n path: RegExp;\n invalidates: MutationInvalidation;\n /** По умолчанию зависимые маршруты удаляются у всех аккаунтов общего экземпляра. */\n scope?: 'account' | undefined;\n}\n\nconst POST_CONTENT = [\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n 'posts.likedByUser',\n 'posts.comments',\n 'posts.stats',\n 'comments.replies',\n 'hashtags.search',\n 'hashtags.trending',\n 'hashtags.posts',\n 'search.all',\n 'users.me',\n 'users.get',\n 'users.pins',\n] as const satisfies readonly CacheRouteId[];\n\nconst POST_REACTIONS = [\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n 'posts.likedByUser',\n 'posts.stats',\n 'hashtags.posts',\n 'search.all',\n] as const satisfies readonly CacheRouteId[];\n\nconst COMMENTS = [\n 'posts.list',\n 'posts.get',\n 'posts.comments',\n 'posts.stats',\n 'comments.replies',\n 'hashtags.posts',\n 'search.all',\n] as const satisfies readonly CacheRouteId[];\n\nconst PROFILE = [\n 'users.me',\n 'users.get',\n 'users.checkUsername',\n 'users.search',\n 'users.whoToFollow',\n 'users.topClans',\n 'users.followers',\n 'users.following',\n 'users.blocked',\n 'users.getPrivacy',\n 'users.pins',\n 'users.followStatus',\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n 'posts.likedByUser',\n 'posts.comments',\n 'comments.replies',\n 'hashtags.posts',\n 'search.all',\n] as const satisfies readonly CacheRouteId[];\n\nconst FOLLOWING = [\n 'users.me',\n 'users.get',\n 'users.search',\n 'users.whoToFollow',\n 'users.followers',\n 'users.following',\n 'users.followStatus',\n 'posts.list',\n 'posts.byUser',\n 'search.all',\n] as const satisfies readonly CacheRouteId[];\n\nconst BLOCKS = [\n 'users.me',\n 'users.get',\n 'users.search',\n 'users.whoToFollow',\n 'users.followers',\n 'users.following',\n 'users.blocked',\n 'users.followStatus',\n 'posts.list',\n 'search.all',\n] as const satisfies readonly CacheRouteId[];\n\nconst PINS = [\n 'users.me',\n 'users.get',\n 'users.pins',\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n] as const satisfies readonly CacheRouteId[];\n\nconst NOTIFICATIONS = [\n 'notifications.list',\n 'notifications.count',\n] as const satisfies readonly CacheRouteId[];\n\nconst SUBSCRIPTION = [\n 'subscription.status',\n 'subscription.methods',\n] as const satisfies readonly CacheRouteId[];\n\nconst NOTHING = [] as const satisfies readonly CacheRouteId[];\n\n/**\n * Известные изменяющие запросы и читающие маршруты, чьи ответы они могут изменить.\n *\n * Каталог намеренно консервативен: лучше удалить несколько связанных списков, чем оставить\n * персонализированное поле или вложенный объект устаревшим.\n */\nconst CACHE_MUTATIONS = Object.freeze([\n // Авторизация и сессии.\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/refresh$/, invalidates: NOTHING },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/resend-otp$/, invalidates: NOTHING },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/forgot-password$/, invalidates: NOTHING },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/sign-up$/, invalidates: 'all' },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/sign-in$/, invalidates: 'all' },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/verify-otp$/, invalidates: 'all' },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/logout$/, invalidates: 'all' },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/reset-password$/, invalidates: 'all' },\n { method: 'POST', path: /^\\/api\\/v1\\/auth\\/change-password$/, invalidates: 'all' },\n {\n method: 'DELETE',\n path: /^\\/api\\/v1\\/auth\\/sessions(?:\\/[^/]+)?$/,\n invalidates: ['auth.sessions'],\n scope: 'account',\n },\n\n // Посты и комментарии.\n { method: 'POST', path: /^\\/api\\/posts$/, invalidates: POST_CONTENT },\n { method: 'PUT', path: /^\\/api\\/posts\\/[^/]+$/, invalidates: POST_CONTENT },\n { method: 'DELETE', path: /^\\/api\\/posts\\/[^/]+$/, invalidates: POST_CONTENT },\n { method: 'POST', path: /^\\/api\\/posts\\/[^/]+\\/restore$/, invalidates: POST_CONTENT },\n { method: 'POST', path: /^\\/api\\/posts\\/[^/]+\\/like$/, invalidates: POST_REACTIONS },\n { method: 'DELETE', path: /^\\/api\\/posts\\/[^/]+\\/like$/, invalidates: POST_REACTIONS },\n { method: 'POST', path: /^\\/api\\/posts\\/[^/]+\\/repost$/, invalidates: POST_CONTENT },\n { method: 'DELETE', path: /^\\/api\\/posts\\/[^/]+\\/repost$/, invalidates: POST_CONTENT },\n { method: 'POST', path: /^\\/api\\/posts\\/[^/]+\\/pin$/, invalidates: PINS },\n { method: 'DELETE', path: /^\\/api\\/posts\\/[^/]+\\/pin$/, invalidates: PINS },\n { method: 'POST', path: /^\\/api\\/posts\\/[^/]+\\/poll\\/vote$/, invalidates: POST_REACTIONS },\n { method: 'POST', path: /^\\/api\\/posts\\/[^/]+\\/comments$/, invalidates: COMMENTS },\n { method: 'POST', path: /^\\/api\\/comments\\/[^/]+\\/replies$/, invalidates: COMMENTS },\n { method: 'PATCH', path: /^\\/api\\/comments\\/[^/]+$/, invalidates: COMMENTS },\n { method: 'DELETE', path: /^\\/api\\/comments\\/[^/]+$/, invalidates: COMMENTS },\n { method: 'POST', path: /^\\/api\\/comments\\/[^/]+\\/restore$/, invalidates: COMMENTS },\n { method: 'POST', path: /^\\/api\\/comments\\/[^/]+\\/like$/, invalidates: COMMENTS },\n { method: 'DELETE', path: /^\\/api\\/comments\\/[^/]+\\/like$/, invalidates: COMMENTS },\n\n // Профиль и связи между пользователями.\n { method: 'PUT', path: /^\\/api\\/users\\/me$/, invalidates: PROFILE },\n { method: 'DELETE', path: /^\\/api\\/users\\/me$/, invalidates: PROFILE },\n { method: 'POST', path: /^\\/api\\/users\\/me\\/restore$/, invalidates: PROFILE },\n { method: 'POST', path: /^\\/api\\/users\\/profile$/, invalidates: PROFILE },\n { method: 'POST', path: /^\\/api\\/users\\/[^/]+\\/follow$/, invalidates: FOLLOWING },\n { method: 'DELETE', path: /^\\/api\\/users\\/[^/]+\\/follow$/, invalidates: FOLLOWING },\n { method: 'POST', path: /^\\/api\\/users\\/[^/]+\\/block$/, invalidates: BLOCKS },\n { method: 'DELETE', path: /^\\/api\\/users\\/[^/]+\\/block$/, invalidates: BLOCKS },\n {\n method: 'PUT',\n path: /^\\/api\\/users\\/me\\/privacy$/,\n invalidates: ['users.me', 'users.get', 'users.getPrivacy'],\n },\n { method: 'PUT', path: /^\\/api\\/users\\/me\\/pin$/, invalidates: PINS },\n { method: 'DELETE', path: /^\\/api\\/users\\/me\\/pin$/, invalidates: PINS },\n\n // Уведомления.\n {\n method: 'POST',\n path: /^\\/api\\/notifications\\/(?:[^/]+\\/read|read-batch|read-all)$/,\n invalidates: NOTIFICATIONS,\n scope: 'account',\n },\n {\n method: 'PUT',\n path: /^\\/api\\/notifications\\/settings$/,\n invalidates: ['notifications.getSettings'],\n scope: 'account',\n },\n\n // Файлы и настройки аккаунта.\n { method: 'POST', path: /^\\/api\\/files\\/upload$/, invalidates: NOTHING },\n {\n method: 'DELETE',\n path: /^\\/api\\/files\\/[^/]+$/,\n invalidates: ['files.get', ...POST_CONTENT],\n },\n {\n method: 'POST',\n path: /^\\/api\\/verification\\/submit$/,\n invalidates: ['verification.status'],\n scope: 'account',\n },\n {\n method: 'POST',\n path: /^\\/api\\/v1\\/subscription\\/pay$/,\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n method: 'POST',\n path: /^\\/api\\/v1\\/subscription\\/auto-renewal$/,\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n method: 'POST',\n path: /^\\/api\\/v1\\/subscription\\/bind-card$/,\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n method: 'POST',\n path: /^\\/api\\/v1\\/subscription\\/methods\\/[^/]+\\/default$/,\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n method: 'DELETE',\n path: /^\\/api\\/v1\\/subscription\\/methods\\/[^/]+$/,\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n\n // Эти запросы не меняют ни один доступный для кэширования ответ.\n { method: 'POST', path: /^\\/api\\/reports$/, invalidates: NOTHING },\n { method: 'POST', path: /^\\/api\\/v1\\/[ix]$/, invalidates: NOTHING },\n] as const satisfies readonly CacheMutation[]);\n\n/** Находит известную мутацию по HTTP-методу и пути. */\nexport function cacheMutation(method: string, path: string): CacheMutation | undefined {\n const normalized = method.toUpperCase();\n return CACHE_MUTATIONS.find(\n (mutation) => mutation.method === normalized && mutation.path.test(path),\n );\n}\n","/** Описание читающего маршрута itd-api. */\nexport interface CacheRoute {\n /** Публичное имя для настройки плагина. */\n id: string;\n /** Раздел клиента. */\n category: string;\n /** HTTP-метод маршрута. */\n method: string;\n /** Путь без query и базового URL. */\n path: RegExp;\n}\n\n/**\n * Читающие маршруты, которые можно кэшировать.\n *\n * Порядок значим: точные служебные пути стоят перед динамическими маршрутами.\n */\nexport const CACHE_ROUTES = Object.freeze([\n { id: 'auth.sessions', category: 'auth', method: 'GET', path: /^\\/api\\/v1\\/auth\\/sessions$/ },\n\n { id: 'users.me', category: 'users', method: 'GET', path: /^\\/api\\/users\\/me$/ },\n {\n id: 'users.checkUsername',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/check-username$/,\n },\n { id: 'users.search', category: 'users', method: 'GET', path: /^\\/api\\/users\\/search$/ },\n {\n id: 'users.whoToFollow',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/suggestions\\/who-to-follow$/,\n },\n {\n id: 'users.topClans',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/stats\\/top-clans$/,\n },\n {\n id: 'users.followers',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/[^/]+\\/followers$/,\n },\n {\n id: 'users.following',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/[^/]+\\/following$/,\n },\n {\n id: 'users.blocked',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/me\\/blocked$/,\n },\n {\n id: 'users.getPrivacy',\n category: 'users',\n method: 'GET',\n path: /^\\/api\\/users\\/me\\/privacy$/,\n },\n { id: 'users.pins', category: 'users', method: 'GET', path: /^\\/api\\/users\\/me\\/pins$/ },\n {\n id: 'users.followStatus',\n category: 'users',\n method: 'POST',\n path: /^\\/api\\/users\\/follow-status$/,\n },\n { id: 'users.get', category: 'users', method: 'GET', path: /^\\/api\\/users\\/[^/]+$/ },\n\n { id: 'posts.list', category: 'posts', method: 'GET', path: /^\\/api\\/posts$/ },\n {\n id: 'posts.likedByUser',\n category: 'posts',\n method: 'GET',\n path: /^\\/api\\/posts\\/user\\/[^/]+\\/liked$/,\n },\n {\n id: 'posts.byUser',\n category: 'posts',\n method: 'GET',\n path: /^\\/api\\/posts\\/user\\/[^/]+$/,\n },\n {\n id: 'posts.comments',\n category: 'posts',\n method: 'GET',\n path: /^\\/api\\/posts\\/[^/]+\\/comments$/,\n },\n { id: 'posts.stats', category: 'posts', method: 'POST', path: /^\\/api\\/posts\\/stats$/ },\n { id: 'posts.get', category: 'posts', method: 'GET', path: /^\\/api\\/posts\\/[^/]+$/ },\n\n {\n id: 'comments.replies',\n category: 'comments',\n method: 'GET',\n path: /^\\/api\\/comments\\/[^/]+\\/replies$/,\n },\n\n {\n id: 'notifications.list',\n category: 'notifications',\n method: 'GET',\n path: /^\\/api\\/notifications\\/$/,\n },\n {\n id: 'notifications.count',\n category: 'notifications',\n method: 'GET',\n path: /^\\/api\\/notifications\\/count$/,\n },\n {\n id: 'notifications.getSettings',\n category: 'notifications',\n method: 'GET',\n path: /^\\/api\\/notifications\\/settings$/,\n },\n\n {\n id: 'hashtags.search',\n category: 'hashtags',\n method: 'GET',\n path: /^\\/api\\/hashtags$/,\n },\n {\n id: 'hashtags.trending',\n category: 'hashtags',\n method: 'GET',\n path: /^\\/api\\/hashtags\\/trending$/,\n },\n {\n id: 'hashtags.posts',\n category: 'hashtags',\n method: 'GET',\n path: /^\\/api\\/hashtags\\/[^/]+\\/posts$/,\n },\n\n { id: 'search.all', category: 'search', method: 'GET', path: /^\\/api\\/search$/ },\n { id: 'files.get', category: 'files', method: 'GET', path: /^\\/api\\/files\\/[^/]+$/ },\n\n {\n id: 'subscription.status',\n category: 'subscription',\n method: 'GET',\n path: /^\\/api\\/v1\\/subscription\\/$/,\n },\n {\n id: 'subscription.methods',\n category: 'subscription',\n method: 'GET',\n path: /^\\/api\\/v1\\/subscription\\/methods$/,\n },\n {\n id: 'verification.status',\n category: 'verification',\n method: 'GET',\n path: /^\\/api\\/verification\\/status$/,\n },\n\n {\n id: 'platform.changelog',\n category: 'platform',\n method: 'GET',\n path: /^\\/api\\/platform\\/changelog$/,\n },\n {\n id: 'platform.announcements',\n category: 'platform',\n method: 'GET',\n path: /^\\/api\\/platform\\/announcements$/,\n },\n { id: 'platform.portal', category: 'platform', method: 'GET', path: /^\\/api\\/v1\\/portal$/ },\n { id: 'platform.status', category: 'platform', method: 'GET', path: /^\\/api\\/status$/ },\n] as const satisfies readonly CacheRoute[]);\n\n/** Имя маршрута, доступное в `cache({ routes: … })`. */\nexport type CacheRouteId = (typeof CACHE_ROUTES)[number]['id'];\n\n/** Раздел маршрута. */\nexport type CacheRouteCategory = (typeof CACHE_ROUTES)[number]['category'];\n\nconst ROUTE_IDS: ReadonlySet<string> = new Set(CACHE_ROUTES.map((route) => route.id));\n\n/** Проверяет публичное имя маршрута. */\nexport function isCacheRouteId(value: string): value is CacheRouteId {\n return ROUTE_IDS.has(value);\n}\n\n/** Находит читающий маршрут по HTTP-методу и пути. */\nexport function cacheRoute(\n method: string,\n path: string,\n): (typeof CACHE_ROUTES)[number] | undefined {\n const normalized = method.toUpperCase();\n return CACHE_ROUTES.find((route) => route.method === normalized && route.path.test(path));\n}\n","import type {\n AuthIdentity,\n ItdPlugin,\n ItdRealtime,\n RawRequestOptions,\n Transformer,\n Unsubscribe,\n} from 'itd-api';\nimport { LRUCache } from 'lru-cache';\nimport { CacheError } from './errors.js';\nimport { buildCacheKey } from './key.js';\nimport { type CacheMutation, cacheMutation } from './mutations.js';\nimport { type CacheRouteId, cacheRoute, isCacheRouteId } from './routes.js';\n\n/** Режимы кэширования отдельного запроса. */\nexport const CacheModes = Object.freeze({\n /** Отдать свежий кэш, иначе выполнить запрос и сохранить ответ. */\n Default: 'default',\n /** Пропустить сохранённое значение, выполнить запрос и перезаписать кэш. */\n Reload: 'reload',\n /** Не читать и не писать кэш для этого запроса. */\n NoStore: 'no-store',\n} as const);\n\n/** Поведение кэша для отдельного запроса. */\nexport type CacheMode = (typeof CacheModes)[keyof typeof CacheModes];\n\n/** Настройки плагина. */\nexport interface CacheOptions {\n /** Сколько миллисекунд хранить успешный ответ. */\n ttl: number;\n /** Какие операции itd-api кэшировать. */\n routes: readonly CacheRouteId[];\n /** Максимальное количество ответов. По умолчанию 500. */\n maxEntries?: number | undefined;\n /** Объединять ли одновременные одинаковые запросы. По умолчанию `true`. */\n deduplicate?: boolean | undefined;\n}\n\n/** Плагин и управление созданным им хранилищем. */\nexport interface CachePlugin extends ItdPlugin {\n /** Количество готовых ответов во всех разделах кэша. */\n readonly size: number;\n /** Удаляет все ответы и не даёт выполняющимся запросам вернуть устаревший результат. */\n clear(): void;\n /** Удаляет все варианты названных маршрутов во всех подключённых клиентах. */\n invalidate(...routes: CacheRouteId[]): void;\n /**\n * Очищает список и счётчик уведомлений по событиям realtime.\n *\n * Сразу удаляет прежние значения и возвращает функцию отписки.\n */\n attachRealtime(stream: ItdRealtime): Unsubscribe;\n}\n\ninterface CacheEntry {\n accountScope: string;\n route: CacheRouteId;\n value: unknown;\n}\n\ninterface LoadedValue {\n cacheable: boolean;\n value: unknown;\n}\n\ninterface CacheIdentity {\n accountScope: string;\n sessionScope: string;\n}\n\ninterface PendingEntry {\n accountScope: string;\n route: CacheRouteId;\n promise: Promise<LoadedValue>;\n}\n\ninterface KeyState {\n active: number;\n generation: number;\n}\n\ntype CacheRequest = RawRequestOptions & { cache?: CacheMode | undefined };\n\nconst DEFAULT_MAX_ENTRIES = 500;\nconst CACHE_MODES: ReadonlySet<string> = new Set(Object.values(CacheModes));\n\nfunction assertPositive(value: number, name: string, integer = false): void {\n if (!Number.isFinite(value) || value <= 0 || (integer && !Number.isInteger(value))) {\n throw new CacheError(\n `${name} должен быть ${integer ? 'целым ' : ''}положительным числом, получено: ${value}`,\n );\n }\n}\n\nfunction resolveOptions(options: CacheOptions): {\n ttl: number;\n routes: ReadonlySet<CacheRouteId>;\n maxEntries: number;\n deduplicate: boolean;\n} {\n if (!options || typeof options !== 'object') {\n throw new CacheError('cache() принимает объект настроек');\n }\n\n assertPositive(options.ttl, 'cache.ttl');\n\n if (!Array.isArray(options.routes) || options.routes.length === 0) {\n throw new CacheError('cache.routes должен содержать хотя бы один маршрут');\n }\n\n const routes = new Set<CacheRouteId>();\n for (const route of options.routes as readonly string[]) {\n if (typeof route !== 'string' || !isCacheRouteId(route)) {\n throw new CacheError(`Неизвестный маршрут кэша: ${JSON.stringify(route)}`);\n }\n routes.add(route);\n }\n\n const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n assertPositive(maxEntries, 'cache.maxEntries', true);\n\n const deduplicate = options.deduplicate ?? true;\n if (typeof deduplicate !== 'boolean') {\n throw new CacheError(`cache.deduplicate должен быть boolean, получено: ${deduplicate}`);\n }\n\n return { ttl: options.ttl, routes, maxEntries, deduplicate };\n}\n\nfunction cloneValue(value: unknown): LoadedValue {\n try {\n return { cacheable: true, value: structuredClone(value) };\n } catch {\n return { cacheable: false, value };\n }\n}\n\nfunction cacheMode(request: CacheRequest): CacheMode {\n const mode = request.cache ?? CacheModes.Default;\n if (!CACHE_MODES.has(mode)) {\n throw new CacheError(\n `cache должен быть '${CacheModes.Default}', '${CacheModes.Reload}' или '${CacheModes.NoStore}', получено: ${String(mode)}`,\n );\n }\n return mode;\n}\n\n/** Создаёт TTL/LRU-кэш разобранных ответов itd-api. */\nexport function cache(options: CacheOptions): CachePlugin {\n const config = resolveOptions(options);\n const values = new LRUCache<string, CacheEntry>({\n max: config.maxEntries,\n ttl: config.ttl,\n updateAgeOnGet: false,\n allowStale: false,\n });\n const pending = new Map<string, PendingEntry>();\n const routeGenerations = new Map<CacheRouteId, number>();\n const scopeGenerations = new Map<string, number>();\n const scopeRouteGenerations = new Map<string, number>();\n const keyStates = new Map<string, KeyState>();\n let generation = 0;\n let installationSequence = 0;\n\n const scopeRouteKey = (accountScope: string, route: CacheRouteId): string =>\n JSON.stringify([accountScope, route]);\n\n const clear = (): void => {\n generation += 1;\n values.clear();\n pending.clear();\n };\n\n const invalidate = (...routes: CacheRouteId[]): void => {\n if (routes.length === 0) return;\n\n const selected = new Set<CacheRouteId>();\n for (const route of routes as readonly string[]) {\n if (!isCacheRouteId(route)) {\n throw new CacheError(`Неизвестный маршрут кэша: ${JSON.stringify(route)}`);\n }\n selected.add(route);\n routeGenerations.set(route, (routeGenerations.get(route) ?? 0) + 1);\n }\n\n for (const [key, entry] of values.entries()) {\n if (selected.has(entry.route)) values.delete(key);\n }\n for (const [key, entry] of pending) {\n if (selected.has(entry.route)) pending.delete(key);\n }\n };\n\n const clearScope = (accountScope: string): void => {\n scopeGenerations.set(accountScope, (scopeGenerations.get(accountScope) ?? 0) + 1);\n\n for (const [key, entry] of values.entries()) {\n if (entry.accountScope === accountScope) values.delete(key);\n }\n for (const [key, entry] of pending) {\n if (entry.accountScope === accountScope) pending.delete(key);\n }\n };\n\n const invalidateScope = (accountScope: string, routes: readonly CacheRouteId[]): void => {\n if (routes.length === 0) return;\n\n const selected = new Set(routes);\n for (const route of selected) {\n const key = scopeRouteKey(accountScope, route);\n scopeRouteGenerations.set(key, (scopeRouteGenerations.get(key) ?? 0) + 1);\n }\n\n for (const [key, entry] of values.entries()) {\n if (entry.accountScope === accountScope && selected.has(entry.route)) values.delete(key);\n }\n for (const [key, entry] of pending) {\n if (entry.accountScope === accountScope && selected.has(entry.route)) pending.delete(key);\n }\n };\n\n const applyMutation = (accountScope: string, mutation: CacheMutation): void => {\n if (mutation.invalidates === 'all') {\n clearScope(accountScope);\n } else if (mutation.scope === 'account') {\n invalidateScope(accountScope, mutation.invalidates);\n } else {\n invalidate(...mutation.invalidates);\n }\n };\n\n const createTransformer = (\n installation: number,\n baseUrl: string,\n getAuthIdentity: (() => Promise<AuthIdentity>) | undefined,\n getAuthScope: (() => string) | undefined,\n ): Transformer => {\n const fallbackAuthScope = JSON.stringify([baseUrl, `installation:${installation}`]);\n\n const resolveIdentity = async (): Promise<CacheIdentity> => {\n const identity = await getAuthIdentity?.();\n const accountScope = identity?.userId\n ? JSON.stringify([baseUrl, identity.userId])\n : getAuthScope\n ? JSON.stringify([baseUrl, getAuthScope()])\n : fallbackAuthScope;\n const sessionScope =\n identity?.userId && identity.sessionId\n ? JSON.stringify([baseUrl, identity.userId, identity.sessionId])\n : JSON.stringify([\n accountScope,\n getAuthScope ? getAuthScope() : `installation:${installation}`,\n ]);\n return { accountScope, sessionScope };\n };\n\n return async (rawRequest, next) => {\n const request = rawRequest as CacheRequest;\n const route = cacheRoute(request.method, request.path);\n const method = request.method.toUpperCase();\n const isRead = route !== undefined || method === 'GET' || method === 'HEAD';\n\n if (!isRead) {\n const mutation = cacheMutation(method, request.path);\n const startedIdentity = mutation ? await resolveIdentity() : undefined;\n const result = await next(request);\n if (mutation && startedIdentity) {\n applyMutation(startedIdentity.accountScope, mutation);\n const currentIdentity = await resolveIdentity();\n if (\n currentIdentity.accountScope !== startedIdentity.accountScope &&\n (mutation.invalidates === 'all' || mutation.scope === 'account')\n ) {\n applyMutation(currentIdentity.accountScope, mutation);\n }\n } else {\n clear();\n }\n return result;\n }\n\n if (!route || !config.routes.has(route.id)) return next(request);\n\n const mode = cacheMode(request);\n if (mode === CacheModes.NoStore) return next(request);\n\n const unscopedKey = buildCacheKey(route.id, request);\n if (unscopedKey === undefined) return next(request);\n\n const identity = await resolveIdentity();\n const scope = route.id === 'auth.sessions' ? identity.sessionScope : identity.accountScope;\n const key = JSON.stringify([scope, unscopedKey]);\n\n if (mode === CacheModes.Reload) {\n // Прежняя загрузка только этого ключа не должна перезаписать принудительное обновление.\n const state = keyStates.get(key) ?? {\n active: 0,\n generation: 0,\n };\n state.generation += 1;\n keyStates.set(key, state);\n values.delete(key);\n pending.delete(key);\n }\n\n if (mode === CacheModes.Default) {\n const hit = values.get(key);\n if (hit) {\n const cloned = cloneValue(hit.value);\n if (cloned.cacheable) return cloned.value;\n values.delete(key);\n }\n\n const existing = pending.get(key);\n if (\n config.deduplicate &&\n request.signal === undefined &&\n request.timeout === undefined &&\n existing\n ) {\n const loaded = await existing.promise;\n return cloneValue(loaded.value).value;\n }\n }\n\n const startedGeneration = generation;\n const startedScopeGeneration = scopeGenerations.get(identity.accountScope) ?? 0;\n const startedRouteGeneration = routeGenerations.get(route.id) ?? 0;\n const scopedRouteKey = scopeRouteKey(identity.accountScope, route.id);\n const startedScopeRouteGeneration = scopeRouteGenerations.get(scopedRouteKey) ?? 0;\n const keyState = keyStates.get(key) ?? {\n active: 0,\n generation: 0,\n };\n keyState.active += 1;\n keyStates.set(key, keyState);\n const startedKeyGeneration = keyState.generation;\n const load = (async (): Promise<LoadedValue> => {\n try {\n const result = await next(request);\n const stored = cloneValue(result);\n const currentIdentity = await resolveIdentity();\n const currentScope =\n route.id === 'auth.sessions'\n ? currentIdentity.sessionScope\n : currentIdentity.accountScope;\n\n if (\n stored.cacheable &&\n currentScope === scope &&\n generation === startedGeneration &&\n (scopeGenerations.get(identity.accountScope) ?? 0) === startedScopeGeneration &&\n (routeGenerations.get(route.id) ?? 0) === startedRouteGeneration &&\n (scopeRouteGenerations.get(scopedRouteKey) ?? 0) === startedScopeRouteGeneration &&\n keyState.generation === startedKeyGeneration\n ) {\n values.set(key, {\n accountScope: identity.accountScope,\n route: route.id,\n value: stored.value,\n });\n }\n\n // Снимок уже отделён для кэша; инициатор получает независимый исходный ответ сети.\n return { cacheable: stored.cacheable, value: result };\n } finally {\n keyState.active -= 1;\n if (keyState.active === 0 && keyStates.get(key) === keyState) keyStates.delete(key);\n }\n })();\n\n const mayDeduplicate =\n mode === CacheModes.Default &&\n config.deduplicate &&\n request.signal === undefined &&\n request.timeout === undefined;\n const entry: PendingEntry = {\n accountScope: identity.accountScope,\n route: route.id,\n promise: load,\n };\n if (mayDeduplicate) pending.set(key, entry);\n\n try {\n const loaded = await load;\n return loaded.value;\n } finally {\n if (pending.get(key) === entry) pending.delete(key);\n }\n };\n };\n\n return {\n name: 'cache',\n optionKeys: ['cache'],\n get size() {\n values.purgeStale();\n return values.size;\n },\n clear,\n invalidate,\n attachRealtime(stream) {\n if (!stream || typeof stream.on !== 'function') {\n throw new CacheError('attachRealtime() принимает поток из itd.realtime()');\n }\n\n const invalidateStream = (...routes: CacheRouteId[]): void => {\n const identity =\n typeof stream.getAuthIdentity === 'function' ? stream.getAuthIdentity() : undefined;\n const streamBaseUrl =\n typeof stream.baseUrl === 'string' && stream.baseUrl.length > 0\n ? stream.baseUrl\n : undefined;\n const legacyScope =\n typeof stream.getAuthScope === 'function' ? stream.getAuthScope() : undefined;\n const accountScope =\n identity?.userId && streamBaseUrl\n ? JSON.stringify([streamBaseUrl, identity.userId])\n : legacyScope !== undefined && streamBaseUrl\n ? JSON.stringify([streamBaseUrl, legacyScope])\n : undefined;\n if (accountScope === undefined) invalidate(...routes);\n else invalidateScope(accountScope, routes);\n };\n\n invalidateStream('notifications.list', 'notifications.count');\n const offNotification = stream.on('notification', () =>\n invalidateStream('notifications.list', 'notifications.count'),\n );\n const offUnreadCount = stream.on('unreadCount', () =>\n invalidateStream('notifications.count'),\n );\n\n return () => {\n offNotification();\n offUnreadCount();\n };\n },\n install({ use, baseUrl, getAuthIdentity, getAuthScope }) {\n installationSequence += 1;\n use(createTransformer(installationSequence, baseUrl, getAuthIdentity, getAuthScope));\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["LRUCache"],"sources":["../src/errors.ts","../src/key.ts","../src/operations.ts","../src/mutations.ts","../src/plugin.ts"],"sourcesContent":["/** Ошибка настройки или использования плагина кэша. */\nexport class CacheError extends Error {\n override readonly name = 'CacheError';\n}\n","import type { OperationRequestOptions } from 'itd-api';\nimport type { CacheOperationId } from './operations.js';\n\nconst OMITTED_FIELDS = new Set([\n 'method',\n 'operationId',\n 'path',\n 'service',\n 'baseUrl',\n 'query',\n 'body',\n 'headers',\n 'raw',\n 'skipAuth',\n 'signal',\n 'timeout',\n 'retry',\n 'retrySafety',\n 'skipQueue',\n 'skipAuthRefresh',\n 'extensions',\n]);\n\n/** Строка query в том же порядке и с теми же правилами, что использует itd-api. */\nfunction queryKey(query: OperationRequestOptions['query']): string {\n if (!query) return '';\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n\n if (Array.isArray(value)) {\n for (const item of value) search.append(key, String(item));\n } else {\n search.append(key, String(value));\n }\n }\n\n return search.toString();\n}\n\n/**\n * Собирает ключ из значений, влияющих на адрес, тело или разобранный ответ.\n *\n * Заголовки и транспортные опции намеренно не входят. Если тело либо опция другого\n * плагина не сериализуются как JSON, запрос выполняется без кэша.\n */\nexport function buildCacheKey(\n operation: CacheOperationId,\n request: OperationRequestOptions,\n): string | undefined {\n const extras: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(request)) {\n if (!OMITTED_FIELDS.has(key) && value !== undefined) extras[key] = value;\n }\n const { cache: _cacheMode, ...extensions } = request.extensions ?? {};\n if (Object.keys(extensions).length > 0) extras.extensions = extensions;\n\n try {\n return JSON.stringify({\n operation,\n method: request.method.toUpperCase(),\n service: request.service ?? null,\n baseUrl: request.baseUrl ?? null,\n path: request.path,\n query: queryKey(request.query),\n body: request.body ?? null,\n raw: request.raw ?? false,\n skipAuth: request.skipAuth ?? null,\n extras,\n });\n } catch {\n return undefined;\n }\n}\n","import type { BuiltInOperationId, OperationId } from 'itd-api';\n\n/** Описание читающей операции itd-api. */\nexport interface CacheOperation {\n /** Стабильный ID операции и публичное имя для настройки плагина. */\n id: BuiltInOperationId;\n /** Раздел клиента. */\n category: string;\n}\n\nfunction freezeOperations<const T extends readonly CacheOperation[]>(\n operations: T,\n): Readonly<{ readonly [K in keyof T]: Readonly<T[K]> }> {\n for (const operation of operations) Object.freeze(operation);\n return Object.freeze(operations);\n}\n\n/** Читающие операции, которые можно кэшировать. */\nexport const CACHE_OPERATIONS = freezeOperations([\n { id: 'auth.sessions', category: 'auth' },\n\n { id: 'users.me', category: 'users' },\n { id: 'users.checkUsername', category: 'users' },\n { id: 'users.search', category: 'users' },\n { id: 'users.whoToFollow', category: 'users' },\n { id: 'users.topClans', category: 'users' },\n { id: 'users.followers', category: 'users' },\n { id: 'users.following', category: 'users' },\n { id: 'users.blocked', category: 'users' },\n { id: 'users.getPrivacy', category: 'users' },\n { id: 'users.pins', category: 'users' },\n { id: 'users.followStatus', category: 'users' },\n { id: 'users.get', category: 'users' },\n\n { id: 'posts.list', category: 'posts' },\n { id: 'posts.likedByUser', category: 'posts' },\n { id: 'posts.byUser', category: 'posts' },\n { id: 'posts.comments', category: 'posts' },\n { id: 'posts.stats', category: 'posts' },\n { id: 'posts.get', category: 'posts' },\n\n { id: 'comments.replies', category: 'comments' },\n\n { id: 'notifications.list', category: 'notifications' },\n { id: 'notifications.count', category: 'notifications' },\n { id: 'notifications.getSettings', category: 'notifications' },\n\n { id: 'hashtags.search', category: 'hashtags' },\n { id: 'hashtags.trending', category: 'hashtags' },\n { id: 'hashtags.posts', category: 'hashtags' },\n\n { id: 'search.all', category: 'search' },\n { id: 'files.get', category: 'files' },\n\n { id: 'subscription.status', category: 'subscription' },\n { id: 'subscription.methods', category: 'subscription' },\n { id: 'verification.status', category: 'verification' },\n\n { id: 'platform.changelog', category: 'platform' },\n { id: 'platform.announcements', category: 'platform' },\n { id: 'platform.portal', category: 'platform' },\n { id: 'platform.status', category: 'platform' },\n] as const satisfies readonly CacheOperation[]);\n\n/** Имя операции, доступное в `cache({ operations: … })`. */\nexport type CacheOperationId = (typeof CACHE_OPERATIONS)[number]['id'];\n\n/** Раздел операции. */\nexport type CacheOperationCategory = (typeof CACHE_OPERATIONS)[number]['category'];\n\nconst OPERATIONS = new Map<OperationId, (typeof CACHE_OPERATIONS)[number]>(\n CACHE_OPERATIONS.map((operation) => [operation.id, operation]),\n);\n\n/** Проверяет публичное имя кэшируемой операции. */\nexport function isCacheOperationId(value: string): value is CacheOperationId {\n return OPERATIONS.has(value as OperationId);\n}\n\n/** Находит читающую операцию по стабильному семантическому ID. */\nexport function cacheOperation(\n operationId: OperationId,\n): (typeof CACHE_OPERATIONS)[number] | undefined {\n return OPERATIONS.get(operationId);\n}\n","import type { BuiltInOperationId, OperationId } from 'itd-api';\nimport type { CacheOperationId } from './operations.js';\n\nexport type MutationInvalidation = readonly CacheOperationId[] | 'all';\n\nexport interface CacheMutation {\n operationId: BuiltInOperationId;\n invalidates: MutationInvalidation;\n /** По умолчанию зависимые операции удаляются у всех аккаунтов общего экземпляра. */\n scope?: 'account' | undefined;\n}\n\nconst POST_CONTENT = [\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n 'posts.likedByUser',\n 'posts.comments',\n 'posts.stats',\n 'comments.replies',\n 'hashtags.search',\n 'hashtags.trending',\n 'hashtags.posts',\n 'search.all',\n 'users.me',\n 'users.get',\n 'users.pins',\n] as const satisfies readonly CacheOperationId[];\n\nconst POST_REACTIONS = [\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n 'posts.likedByUser',\n 'posts.stats',\n 'hashtags.posts',\n 'search.all',\n] as const satisfies readonly CacheOperationId[];\n\nconst COMMENTS = [\n 'posts.list',\n 'posts.get',\n 'posts.comments',\n 'posts.stats',\n 'comments.replies',\n 'hashtags.posts',\n 'search.all',\n] as const satisfies readonly CacheOperationId[];\n\nconst PROFILE = [\n 'users.me',\n 'users.get',\n 'users.checkUsername',\n 'users.search',\n 'users.whoToFollow',\n 'users.topClans',\n 'users.followers',\n 'users.following',\n 'users.blocked',\n 'users.getPrivacy',\n 'users.pins',\n 'users.followStatus',\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n 'posts.likedByUser',\n 'posts.comments',\n 'comments.replies',\n 'hashtags.posts',\n 'search.all',\n] as const satisfies readonly CacheOperationId[];\n\nconst FOLLOWING = [\n 'users.me',\n 'users.get',\n 'users.search',\n 'users.whoToFollow',\n 'users.followers',\n 'users.following',\n 'users.followStatus',\n 'posts.list',\n 'posts.byUser',\n 'search.all',\n] as const satisfies readonly CacheOperationId[];\n\nconst BLOCKS = [\n 'users.me',\n 'users.get',\n 'users.search',\n 'users.whoToFollow',\n 'users.followers',\n 'users.following',\n 'users.blocked',\n 'users.followStatus',\n 'posts.list',\n 'search.all',\n] as const satisfies readonly CacheOperationId[];\n\nconst PINS = [\n 'users.me',\n 'users.get',\n 'users.pins',\n 'posts.list',\n 'posts.get',\n 'posts.byUser',\n] as const satisfies readonly CacheOperationId[];\n\nconst NOTIFICATIONS = [\n 'notifications.list',\n 'notifications.count',\n] as const satisfies readonly CacheOperationId[];\n\nconst SUBSCRIPTION = [\n 'subscription.status',\n 'subscription.methods',\n] as const satisfies readonly CacheOperationId[];\n\nconst NOTHING = [] as const satisfies readonly CacheOperationId[];\n\n/**\n * Известные изменяющие запросы и читающие операции, чьи ответы они могут изменить.\n *\n * Каталог намеренно консервативен: лучше удалить несколько связанных списков, чем оставить\n * персонализированное поле или вложенный объект устаревшим.\n */\nconst CACHE_MUTATIONS = Object.freeze([\n // Авторизация и сессии.\n { operationId: 'auth.refresh', invalidates: NOTHING },\n { operationId: 'auth.resendOtp', invalidates: NOTHING },\n { operationId: 'auth.forgotPassword', invalidates: NOTHING },\n { operationId: 'auth.signUp', invalidates: 'all' },\n { operationId: 'auth.signIn', invalidates: 'all' },\n { operationId: 'auth.verifyOtp', invalidates: 'all' },\n { operationId: 'auth.logout', invalidates: 'all' },\n { operationId: 'auth.resetPassword', invalidates: 'all' },\n { operationId: 'auth.changePassword', invalidates: 'all' },\n {\n operationId: 'auth.revokeSession',\n invalidates: ['auth.sessions'],\n scope: 'account',\n },\n {\n operationId: 'auth.revokeOtherSessions',\n invalidates: ['auth.sessions'],\n scope: 'account',\n },\n\n // Посты и комментарии.\n { operationId: 'posts.create', invalidates: POST_CONTENT },\n { operationId: 'posts.update', invalidates: POST_CONTENT },\n { operationId: 'posts.remove', invalidates: POST_CONTENT },\n { operationId: 'posts.restore', invalidates: POST_CONTENT },\n { operationId: 'posts.like', invalidates: POST_REACTIONS },\n { operationId: 'posts.unlike', invalidates: POST_REACTIONS },\n { operationId: 'posts.repost', invalidates: POST_CONTENT },\n { operationId: 'posts.unrepost', invalidates: POST_CONTENT },\n { operationId: 'posts.pin', invalidates: PINS },\n { operationId: 'posts.unpin', invalidates: PINS },\n { operationId: 'posts.vote', invalidates: POST_REACTIONS },\n { operationId: 'posts.comment', invalidates: COMMENTS },\n { operationId: 'comments.reply', invalidates: COMMENTS },\n { operationId: 'comments.update', invalidates: COMMENTS },\n { operationId: 'comments.remove', invalidates: COMMENTS },\n { operationId: 'comments.restore', invalidates: COMMENTS },\n { operationId: 'comments.like', invalidates: COMMENTS },\n { operationId: 'comments.unlike', invalidates: COMMENTS },\n\n // Профиль и связи между пользователями.\n { operationId: 'users.updateMe', invalidates: PROFILE },\n { operationId: 'users.deactivate', invalidates: PROFILE },\n { operationId: 'users.restore', invalidates: PROFILE },\n { operationId: 'users.createProfile', invalidates: PROFILE },\n { operationId: 'users.follow', invalidates: FOLLOWING },\n { operationId: 'users.unfollow', invalidates: FOLLOWING },\n { operationId: 'users.block', invalidates: BLOCKS },\n { operationId: 'users.unblock', invalidates: BLOCKS },\n {\n operationId: 'users.updatePrivacy',\n invalidates: ['users.me', 'users.get', 'users.getPrivacy'],\n },\n { operationId: 'users.setPin', invalidates: PINS },\n { operationId: 'users.removePin', invalidates: PINS },\n\n // Уведомления.\n {\n operationId: 'notifications.markRead',\n invalidates: NOTIFICATIONS,\n scope: 'account',\n },\n {\n operationId: 'notifications.markReadBatch',\n invalidates: NOTIFICATIONS,\n scope: 'account',\n },\n {\n operationId: 'notifications.markAllRead',\n invalidates: NOTIFICATIONS,\n scope: 'account',\n },\n {\n operationId: 'notifications.updateSettings',\n invalidates: ['notifications.getSettings'],\n scope: 'account',\n },\n\n // Файлы и настройки аккаунта.\n { operationId: 'files.upload', invalidates: NOTHING },\n {\n operationId: 'files.remove',\n invalidates: ['files.get', ...POST_CONTENT],\n },\n {\n operationId: 'verification.submit',\n invalidates: ['verification.status'],\n scope: 'account',\n },\n {\n operationId: 'subscription.pay',\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n operationId: 'subscription.setAutoRenewal',\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n operationId: 'subscription.bindCard',\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n operationId: 'subscription.setDefaultMethod',\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n {\n operationId: 'subscription.removeMethod',\n invalidates: SUBSCRIPTION,\n scope: 'account',\n },\n\n // Эти запросы не меняют ни один доступный для кэширования ответ.\n { operationId: 'reports.create', invalidates: NOTHING },\n { operationId: 'telemetry.dwell', invalidates: NOTHING },\n { operationId: 'telemetry.interaction', invalidates: NOTHING },\n] as const satisfies readonly CacheMutation[]);\n\n// Списки инвалидации разделяются несколькими мутациями, а `cacheMutation()` отдаёт\n// дескриптор наружу. Замораживаем и его, и список, чтобы случайное изменение одного\n// результата не переписало каталог для всех остальных операций.\nfor (const mutation of CACHE_MUTATIONS) {\n Object.freeze(mutation.invalidates);\n Object.freeze(mutation);\n}\n\nconst MUTATIONS = new Map<OperationId, CacheMutation>(\n CACHE_MUTATIONS.map((mutation) => [mutation.operationId, mutation]),\n);\n\n/** Находит известную мутацию по стабильному семантическому ID. */\nexport function cacheMutation(operationId: OperationId): CacheMutation | undefined {\n return MUTATIONS.get(operationId);\n}\n","import type {\n AuthIdentity,\n ClientPlugin,\n ItdRealtime,\n OperationRequestOptions,\n OperationTransformer,\n RealtimeContext,\n Unsubscribe,\n} from 'itd-api';\nimport { LRUCache } from 'lru-cache';\nimport { CacheError } from './errors.js';\nimport { buildCacheKey } from './key.js';\nimport { type CacheMutation, cacheMutation } from './mutations.js';\nimport { type CacheOperationId, cacheOperation, isCacheOperationId } from './operations.js';\n\n/** Режимы кэширования отдельного запроса. */\nexport const CacheModes = Object.freeze({\n /** Отдать свежий кэш, иначе выполнить запрос и сохранить ответ. */\n Default: 'default',\n /** Пропустить сохранённое значение, выполнить запрос и перезаписать кэш. */\n Reload: 'reload',\n /** Не читать и не писать кэш для этого запроса. */\n NoStore: 'no-store',\n} as const);\n\n/** Поведение кэша для отдельного запроса. */\nexport type CacheMode = (typeof CacheModes)[keyof typeof CacheModes];\n\n/** Настройки плагина. */\nexport interface CacheOptions {\n /** Сколько миллисекунд хранить успешный ответ. */\n ttl: number;\n /** Какие операции itd-api кэшировать. */\n operations: readonly CacheOperationId[];\n /** Максимальное количество ответов. По умолчанию 500. */\n maxEntries?: number | undefined;\n /** Объединять ли одновременные одинаковые запросы. По умолчанию `true`. */\n deduplicate?: boolean | undefined;\n}\n\n/** Плагин и управление созданным им хранилищем. */\nexport interface CachePlugin extends ClientPlugin {\n /** Количество готовых ответов во всех разделах кэша. */\n readonly size: number;\n /** Удаляет все ответы и не даёт выполняющимся запросам вернуть устаревший результат. */\n clear(): void;\n /** Удаляет все варианты названных операций во всех подключённых клиентах. */\n invalidate(...operations: CacheOperationId[]): void;\n /**\n * Очищает список и счётчик уведомлений по событиям realtime.\n *\n * Сразу удаляет прежние значения и возвращает функцию отписки.\n */\n attachRealtime<C extends RealtimeContext>(stream: ItdRealtime<C>): Unsubscribe;\n}\n\ninterface CacheEntry {\n accountScope: string;\n operation: CacheOperationId;\n value: unknown;\n}\n\ninterface LoadedValue {\n cacheable: boolean;\n value: unknown;\n}\n\ninterface CacheIdentity {\n accountScope: string;\n sessionScope: string;\n}\n\ninterface PendingEntry {\n accountScope: string;\n operation: CacheOperationId;\n promise: Promise<LoadedValue>;\n}\n\ninterface KeyState {\n active: number;\n generation: number;\n}\n\nconst DEFAULT_MAX_ENTRIES = 500;\nconst CACHE_MODES: ReadonlySet<string> = new Set(Object.values(CacheModes));\n\nfunction assertPositive(value: number, name: string, integer = false): void {\n if (!Number.isFinite(value) || value <= 0 || (integer && !Number.isInteger(value))) {\n throw new CacheError(\n `${name} должен быть ${integer ? 'целым ' : ''}положительным числом, получено: ${value}`,\n );\n }\n}\n\nfunction resolveOptions(options: CacheOptions): {\n ttl: number;\n operations: ReadonlySet<CacheOperationId>;\n maxEntries: number;\n deduplicate: boolean;\n} {\n if (!options || typeof options !== 'object') {\n throw new CacheError('cache() принимает объект настроек');\n }\n\n assertPositive(options.ttl, 'cache.ttl');\n\n if (!Array.isArray(options.operations) || options.operations.length === 0) {\n throw new CacheError('cache.operations должен содержать хотя бы одну операцию');\n }\n\n const operations = new Set<CacheOperationId>();\n for (const operation of options.operations as readonly string[]) {\n if (typeof operation !== 'string' || !isCacheOperationId(operation)) {\n throw new CacheError(`Неизвестная операция кэша: ${JSON.stringify(operation)}`);\n }\n operations.add(operation);\n }\n\n const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n assertPositive(maxEntries, 'cache.maxEntries', true);\n\n const deduplicate = options.deduplicate ?? true;\n if (typeof deduplicate !== 'boolean') {\n throw new CacheError(`cache.deduplicate должен быть boolean, получено: ${deduplicate}`);\n }\n\n return { ttl: options.ttl, operations, maxEntries, deduplicate };\n}\n\nfunction cloneValue(value: unknown): LoadedValue {\n try {\n return { cacheable: true, value: structuredClone(value) };\n } catch {\n return { cacheable: false, value };\n }\n}\n\nfunction cacheMode(request: OperationRequestOptions): CacheMode {\n const mode = request.extensions?.cache ?? CacheModes.Default;\n if (!CACHE_MODES.has(mode)) {\n throw new CacheError(\n `cache должен быть '${CacheModes.Default}', '${CacheModes.Reload}' или '${CacheModes.NoStore}', получено: ${String(mode)}`,\n );\n }\n return mode;\n}\n\n/** Создаёт TTL/LRU-кэш разобранных ответов itd-api. */\nexport function cache(options: CacheOptions): CachePlugin {\n const config = resolveOptions(options);\n const values = new LRUCache<string, CacheEntry>({\n max: config.maxEntries,\n ttl: config.ttl,\n updateAgeOnGet: false,\n allowStale: false,\n });\n const pending = new Map<string, PendingEntry>();\n const operationGenerations = new Map<CacheOperationId, number>();\n const scopeGenerations = new Map<string, number>();\n const scopeOperationGenerations = new Map<string, number>();\n const keyStates = new Map<string, KeyState>();\n let generation = 0;\n let installationSequence = 0;\n\n const scopeOperationKey = (accountScope: string, operation: CacheOperationId): string =>\n JSON.stringify([accountScope, operation]);\n\n const clear = (): void => {\n generation += 1;\n values.clear();\n pending.clear();\n };\n\n const invalidate = (...operations: CacheOperationId[]): void => {\n if (operations.length === 0) return;\n\n const selected = new Set<CacheOperationId>();\n for (const operation of operations as readonly string[]) {\n if (!isCacheOperationId(operation)) {\n throw new CacheError(`Неизвестная операция кэша: ${JSON.stringify(operation)}`);\n }\n selected.add(operation);\n operationGenerations.set(operation, (operationGenerations.get(operation) ?? 0) + 1);\n }\n\n for (const [key, entry] of values.entries()) {\n if (selected.has(entry.operation)) values.delete(key);\n }\n for (const [key, entry] of pending) {\n if (selected.has(entry.operation)) pending.delete(key);\n }\n };\n\n const clearScope = (accountScope: string): void => {\n scopeGenerations.set(accountScope, (scopeGenerations.get(accountScope) ?? 0) + 1);\n\n for (const [key, entry] of values.entries()) {\n if (entry.accountScope === accountScope) values.delete(key);\n }\n for (const [key, entry] of pending) {\n if (entry.accountScope === accountScope) pending.delete(key);\n }\n };\n\n const invalidateScope = (accountScope: string, operations: readonly CacheOperationId[]): void => {\n if (operations.length === 0) return;\n\n const selected = new Set(operations);\n for (const operation of selected) {\n const key = scopeOperationKey(accountScope, operation);\n scopeOperationGenerations.set(key, (scopeOperationGenerations.get(key) ?? 0) + 1);\n }\n\n for (const [key, entry] of values.entries()) {\n if (entry.accountScope === accountScope && selected.has(entry.operation)) values.delete(key);\n }\n for (const [key, entry] of pending) {\n if (entry.accountScope === accountScope && selected.has(entry.operation)) pending.delete(key);\n }\n };\n\n const applyMutation = (accountScope: string, mutation: CacheMutation): void => {\n if (mutation.invalidates === 'all') {\n clearScope(accountScope);\n } else if (mutation.scope === 'account') {\n invalidateScope(accountScope, mutation.invalidates);\n } else {\n invalidate(...mutation.invalidates);\n }\n };\n\n const createTransformer = (\n installation: number,\n baseUrl: string,\n getAuthIdentity: (() => Promise<AuthIdentity>) | undefined,\n getAuthScope: (() => string) | undefined,\n ): OperationTransformer => {\n const fallbackAuthScope = JSON.stringify([baseUrl, `installation:${installation}`]);\n\n const resolveIdentity = async (): Promise<CacheIdentity> => {\n const identity = await getAuthIdentity?.();\n const accountScope = identity?.userId\n ? JSON.stringify([baseUrl, identity.userId])\n : getAuthScope\n ? JSON.stringify([baseUrl, getAuthScope()])\n : fallbackAuthScope;\n const sessionScope =\n identity?.userId && identity.sessionId\n ? JSON.stringify([baseUrl, identity.userId, identity.sessionId])\n : JSON.stringify([\n accountScope,\n getAuthScope ? getAuthScope() : `installation:${installation}`,\n ]);\n return { accountScope, sessionScope };\n };\n\n return async (request, next) => {\n const operation = cacheOperation(request.operationId);\n const method = request.method.toUpperCase();\n const isRead = operation !== undefined || method === 'GET' || method === 'HEAD';\n\n if (!isRead) {\n const mutation = cacheMutation(request.operationId);\n const startedIdentity = mutation ? await resolveIdentity() : undefined;\n const result = await next(request);\n if (mutation && startedIdentity) {\n applyMutation(startedIdentity.accountScope, mutation);\n const currentIdentity = await resolveIdentity();\n if (\n currentIdentity.accountScope !== startedIdentity.accountScope &&\n (mutation.invalidates === 'all' || mutation.scope === 'account')\n ) {\n applyMutation(currentIdentity.accountScope, mutation);\n }\n } else {\n clear();\n }\n return result;\n }\n\n if (!operation || !config.operations.has(operation.id)) return next(request);\n\n const mode = cacheMode(request);\n if (mode === CacheModes.NoStore) return next(request);\n\n const unscopedKey = buildCacheKey(operation.id, request);\n if (unscopedKey === undefined) return next(request);\n\n const identity = await resolveIdentity();\n const scope =\n operation.id === 'auth.sessions' ? identity.sessionScope : identity.accountScope;\n const key = JSON.stringify([scope, unscopedKey]);\n\n if (mode === CacheModes.Reload) {\n // Прежняя загрузка только этого ключа не должна перезаписать принудительное обновление.\n const state = keyStates.get(key) ?? {\n active: 0,\n generation: 0,\n };\n state.generation += 1;\n keyStates.set(key, state);\n values.delete(key);\n pending.delete(key);\n }\n\n if (mode === CacheModes.Default) {\n const hit = values.get(key);\n if (hit) {\n const cloned = cloneValue(hit.value);\n if (cloned.cacheable) return cloned.value;\n values.delete(key);\n }\n\n const existing = pending.get(key);\n if (\n config.deduplicate &&\n request.signal === undefined &&\n request.timeout === undefined &&\n existing\n ) {\n const loaded = await existing.promise;\n return cloneValue(loaded.value).value;\n }\n }\n\n const startedGeneration = generation;\n const startedScopeGeneration = scopeGenerations.get(identity.accountScope) ?? 0;\n const startedOperationGeneration = operationGenerations.get(operation.id) ?? 0;\n const scopedOperationKey = scopeOperationKey(identity.accountScope, operation.id);\n const startedScopeOperationGeneration =\n scopeOperationGenerations.get(scopedOperationKey) ?? 0;\n const keyState = keyStates.get(key) ?? {\n active: 0,\n generation: 0,\n };\n keyState.active += 1;\n keyStates.set(key, keyState);\n const startedKeyGeneration = keyState.generation;\n const load = (async (): Promise<LoadedValue> => {\n try {\n const result = await next(request);\n const stored = cloneValue(result);\n const currentIdentity = await resolveIdentity();\n const currentScope =\n operation.id === 'auth.sessions'\n ? currentIdentity.sessionScope\n : currentIdentity.accountScope;\n\n if (\n stored.cacheable &&\n currentScope === scope &&\n generation === startedGeneration &&\n (scopeGenerations.get(identity.accountScope) ?? 0) === startedScopeGeneration &&\n (operationGenerations.get(operation.id) ?? 0) === startedOperationGeneration &&\n (scopeOperationGenerations.get(scopedOperationKey) ?? 0) ===\n startedScopeOperationGeneration &&\n keyState.generation === startedKeyGeneration\n ) {\n values.set(key, {\n accountScope: identity.accountScope,\n operation: operation.id,\n value: stored.value,\n });\n }\n\n // Снимок уже отделён для кэша; инициатор получает независимый исходный ответ сети.\n return { cacheable: stored.cacheable, value: result };\n } finally {\n keyState.active -= 1;\n if (keyState.active === 0 && keyStates.get(key) === keyState) keyStates.delete(key);\n }\n })();\n\n const mayDeduplicate =\n mode === CacheModes.Default &&\n config.deduplicate &&\n request.signal === undefined &&\n request.timeout === undefined;\n const entry: PendingEntry = {\n accountScope: identity.accountScope,\n operation: operation.id,\n promise: load,\n };\n if (mayDeduplicate) pending.set(key, entry);\n\n try {\n const loaded = await load;\n return loaded.value;\n } finally {\n if (pending.get(key) === entry) pending.delete(key);\n }\n };\n };\n\n return {\n name: 'cache',\n get size() {\n values.purgeStale();\n return values.size;\n },\n clear,\n invalidate,\n attachRealtime(stream) {\n if (!stream || typeof stream.on !== 'function') {\n throw new CacheError('attachRealtime() принимает поток из itd.realtime()');\n }\n\n const invalidateStream = (...operations: CacheOperationId[]): void => {\n const identity =\n typeof stream.getAuthIdentity === 'function' ? stream.getAuthIdentity() : undefined;\n const streamBaseUrl =\n typeof stream.baseUrl === 'string' && stream.baseUrl.length > 0\n ? stream.baseUrl\n : undefined;\n const legacyScope =\n typeof stream.getAuthScope === 'function' ? stream.getAuthScope() : undefined;\n const accountScope =\n identity?.userId && streamBaseUrl\n ? JSON.stringify([streamBaseUrl, identity.userId])\n : legacyScope !== undefined && streamBaseUrl\n ? JSON.stringify([streamBaseUrl, legacyScope])\n : undefined;\n if (accountScope === undefined) invalidate(...operations);\n else invalidateScope(accountScope, operations);\n };\n\n invalidateStream('notifications.list', 'notifications.count');\n const offNotification = stream.on('notification', () =>\n invalidateStream('notifications.list', 'notifications.count'),\n );\n const offUnreadCount = stream.on('unreadCount', () =>\n invalidateStream('notifications.count'),\n );\n\n return () => {\n offNotification();\n offUnreadCount();\n };\n },\n install({ operations, baseUrl, getAuthIdentity, getAuthScope }) {\n installationSequence += 1;\n operations.use(\n createTransformer(installationSequence, baseUrl, getAuthIdentity, getAuthScope),\n );\n },\n };\n}\n"],"mappings":"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"}
|