@yunfie/search-js 1.0.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.
Files changed (68) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1 -0
  3. package/dist/cache/memory.d.ts +18 -0
  4. package/dist/cache/memory.d.ts.map +1 -0
  5. package/dist/cache/memory.js +79 -0
  6. package/dist/cache/memory.js.map +1 -0
  7. package/dist/cache/persistent.d.ts +5 -0
  8. package/dist/cache/persistent.d.ts.map +1 -0
  9. package/dist/cache/persistent.js +105 -0
  10. package/dist/cache/persistent.js.map +1 -0
  11. package/dist/config.d.ts +24 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +29 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/events.d.ts +18 -0
  16. package/dist/events.d.ts.map +1 -0
  17. package/dist/events.js +32 -0
  18. package/dist/events.js.map +1 -0
  19. package/dist/history.d.ts +16 -0
  20. package/dist/history.d.ts.map +1 -0
  21. package/dist/history.js +61 -0
  22. package/dist/history.js.map +1 -0
  23. package/dist/index.d.ts +61 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +231 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/memory.d.ts +6 -0
  28. package/dist/memory.d.ts.map +1 -0
  29. package/dist/memory.js +79 -0
  30. package/dist/memory.js.map +1 -0
  31. package/dist/offline.d.ts +7 -0
  32. package/dist/offline.d.ts.map +1 -0
  33. package/dist/offline.js +39 -0
  34. package/dist/offline.js.map +1 -0
  35. package/dist/parser.d.ts +36 -0
  36. package/dist/parser.d.ts.map +1 -0
  37. package/dist/parser.js +118 -0
  38. package/dist/parser.js.map +1 -0
  39. package/dist/request/queue.d.ts +11 -0
  40. package/dist/request/queue.d.ts.map +1 -0
  41. package/dist/request/queue.js +31 -0
  42. package/dist/request/queue.js.map +1 -0
  43. package/dist/request/retry.d.ts +14 -0
  44. package/dist/request/retry.d.ts.map +1 -0
  45. package/dist/request/retry.js +155 -0
  46. package/dist/request/retry.js.map +1 -0
  47. package/dist/suggest.d.ts +14 -0
  48. package/dist/suggest.d.ts.map +1 -0
  49. package/dist/suggest.js +159 -0
  50. package/dist/suggest.js.map +1 -0
  51. package/dist/utils.d.ts +17 -0
  52. package/dist/utils.d.ts.map +1 -0
  53. package/dist/utils.js +72 -0
  54. package/dist/utils.js.map +1 -0
  55. package/package.json +39 -0
  56. package/src/cache/memory.ts +79 -0
  57. package/src/cache/persistent.ts +106 -0
  58. package/src/config.ts +53 -0
  59. package/src/events.ts +57 -0
  60. package/src/history.ts +70 -0
  61. package/src/index.ts +307 -0
  62. package/src/memory.ts +101 -0
  63. package/src/offline.ts +44 -0
  64. package/src/parser.ts +138 -0
  65. package/src/request/queue.ts +38 -0
  66. package/src/request/retry.ts +162 -0
  67. package/src/suggest.ts +174 -0
  68. package/src/utils.ts +101 -0
@@ -0,0 +1,61 @@
1
+ import { configure, type Config } from "./config.js";
2
+ import { type PriorityValue } from "./request/queue.js";
3
+ import { cancel as cancelRequest, cancelAll, type FetchResult } from "./request/retry.js";
4
+ import { debounce } from "./utils.js";
5
+ import { type ResultMeta, type ResultDetail, type ParsedResponse } from "./parser.js";
6
+ import { getSuggestDebounced, type SuggestItem, type SuggestResult } from "./suggest.js";
7
+ import { on, off, type SearchEventMap } from "./events.js";
8
+ import { addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory, type HistoryEntry } from "./history.js";
9
+ import { getIsOnline } from "./offline.js";
10
+ export { configure, debounce, cancelRequest, cancelAll, getSuggestDebounced, on, off, addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory, getIsOnline, };
11
+ export type { Config, FetchResult, ResultMeta, ResultDetail, ParsedResponse, SuggestItem, SuggestResult, SearchEventMap, HistoryEntry, };
12
+ export type SearchType = "web" | "image" | "video" | "news" | "panel";
13
+ export interface SearchOptions {
14
+ q: string;
15
+ page?: number;
16
+ type?: SearchType;
17
+ safesearch?: 0 | 1 | 2;
18
+ lang?: string;
19
+ enableStreaming?: boolean;
20
+ onChunk?: (chunk: unknown) => void;
21
+ usePersistentCache?: boolean;
22
+ metaOnly?: boolean;
23
+ signal?: AbortSignal;
24
+ }
25
+ export interface RequestOptions {
26
+ useCache?: boolean;
27
+ priority?: PriorityValue;
28
+ onChunk?: ((chunk: unknown) => void) | null;
29
+ usePersistentCache?: boolean;
30
+ signal?: AbortSignal;
31
+ }
32
+ export interface SearchStats {
33
+ memoryCacheSize: number;
34
+ memoryCacheMax: number;
35
+ isLowMemory: boolean;
36
+ isCriticalMemory: boolean;
37
+ inFlightCount: number;
38
+ isOnline: boolean;
39
+ }
40
+ export declare function getSearchStats(): SearchStats;
41
+ export declare function init(options?: Partial<Config>): void;
42
+ export declare function destroy(): Promise<void>;
43
+ export declare function search({ q, page, type, safesearch, lang, enableStreaming, onChunk, usePersistentCache, metaOnly, signal, }: SearchOptions): Promise<FetchResult>;
44
+ export declare function searchMeta(opts: Omit<SearchOptions, "metaOnly" | "enableStreaming" | "onChunk">): Promise<FetchResult>;
45
+ export declare function fetchDetail(opts: Omit<SearchOptions, "metaOnly" | "enableStreaming" | "onChunk">, idx: number): Promise<ResultDetail | null>;
46
+ export declare function getSuggest(q: string): Promise<SuggestResult>;
47
+ export interface Pager {
48
+ next(): Promise<FetchResult | null>;
49
+ prev(): Promise<FetchResult | null>;
50
+ readonly currentPage: number;
51
+ reset(): void;
52
+ }
53
+ export declare function createPager(opts: Omit<SearchOptions, "page">, maxPage?: number): Pager;
54
+ export type SearchAllResult = Partial<Record<SearchType, FetchResult>>;
55
+ export declare function searchAll(opts: Omit<SearchOptions, "type">, types?: SearchType[]): Promise<SearchAllResult>;
56
+ export declare const searchWeb: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
57
+ export declare const searchImage: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
58
+ export declare const searchVideo: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
59
+ export declare const searchNews: (q: string, page?: number, signal?: AbortSignal) => Promise<FetchResult>;
60
+ export declare const searchPanel: (q: string, signal?: AbortSignal) => Promise<FetchResult>;
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,231 @@
1
+ // src/index.ts
2
+ import { configure, getConfig } from "./config.js";
3
+ import { store as memStore, clearStore, evictExpired, trimToHalf } from "./cache/memory.js";
4
+ import { getCacheKey, get as memGet, set as memSet } from "./cache/memory.js";
5
+ import { getP, setP, cleanup, destroyDB } from "./cache/persistent.js";
6
+ import { initMemoryMonitor, getIsLowMemory, getIsCriticalMemory, getCurrentCacheMax, destroyMemoryMonitor } from "./memory.js";
7
+ import { enqueue, Priority, clearQueues } from "./request/queue.js";
8
+ import { fetchWithRetry, cancel as cancelRequest, cancelAll } from "./request/retry.js";
9
+ import { debounce } from "./utils.js";
10
+ import { extractMeta, extractDetail, } from "./parser.js";
11
+ import { getSuggest as _getSuggest, getSuggestDebounced, clearSuggestCache, } from "./suggest.js";
12
+ import { on, off, emit, clearAllListeners } from "./events.js";
13
+ import { addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory } from "./history.js";
14
+ import { initOfflineMonitor, destroyOfflineMonitor, getIsOnline, addRetryTask } from "./offline.js";
15
+ export { configure, debounce, cancelRequest, cancelAll, getSuggestDebounced, on, off, addHistory, getHistory, removeHistory, clearHistory, mergeWithHistory, getIsOnline, };
16
+ const HEAVY_TYPES = new Set(["image", "video"]);
17
+ export function getSearchStats() {
18
+ return {
19
+ memoryCacheSize: memStore.size,
20
+ memoryCacheMax: getCurrentCacheMax(),
21
+ isLowMemory: getIsLowMemory(),
22
+ isCriticalMemory: getIsCriticalMemory(),
23
+ inFlightCount: inFlight.size,
24
+ isOnline: getIsOnline(),
25
+ };
26
+ }
27
+ let _cleanupTimer = null;
28
+ export function init(options = {}) {
29
+ configure(options);
30
+ initMemoryMonitor(memStore);
31
+ initOfflineMonitor();
32
+ if (_cleanupTimer !== null)
33
+ clearInterval(_cleanupTimer);
34
+ _cleanupTimer = setInterval(cleanup, getConfig().PERSISTENT_CLEANUP_INTERVAL);
35
+ }
36
+ export async function destroy() {
37
+ cancelAll();
38
+ clearQueues();
39
+ inFlight.clear();
40
+ clearStore();
41
+ clearSuggestCache();
42
+ clearAllListeners();
43
+ destroyOfflineMonitor();
44
+ await destroyDB();
45
+ destroyMemoryMonitor();
46
+ if (_cleanupTimer !== null) {
47
+ clearInterval(_cleanupTimer);
48
+ _cleanupTimer = null;
49
+ }
50
+ }
51
+ const inFlight = new Map();
52
+ function _requestKey(endpoint, params) {
53
+ const p = params;
54
+ return endpoint + "\x00" + (p.q ?? "") + "\x00" + (p.page ?? 1) + "\x00" + (p.type ?? "web");
55
+ }
56
+ async function request(endpoint, params = {}, { useCache = true, priority = Priority.NORMAL, onChunk, usePersistentCache = false, signal, } = {}) {
57
+ const cfg = getConfig();
58
+ const lowMem = getIsLowMemory();
59
+ const offline = !getIsOnline();
60
+ if (getIsCriticalMemory()) {
61
+ evictExpired();
62
+ trimToHalf();
63
+ }
64
+ else if (lowMem) {
65
+ evictExpired();
66
+ }
67
+ const url = new URL(cfg.API_BASE + endpoint);
68
+ for (const k in params) {
69
+ const v = params[k];
70
+ if (v != null)
71
+ url.searchParams.append(k, String(v));
72
+ }
73
+ const cacheKey = getCacheKey(endpoint, params);
74
+ const reqKey = _requestKey(endpoint, params);
75
+ if (useCache) {
76
+ const hit = memGet(cacheKey);
77
+ if (hit) {
78
+ if (hit.expired && !lowMem && !offline) {
79
+ enqueue(async () => {
80
+ const r = await fetchWithRetry(url.toString(), _fetchOpts, reqKey);
81
+ if (r.ok) {
82
+ memSet(cacheKey, r.data);
83
+ if (usePersistentCache)
84
+ await setP(cacheKey, r.data);
85
+ emit("cacheRefreshed", { key: cacheKey });
86
+ }
87
+ }, priority);
88
+ }
89
+ return { ok: true, data: hit.data, cached: true, stale: hit.expired };
90
+ }
91
+ if (usePersistentCache) {
92
+ const pData = await getP(cacheKey);
93
+ if (pData) {
94
+ if (!lowMem)
95
+ memSet(cacheKey, pData);
96
+ return { ok: true, data: pData, cached: true, persistent: true };
97
+ }
98
+ }
99
+ }
100
+ if (offline)
101
+ return { ok: false, error: "offline" };
102
+ if (signal?.aborted)
103
+ return { ok: false, error: "cancelled" };
104
+ const existing = inFlight.get(reqKey);
105
+ if (existing)
106
+ return existing;
107
+ const fetchOpts = signal ? { ..._fetchOpts, signal } : _fetchOpts;
108
+ const promise = new Promise((resolve) => {
109
+ const onAbort = () => resolve({ ok: false, error: "cancelled" });
110
+ signal?.addEventListener("abort", onAbort, { once: true });
111
+ enqueue(async () => {
112
+ signal?.removeEventListener("abort", onAbort);
113
+ if (signal?.aborted) {
114
+ resolve({ ok: false, error: "cancelled" });
115
+ return;
116
+ }
117
+ try {
118
+ const result = await fetchWithRetry(url.toString(), fetchOpts, reqKey, onChunk ?? undefined);
119
+ if (result.ok && useCache && !result.streamed) {
120
+ if (!lowMem)
121
+ memSet(cacheKey, result.data);
122
+ if (usePersistentCache)
123
+ await setP(cacheKey, result.data);
124
+ }
125
+ if (!result.ok && result.error === "network_error") {
126
+ addRetryTask(async () => {
127
+ const r = await fetchWithRetry(url.toString(), _fetchOpts, reqKey);
128
+ if (r.ok) {
129
+ if (!lowMem)
130
+ memSet(cacheKey, r.data);
131
+ if (usePersistentCache)
132
+ await setP(cacheKey, r.data);
133
+ }
134
+ });
135
+ }
136
+ resolve(result);
137
+ }
138
+ catch (e) {
139
+ resolve({ ok: false, error: e instanceof Error ? e.message : "unknown_error" });
140
+ }
141
+ finally {
142
+ inFlight.delete(reqKey);
143
+ }
144
+ }, priority);
145
+ });
146
+ inFlight.set(reqKey, promise);
147
+ return promise;
148
+ }
149
+ const _fetchOpts = Object.freeze({
150
+ method: "GET",
151
+ headers: Object.freeze({ Accept: "application/json" }),
152
+ });
153
+ function _prefetch(endpoint, params) {
154
+ if (getIsLowMemory() || !getIsOnline())
155
+ return;
156
+ const cacheKey = getCacheKey(endpoint, params);
157
+ const hit = memGet(cacheKey);
158
+ if (hit && !hit.expired)
159
+ return;
160
+ if (inFlight.has(_requestKey(endpoint, params)))
161
+ return;
162
+ request(endpoint, params, { priority: Priority.LOW }).catch(() => { });
163
+ }
164
+ export async function search({ q, page = 1, type = "web", safesearch = 0, lang = "ja", enableStreaming = false, onChunk, usePersistentCache = false, metaOnly = false, signal, }) {
165
+ if (!q?.trim())
166
+ return { ok: false, error: "empty_query" };
167
+ const lowMem = getIsLowMemory();
168
+ const isHeavy = HEAVY_TYPES.has(type);
169
+ const forceStream = isHeavy && lowMem;
170
+ const params = { q: q.trim(), page, type, safesearch, lang };
171
+ if (page < 10 && !lowMem)
172
+ _prefetch("/search", { ...params, page: page + 1 });
173
+ if (forceStream || (enableStreaming && onChunk)) {
174
+ return request("/search", params, { priority: Priority.NORMAL, onChunk: onChunk ?? undefined, usePersistentCache, signal });
175
+ }
176
+ const result = await request("/search", params, { priority: Priority.NORMAL, onChunk: null, usePersistentCache, signal });
177
+ if (!result.ok)
178
+ return result;
179
+ if (isHeavy || metaOnly || lowMem) {
180
+ return { ...result, data: extractMeta(result.data, type, lowMem) };
181
+ }
182
+ return result;
183
+ }
184
+ export function searchMeta(opts) {
185
+ return search({ ...opts, metaOnly: true });
186
+ }
187
+ export async function fetchDetail(opts, idx) {
188
+ const { q, page = 1, type = "web", safesearch = 0, lang = "ja", usePersistentCache = false } = opts;
189
+ if (!q?.trim())
190
+ return null;
191
+ const params = { q: q.trim(), page, type, safesearch, lang };
192
+ const cacheKey = getCacheKey("/search", params);
193
+ const hit = memGet(cacheKey);
194
+ if (hit)
195
+ return extractDetail(hit.data, idx);
196
+ if (usePersistentCache) {
197
+ const pData = await getP(cacheKey);
198
+ if (pData)
199
+ return extractDetail(pData, idx);
200
+ }
201
+ const result = await request("/search", params, { priority: Priority.NORMAL, usePersistentCache });
202
+ return result.ok ? extractDetail(result.data, idx) : null;
203
+ }
204
+ export function getSuggest(q) { return _getSuggest(q); }
205
+ export function createPager(opts, maxPage = 10) {
206
+ let _page = 0;
207
+ return {
208
+ get currentPage() { return _page; },
209
+ async next() { if (_page >= maxPage)
210
+ return null; _page++; return search({ ...opts, page: _page }); },
211
+ async prev() { if (_page <= 1)
212
+ return null; _page--; return search({ ...opts, page: _page }); },
213
+ reset() { _page = 0; },
214
+ };
215
+ }
216
+ export async function searchAll(opts, types = ["web", "news"]) {
217
+ const entries = await Promise.allSettled(types.map((type) => search({ ...opts, type })));
218
+ const result = {};
219
+ for (let i = 0; i < types.length; i++) {
220
+ const s = entries[i];
221
+ if (s.status === "fulfilled" && s.value.ok)
222
+ result[types[i]] = s.value;
223
+ }
224
+ return result;
225
+ }
226
+ export const searchWeb = (q, page = 1, signal) => search({ q, page, type: "web", signal });
227
+ export const searchImage = (q, page = 1, signal) => search({ q, page, type: "image", signal });
228
+ export const searchVideo = (q, page = 1, signal) => search({ q, page, type: "video", signal });
229
+ export const searchNews = (q, page = 1, signal) => search({ q, page, type: "news", signal });
230
+ export const searchPanel = (q, signal) => search({ q, type: "panel", signal });
231
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const getIsLowMemory: () => boolean;
2
+ export declare const getIsCriticalMemory: () => boolean;
3
+ export declare const getCurrentCacheMax: () => number;
4
+ export declare function initMemoryMonitor(cacheRef: Map<unknown, unknown>): void;
5
+ export declare function destroyMemoryMonitor(): void;
6
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,cAAc,QAAO,OAAsB,CAAC;AACzD,eAAO,MAAM,mBAAmB,QAAO,OAA2B,CAAC;AACnE,eAAO,MAAM,kBAAkB,QAAO,MAAyB,CAAC;AAEhE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAevE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C"}
package/dist/memory.js ADDED
@@ -0,0 +1,79 @@
1
+ // src/memory.ts
2
+ import { getConfig } from "./config.js";
3
+ import { emit } from "./events.js";
4
+ const capabilities = {
5
+ performanceMemory: typeof performance !== "undefined" &&
6
+ !!performance.memory,
7
+ deviceMemory: typeof navigator !== "undefined" &&
8
+ typeof navigator.deviceMemory === "number",
9
+ };
10
+ let isLowMemory = false;
11
+ let isCriticalMemory = false;
12
+ let currentCacheMax = 0;
13
+ let _monitorTimer = null;
14
+ export const getIsLowMemory = () => isLowMemory;
15
+ export const getIsCriticalMemory = () => isCriticalMemory;
16
+ export const getCurrentCacheMax = () => currentCacheMax;
17
+ export function initMemoryMonitor(cacheRef) {
18
+ if (_monitorTimer !== null) {
19
+ clearInterval(_monitorTimer);
20
+ _monitorTimer = null;
21
+ }
22
+ const cfg = getConfig();
23
+ currentCacheMax = cfg.CACHE_MAX;
24
+ const nav = navigator;
25
+ if (capabilities.deviceMemory && nav.deviceMemory !== undefined && nav.deviceMemory <= 2) {
26
+ currentCacheMax = cfg.CACHE_LOW_MEMORY;
27
+ }
28
+ _monitorTimer = setInterval(() => _check(cacheRef), cfg.MEMORY_CHECK_INTERVAL);
29
+ }
30
+ export function destroyMemoryMonitor() {
31
+ if (_monitorTimer !== null) {
32
+ clearInterval(_monitorTimer);
33
+ _monitorTimer = null;
34
+ }
35
+ isLowMemory = false;
36
+ isCriticalMemory = false;
37
+ }
38
+ function _check(cacheRef) {
39
+ const cfg = getConfig();
40
+ let pressure = 0;
41
+ if (capabilities.performanceMemory) {
42
+ const mem = performance.memory;
43
+ pressure = Math.max(pressure, (mem.usedJSHeapSize / mem.jsHeapSizeLimit) * 100);
44
+ }
45
+ if (cacheRef.size > currentCacheMax * 0.85) {
46
+ pressure = Math.max(pressure, 65);
47
+ }
48
+ const prevLow = isLowMemory;
49
+ const prevCritical = isCriticalMemory;
50
+ const normalThreshold = cfg.MEMORY_PRESSURE_NORMAL * 100;
51
+ const criticalThreshold = cfg.MEMORY_PRESSURE_CRITICAL * 100;
52
+ isCriticalMemory = pressure > criticalThreshold;
53
+ isLowMemory = pressure > normalThreshold;
54
+ if (isLowMemory !== prevLow || isCriticalMemory !== prevCritical) {
55
+ emit("memoryStateChange", { isLow: isLowMemory, isCritical: isCriticalMemory });
56
+ }
57
+ if (isLowMemory) {
58
+ const target = isCriticalMemory
59
+ ? Math.ceil(cfg.CACHE_LOW_MEMORY * 0.5)
60
+ : cfg.CACHE_LOW_MEMORY;
61
+ if (currentCacheMax > target) {
62
+ _trimCache(cacheRef, target);
63
+ currentCacheMax = target;
64
+ }
65
+ }
66
+ else if (!isLowMemory && prevLow) {
67
+ currentCacheMax = Math.min(cfg.CACHE_MAX, Math.ceil(currentCacheMax * 1.5));
68
+ }
69
+ }
70
+ function _trimCache(cacheRef, maxSize) {
71
+ while (cacheRef.size > maxSize) {
72
+ const firstKey = cacheRef.keys().next().value;
73
+ if (firstKey !== undefined)
74
+ cacheRef.delete(firstKey);
75
+ else
76
+ break;
77
+ }
78
+ }
79
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ type RetryTask = () => Promise<void>;
2
+ export declare function getIsOnline(): boolean;
3
+ export declare function initOfflineMonitor(): void;
4
+ export declare function destroyOfflineMonitor(): void;
5
+ export declare function addRetryTask(task: RetryTask): void;
6
+ export {};
7
+ //# sourceMappingURL=offline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAGA,KAAK,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAMrC,wBAAgB,WAAW,IAAI,OAAO,CAAsB;AAE5D,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAElD"}
@@ -0,0 +1,39 @@
1
+ // src/offline.ts
2
+ import { emit } from "./events.js";
3
+ const _pendingRetries = [];
4
+ let _isOnline = true;
5
+ let _initialized = false;
6
+ export function getIsOnline() { return _isOnline; }
7
+ export function initOfflineMonitor() {
8
+ if (_initialized || typeof window === "undefined")
9
+ return;
10
+ _initialized = true;
11
+ _isOnline = navigator.onLine;
12
+ window.addEventListener("online", _handleOnline);
13
+ window.addEventListener("offline", _handleOffline);
14
+ }
15
+ export function destroyOfflineMonitor() {
16
+ if (typeof window !== "undefined") {
17
+ window.removeEventListener("online", _handleOnline);
18
+ window.removeEventListener("offline", _handleOffline);
19
+ }
20
+ _initialized = false;
21
+ _isOnline = true;
22
+ _pendingRetries.length = 0;
23
+ }
24
+ export function addRetryTask(task) {
25
+ if (_pendingRetries.length < 50)
26
+ _pendingRetries.push(task);
27
+ }
28
+ function _handleOnline() {
29
+ _isOnline = true;
30
+ emit("online");
31
+ const tasks = _pendingRetries.splice(0);
32
+ for (const task of tasks)
33
+ task().catch(() => { });
34
+ }
35
+ function _handleOffline() {
36
+ _isOnline = false;
37
+ emit("offline");
38
+ }
39
+ //# sourceMappingURL=offline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.js","sourceRoot":"","sources":["../src/offline.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAInC,MAAM,eAAe,GAAgB,EAAE,CAAC;AACxC,IAAI,SAAS,GAAG,IAAI,CAAC;AACrB,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,WAAW,KAAc,OAAO,SAAS,CAAC,CAAC,CAAC;AAE5D,MAAM,UAAU,kBAAkB;IAChC,IAAI,YAAY,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1D,YAAY,GAAG,IAAI,CAAC;IACpB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;IAC7B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAG,aAAa,CAAC,CAAC;IAClD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAG,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IACD,YAAY,GAAG,KAAK,CAAC;IACrB,SAAS,GAAG,IAAI,CAAC;IACjB,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,IAAI,eAAe,CAAC,MAAM,GAAG,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa;IACpB,SAAS,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,cAAc;IACrB,SAAS,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC,SAAS,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { SearchType } from "./index.js";
2
+ export interface BaseMeta {
3
+ _idx: number;
4
+ title?: string;
5
+ url?: string;
6
+ }
7
+ export interface WebMeta extends BaseMeta {
8
+ summary?: string;
9
+ favicon?: string;
10
+ }
11
+ export interface ImageMeta extends BaseMeta {
12
+ thumbnail?: string;
13
+ domain?: string;
14
+ }
15
+ export interface VideoMeta extends BaseMeta {
16
+ thumbnail?: string;
17
+ duration?: string;
18
+ publishedDate?: string;
19
+ }
20
+ export interface NewsMeta extends BaseMeta {
21
+ summary?: string;
22
+ favicon?: string;
23
+ publishedDate?: string;
24
+ }
25
+ export type ResultMeta = WebMeta | ImageMeta | VideoMeta | NewsMeta | BaseMeta;
26
+ export type ResultDetail = ResultMeta & {
27
+ [key: string]: unknown;
28
+ };
29
+ export interface ParsedResponse {
30
+ meta: ResultMeta[];
31
+ raw: unknown;
32
+ }
33
+ export declare function extractMeta(data: unknown, type?: SearchType, lowMemory?: boolean): ResultMeta[];
34
+ export declare function extractDetail(data: unknown, idx: number): ResultDetail | null;
35
+ export declare function chunkToMeta(chunk: unknown, type?: SearchType, lowMemory?: boolean): ResultMeta | null;
36
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,OAAQ,SAAQ,QAAQ;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAAE;AACjF,MAAM,WAAW,SAAU,SAAQ,QAAQ;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAAE;AACpF,MAAM,WAAW,SAAU,SAAQ,QAAQ;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAAE;AAC9G,MAAM,WAAW,QAAS,SAAQ,QAAQ;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAAE;AAC1G,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACnE,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;CAAE;AAqBrE,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,UAAkB,EACxB,SAAS,UAAQ,GAChB,UAAU,EAAE,CAed;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAgB7E;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,UAAkB,EACxB,SAAS,UAAQ,GAChB,UAAU,GAAG,IAAI,CAQnB"}
package/dist/parser.js ADDED
@@ -0,0 +1,118 @@
1
+ const META_FIELDS_BY_TYPE = {
2
+ web: ["title", "url", "summary", "favicon"],
3
+ news: ["title", "url", "summary", "favicon", "publishedDate"],
4
+ image: ["title", "url", "thumbnail", "domain"],
5
+ video: ["title", "url", "thumbnail", "duration", "publishedDate"],
6
+ };
7
+ const HEAVY_FIELDS = new Set(["summary"]);
8
+ const FIELD_ALIASES = {
9
+ url: ["url", "href", "link"],
10
+ thumbnail: ["thumbnail", "image", "img", "thumb"],
11
+ favicon: ["favicon", "icon"],
12
+ domain: ["domain", "source", "siteName"],
13
+ summary: ["summary", "description", "snippet", "desc", "content"],
14
+ publishedDate: ["publishedDate", "date", "published", "publishedAt"],
15
+ duration: ["duration", "length"],
16
+ };
17
+ export function extractMeta(data, type = "web", lowMemory = false) {
18
+ const fields = _fieldsForType(type, lowMemory);
19
+ const arr = _toArray(data);
20
+ const result = new Array(arr.length);
21
+ for (let i = 0; i < arr.length; i++) {
22
+ const obj = _safeObj(arr[i]);
23
+ const meta = { _idx: i };
24
+ for (const f of fields) {
25
+ const v = _resolve(obj, f);
26
+ if (v !== undefined)
27
+ meta[f] = v;
28
+ }
29
+ // _idx は必ず存在するので unknown 経由のキャストで型安全
30
+ result[i] = meta;
31
+ }
32
+ return result;
33
+ }
34
+ export function extractDetail(data, idx) {
35
+ const arr = _toArray(data);
36
+ if (idx < 0 || idx >= arr.length)
37
+ return null;
38
+ const obj = _safeObj(arr[idx]);
39
+ return {
40
+ _idx: idx,
41
+ title: _resolve(obj, "title"),
42
+ url: _resolve(obj, "url"),
43
+ thumbnail: _resolve(obj, "thumbnail"),
44
+ favicon: _resolve(obj, "favicon"),
45
+ domain: _resolve(obj, "domain"),
46
+ summary: _resolve(obj, "summary"),
47
+ duration: _resolve(obj, "duration"),
48
+ publishedDate: _resolve(obj, "publishedDate"),
49
+ ...obj,
50
+ };
51
+ }
52
+ export function chunkToMeta(chunk, type = "web", lowMemory = false) {
53
+ if (!chunk)
54
+ return null;
55
+ const fields = _fieldsForType(type, lowMemory);
56
+ const tryObj = _safeObj(chunk);
57
+ if ("title" in tryObj || "url" in tryObj)
58
+ return _buildMeta(tryObj, fields);
59
+ const arr = _toArray(chunk);
60
+ if (arr.length > 0)
61
+ return chunkToMeta(arr[0], type, lowMemory);
62
+ return null;
63
+ }
64
+ function _fieldsForType(type, lowMemory) {
65
+ const base = META_FIELDS_BY_TYPE[type] ?? ["title", "url"];
66
+ if (!lowMemory)
67
+ return base;
68
+ return base.filter((f) => !HEAVY_FIELDS.has(f));
69
+ }
70
+ function _buildMeta(obj, fields) {
71
+ const meta = {
72
+ _idx: typeof obj._idx === "number" ? obj._idx : 0,
73
+ };
74
+ for (const f of fields) {
75
+ const v = _resolve(obj, f);
76
+ if (v !== undefined)
77
+ meta[f] = v;
78
+ }
79
+ return meta;
80
+ }
81
+ function _resolve(obj, field) {
82
+ const aliases = FIELD_ALIASES[field];
83
+ if (aliases) {
84
+ for (const key of aliases) {
85
+ const v = _str(obj[key]);
86
+ if (v !== undefined)
87
+ return v;
88
+ }
89
+ return undefined;
90
+ }
91
+ return _str(obj[field]);
92
+ }
93
+ function _safeObj(v) {
94
+ return v && typeof v === "object" ? v : {};
95
+ }
96
+ function _str(v) {
97
+ if (typeof v === "string") {
98
+ const s = v.trim();
99
+ return s.length > 0 ? s : undefined;
100
+ }
101
+ if (typeof v === "number")
102
+ return String(v);
103
+ return undefined;
104
+ }
105
+ function _toArray(data) {
106
+ if (Array.isArray(data))
107
+ return data;
108
+ if (data && typeof data === "object") {
109
+ const obj = data;
110
+ for (const key of ["results", "items", "data", "hits", "entries", "docs"]) {
111
+ const v = obj[key];
112
+ if (Array.isArray(v))
113
+ return v;
114
+ }
115
+ }
116
+ return [];
117
+ }
118
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}