@lobu/connector-sdk 6.1.1 → 7.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.
Files changed (59) hide show
  1. package/dist/browser/acquire.d.ts +7 -0
  2. package/dist/browser/acquire.d.ts.map +1 -1
  3. package/dist/browser/acquire.js +68 -16
  4. package/dist/browser/acquire.js.map +1 -1
  5. package/dist/browser/cdp-page.d.ts.map +1 -1
  6. package/dist/browser/cdp-page.js +111 -29
  7. package/dist/browser/cdp-page.js.map +1 -1
  8. package/dist/browser/cdp.d.ts.map +1 -1
  9. package/dist/browser/cdp.js +10 -7
  10. package/dist/browser/cdp.js.map +1 -1
  11. package/dist/browser/devtools-active-port.d.ts +20 -0
  12. package/dist/browser/devtools-active-port.d.ts.map +1 -0
  13. package/dist/browser/devtools-active-port.js +46 -0
  14. package/dist/browser/devtools-active-port.js.map +1 -0
  15. package/dist/browser/launcher.d.ts +1 -2
  16. package/dist/browser/launcher.d.ts.map +1 -1
  17. package/dist/browser/launcher.js +12 -9
  18. package/dist/browser/launcher.js.map +1 -1
  19. package/dist/browser/mirror-cookies.d.ts +64 -0
  20. package/dist/browser/mirror-cookies.d.ts.map +1 -0
  21. package/dist/browser/mirror-cookies.js +293 -0
  22. package/dist/browser/mirror-cookies.js.map +1 -0
  23. package/dist/browser-network.d.ts +6 -0
  24. package/dist/browser-network.d.ts.map +1 -1
  25. package/dist/browser-network.js +106 -35
  26. package/dist/browser-network.js.map +1 -1
  27. package/dist/connector-types.d.ts +32 -0
  28. package/dist/connector-types.d.ts.map +1 -1
  29. package/dist/connector-types.js.map +1 -1
  30. package/dist/index.d.ts +2 -10
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +0 -6
  33. package/dist/index.js.map +1 -1
  34. package/dist/retry.d.ts.map +1 -1
  35. package/dist/retry.js +59 -86
  36. package/dist/retry.js.map +1 -1
  37. package/dist/types.d.ts +0 -134
  38. package/dist/types.d.ts.map +1 -1
  39. package/package.json +19 -3
  40. package/dist/api-paginated.d.ts +0 -79
  41. package/dist/api-paginated.d.ts.map +0 -1
  42. package/dist/api-paginated.js +0 -120
  43. package/dist/api-paginated.js.map +0 -1
  44. package/dist/base.d.ts +0 -65
  45. package/dist/base.d.ts.map +0 -1
  46. package/dist/base.js +0 -122
  47. package/dist/base.js.map +0 -1
  48. package/dist/browser-paginated.d.ts +0 -141
  49. package/dist/browser-paginated.d.ts.map +0 -1
  50. package/dist/browser-paginated.js +0 -269
  51. package/dist/browser-paginated.js.map +0 -1
  52. package/dist/http.d.ts +0 -18
  53. package/dist/http.d.ts.map +0 -1
  54. package/dist/http.js +0 -74
  55. package/dist/http.js.map +0 -1
  56. package/dist/paginated.d.ts +0 -93
  57. package/dist/paginated.d.ts.map +0 -1
  58. package/dist/paginated.js +0 -167
  59. package/dist/paginated.js.map +0 -1
@@ -1,141 +0,0 @@
1
- /**
2
- * Browser Paginated Feed Base Class
3
- *
4
- * Extends PaginatedFeed for browser-based feeds (Playwright).
5
- */
6
- import type { Cookie, Page } from 'playwright';
7
- import type { PageFetchResult, PaginatedCheckpoint, PaginationConfig } from './paginated.js';
8
- import { PaginatedFeed } from './paginated.js';
9
- import type { Checkpoint, Env, FeedOptions, FeedSyncResult, SessionState } from './types.js';
10
- /**
11
- * Browser session state - Playwright-compatible format
12
- */
13
- export interface BrowserSessionState extends SessionState {
14
- /** Playwright-compatible cookies */
15
- cookies?: Cookie[];
16
- /** localStorage key-value pairs (applied via page.evaluate) */
17
- localStorage?: Record<string, string>;
18
- /** Extra HTTP headers to set */
19
- headers?: Record<string, string>;
20
- }
21
- /**
22
- * Cookie consent configuration for handling cookie banners
23
- */
24
- export interface CookieConsentConfig {
25
- /** CSS selectors to detect cookie consent banner */
26
- bannerSelectors: string[];
27
- /** CSS selectors for accept button */
28
- acceptSelectors: string[];
29
- /** Timeout in ms to wait for banner (default: 2000) */
30
- timeout?: number;
31
- }
32
- /**
33
- * CAPTCHA detection configuration
34
- */
35
- export interface CaptchaConfig {
36
- /** Enable CAPTCHA detection (default: false) */
37
- enabled: boolean;
38
- /** CSS selectors that indicate CAPTCHA presence */
39
- selectors?: string[];
40
- /** Text patterns in page content that indicate CAPTCHA */
41
- textPatterns?: string[];
42
- }
43
- /**
44
- * Browser configuration for the feed
45
- */
46
- export interface BrowserFeedConfig {
47
- /** Enable stealth mode to avoid bot detection (default: true) */
48
- stealth: boolean;
49
- /** Custom viewport dimensions (default: browser default) */
50
- viewport?: {
51
- width: number;
52
- height: number;
53
- };
54
- /** Custom user agent (default: browser default) */
55
- userAgent?: string;
56
- /** Navigation waitUntil option */
57
- waitUntil: 'load' | 'domcontentloaded' | 'networkidle';
58
- /** Navigation timeout in ms (default: 60000) */
59
- navigationTimeout: number;
60
- /** Cookie consent handling configuration */
61
- cookieConsent?: CookieConsentConfig;
62
- /** CAPTCHA detection configuration */
63
- captcha?: CaptchaConfig;
64
- }
65
- /**
66
- * Browser-specific pagination configuration
67
- */
68
- export interface BrowserPaginationConfig extends PaginationConfig {
69
- /** Number of pages to fetch per sync run (default: 1, G2 uses 5) */
70
- pagesPerRun: number;
71
- /** Delay between page navigations in ms (default: 2000) */
72
- pageDelayMs: number;
73
- }
74
- /**
75
- * Base class for browser-based feeds with pagination
76
- */
77
- export declare abstract class BrowserPaginatedFeed<TItem, TCheckpoint extends PaginatedCheckpoint = PaginatedCheckpoint> extends PaginatedFeed<TItem, TCheckpoint> {
78
- readonly apiType: "browser";
79
- private _browser;
80
- private _page;
81
- private _screenshotDir;
82
- private _isFirstPage;
83
- private _currentPageNumber;
84
- /**
85
- * ABSTRACT: Get browser configuration for this feed
86
- */
87
- protected abstract getBrowserConfig(): BrowserFeedConfig;
88
- /**
89
- * ABSTRACT: Get base URL from feed options
90
- */
91
- protected abstract getBaseUrl(options: FeedOptions): string;
92
- /**
93
- * ABSTRACT: Build URL for a specific page number
94
- */
95
- protected abstract buildPageUrl(baseUrl: string, pageNumber: number): string;
96
- /**
97
- * ABSTRACT: Wait for page content to be ready after navigation
98
- */
99
- protected abstract waitForContent(page: Page): Promise<void>;
100
- /**
101
- * ABSTRACT: Extract items from the current page DOM
102
- */
103
- protected abstract extractItems(page: Page): Promise<TItem[]>;
104
- /**
105
- * Browser-specific pagination configuration
106
- */
107
- protected getBrowserPaginationConfig(): BrowserPaginationConfig;
108
- /**
109
- * Override pull() to manage browser lifecycle
110
- */
111
- pull(options: FeedOptions, checkpoint: TCheckpoint | null, env: Env, sessionState?: SessionState | null, updateCheckpointFn?: (checkpoint: Checkpoint) => Promise<void>): Promise<FeedSyncResult>;
112
- /**
113
- * Apply session state to browser page before navigation
114
- */
115
- protected applySessionState(page: Page, sessionState: BrowserSessionState): Promise<void>;
116
- /**
117
- * Capture browser session state after sync for persistence
118
- */
119
- protected captureSessionState(page: Page): Promise<BrowserSessionState>;
120
- /**
121
- * fetchPage() implementation for browser-based pagination
122
- */
123
- protected fetchPage(cursor: string | null, options: FeedOptions, _env: Env): Promise<PageFetchResult<TItem>>;
124
- /**
125
- * Handle cookie consent banner
126
- */
127
- protected handleCookieConsent(page: Page, config: CookieConsentConfig): Promise<void>;
128
- /**
129
- * Check for CAPTCHA and throw if detected
130
- */
131
- protected checkForCaptcha(page: Page, config: CaptchaConfig): Promise<void>;
132
- /**
133
- * Get current page number
134
- */
135
- protected getCurrentPageNumber(): number;
136
- /**
137
- * Get the Playwright page instance
138
- */
139
- protected getPage(): Page | null;
140
- }
141
- //# sourceMappingURL=browser-paginated.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-paginated.d.ts","sourceRoot":"","sources":["../src/browser-paginated.ts"],"names":[],"mappings":"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"}
@@ -1,269 +0,0 @@
1
- /// <reference lib="dom" />
2
- /**
3
- * Browser Paginated Feed Base Class
4
- *
5
- * Extends PaginatedFeed for browser-based feeds (Playwright).
6
- */
7
- import { captureErrorArtifacts, launchBrowser } from './browser/launcher.js';
8
- import { sdkLogger } from './logger.js';
9
- import { PaginatedFeed } from './paginated.js';
10
- /**
11
- * Base class for browser-based feeds with pagination
12
- */
13
- export class BrowserPaginatedFeed extends PaginatedFeed {
14
- apiType = 'browser';
15
- _browser = null;
16
- _page = null;
17
- _screenshotDir = '';
18
- _isFirstPage = true;
19
- _currentPageNumber = 0;
20
- /**
21
- * Browser-specific pagination configuration
22
- */
23
- getBrowserPaginationConfig() {
24
- return {
25
- ...this.getPaginationConfig(),
26
- pagesPerRun: 1,
27
- pageDelayMs: 2000,
28
- };
29
- }
30
- /**
31
- * Override pull() to manage browser lifecycle
32
- */
33
- async pull(options, checkpoint, env, sessionState, updateCheckpointFn) {
34
- const config = this.getBrowserConfig();
35
- const browserSessionState = sessionState;
36
- const { browser, screenshotDir } = await launchBrowser(env, { stealth: config.stealth });
37
- this._browser = browser;
38
- this._page = (await browser.newPage());
39
- this._screenshotDir = screenshotDir;
40
- this._isFirstPage = true;
41
- this._currentPageNumber = 0;
42
- if (config.viewport) {
43
- await this._page.setViewportSize(config.viewport);
44
- }
45
- if (config.userAgent) {
46
- await this._page.setExtraHTTPHeaders({
47
- 'User-Agent': config.userAgent,
48
- });
49
- }
50
- if (browserSessionState) {
51
- await this.applySessionState(this._page, browserSessionState);
52
- }
53
- try {
54
- const result = await this.paginate(options, checkpoint, env, updateCheckpointFn);
55
- let parentMapRecord;
56
- if (result.parentMap && result.parentMap.size > 0) {
57
- parentMapRecord = Object.fromEntries(result.parentMap);
58
- }
59
- const capturedSessionState = await this.captureSessionState(this._page);
60
- return {
61
- contents: result.contents,
62
- checkpoint: result.checkpoint,
63
- metadata: {
64
- items_found: result.contents.length,
65
- items_skipped: 0,
66
- parent_map: parentMapRecord,
67
- next_sync_recommended_at: result.nextSyncRecommendedAt,
68
- },
69
- auth_update: capturedSessionState,
70
- };
71
- }
72
- catch (error) {
73
- if (this._page) {
74
- await captureErrorArtifacts(this._page, error, this.type, this._screenshotDir);
75
- }
76
- throw error;
77
- }
78
- finally {
79
- if (this._browser) {
80
- await this._browser.close();
81
- this._browser = null;
82
- this._page = null;
83
- }
84
- }
85
- }
86
- /**
87
- * Apply session state to browser page before navigation
88
- */
89
- async applySessionState(page, sessionState) {
90
- if (sessionState.cookies && sessionState.cookies.length > 0) {
91
- try {
92
- await page.context().addCookies(sessionState.cookies);
93
- sdkLogger.info({ cookieCount: sessionState.cookies.length }, `[${this.type}] Applied session cookies`);
94
- }
95
- catch (error) {
96
- sdkLogger.warn({ error }, `[${this.type}] Failed to apply session cookies`);
97
- }
98
- }
99
- if (sessionState.headers && Object.keys(sessionState.headers).length > 0) {
100
- try {
101
- await page.setExtraHTTPHeaders(sessionState.headers);
102
- sdkLogger.info({ headerCount: Object.keys(sessionState.headers).length }, `[${this.type}] Applied session headers`);
103
- }
104
- catch (error) {
105
- sdkLogger.warn({ error }, `[${this.type}] Failed to apply session headers`);
106
- }
107
- }
108
- if (sessionState.localStorage && Object.keys(sessionState.localStorage).length > 0) {
109
- sdkLogger.debug({ keyCount: Object.keys(sessionState.localStorage).length }, `[${this.type}] localStorage will be applied after first navigation`);
110
- }
111
- }
112
- /**
113
- * Capture browser session state after sync for persistence
114
- */
115
- async captureSessionState(page) {
116
- const sessionState = {};
117
- try {
118
- const cookies = await page.context().cookies();
119
- if (cookies.length > 0) {
120
- sessionState.cookies = cookies;
121
- sdkLogger.debug({ cookieCount: cookies.length }, `[${this.type}] Captured session cookies`);
122
- }
123
- }
124
- catch (error) {
125
- sdkLogger.warn({ error }, `[${this.type}] Failed to capture session cookies`);
126
- }
127
- try {
128
- const localStorage = await page.evaluate(() => {
129
- const storage = {};
130
- for (let i = 0; i < window.localStorage.length; i++) {
131
- const key = window.localStorage.key(i);
132
- if (key) {
133
- storage[key] = window.localStorage.getItem(key) || '';
134
- }
135
- }
136
- return storage;
137
- });
138
- if (Object.keys(localStorage).length > 0) {
139
- sessionState.localStorage = localStorage;
140
- sdkLogger.debug({ keyCount: Object.keys(localStorage).length }, `[${this.type}] Captured localStorage`);
141
- }
142
- }
143
- catch (error) {
144
- sdkLogger.debug({ error }, `[${this.type}] Could not capture localStorage (may be expected)`);
145
- }
146
- return sessionState;
147
- }
148
- /**
149
- * fetchPage() implementation for browser-based pagination
150
- */
151
- async fetchPage(cursor, options, _env) {
152
- const pageNumber = cursor ? parseInt(cursor, 10) : 1;
153
- this._currentPageNumber = pageNumber;
154
- const baseUrl = this.getBaseUrl(options);
155
- const pageUrl = this.buildPageUrl(baseUrl, pageNumber);
156
- const config = this.getBrowserConfig();
157
- const paginationConfig = this.getBrowserPaginationConfig();
158
- const page = this._page;
159
- sdkLogger.info({ pageUrl, pageNumber, maxPages: paginationConfig.pagesPerRun }, `[${this.type}] Fetching page`);
160
- await page.goto(pageUrl, {
161
- waitUntil: config.waitUntil,
162
- timeout: config.navigationTimeout,
163
- });
164
- if (this._isFirstPage && config.cookieConsent) {
165
- await this.handleCookieConsent(page, config.cookieConsent);
166
- this._isFirstPage = false;
167
- }
168
- if (config.captcha?.enabled) {
169
- await this.checkForCaptcha(page, config.captcha);
170
- }
171
- await this.waitForContent(page);
172
- const items = await this.extractItems(page);
173
- sdkLogger.info({ itemCount: items.length, pageNumber }, `[${this.type}] Extracted items from page`);
174
- const hasNext = items.length > 0 &&
175
- items.length >= paginationConfig.pageSize &&
176
- pageNumber < paginationConfig.pagesPerRun;
177
- if (hasNext && paginationConfig.pageDelayMs > 0) {
178
- await this.sleep(paginationConfig.pageDelayMs);
179
- }
180
- return {
181
- items,
182
- nextToken: hasNext ? String(pageNumber + 1) : null,
183
- rawCount: items.length,
184
- };
185
- }
186
- /**
187
- * Handle cookie consent banner
188
- */
189
- async handleCookieConsent(page, config) {
190
- try {
191
- const timeout = config.timeout ?? 2000;
192
- for (const selector of config.bannerSelectors) {
193
- try {
194
- const banner = await page.$(selector);
195
- if (banner) {
196
- for (const acceptSelector of config.acceptSelectors) {
197
- try {
198
- const acceptButton = await page.$(acceptSelector);
199
- if (acceptButton) {
200
- await acceptButton.click();
201
- await this.sleep(1000);
202
- sdkLogger.debug(`[${this.type}] Cookie consent accepted`);
203
- return;
204
- }
205
- }
206
- catch (_e) {
207
- // Try next accept selector
208
- }
209
- }
210
- }
211
- }
212
- catch (_e) {
213
- // Try next banner selector
214
- }
215
- }
216
- const bannerSelector = config.bannerSelectors.join(', ');
217
- try {
218
- await page.waitForSelector(bannerSelector, { timeout });
219
- const acceptSelector = config.acceptSelectors.join(', ');
220
- await page.click(acceptSelector);
221
- await this.sleep(1000);
222
- sdkLogger.debug(`[${this.type}] Cookie consent accepted (waited)`);
223
- }
224
- catch (_e) {
225
- // No cookie banner or already dismissed
226
- }
227
- }
228
- catch (_e) {
229
- sdkLogger.debug(`[${this.type}] No cookie banner found or already handled`);
230
- }
231
- }
232
- /**
233
- * Check for CAPTCHA and throw if detected
234
- */
235
- async checkForCaptcha(page, config) {
236
- const hasCaptcha = await page.evaluate((cfg) => {
237
- if (cfg.selectors) {
238
- for (const selector of cfg.selectors) {
239
- if (document.querySelector(selector))
240
- return true;
241
- }
242
- }
243
- if (cfg.textPatterns) {
244
- const bodyText = document.body.textContent || '';
245
- for (const pattern of cfg.textPatterns) {
246
- if (bodyText.includes(pattern))
247
- return true;
248
- }
249
- }
250
- return false;
251
- }, { selectors: config.selectors, textPatterns: config.textPatterns });
252
- if (hasCaptcha) {
253
- throw new Error(`CAPTCHA detected - ${this.displayName} blocking access`);
254
- }
255
- }
256
- /**
257
- * Get current page number
258
- */
259
- getCurrentPageNumber() {
260
- return this._currentPageNumber;
261
- }
262
- /**
263
- * Get the Playwright page instance
264
- */
265
- getPage() {
266
- return this._page;
267
- }
268
- }
269
- //# sourceMappingURL=browser-paginated.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-paginated.js","sourceRoot":"","sources":["../src/browser-paginated.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts DELETED
@@ -1,18 +0,0 @@
1
- import { type KyInstance, type Options } from 'ky';
2
- /**
3
- * Create a configured ky instance with custom options
4
- */
5
- export declare function createHttpClient(options?: Options): KyInstance;
6
- /**
7
- * Default HTTP client for feeds with standard User-Agent
8
- */
9
- export declare const httpClient: KyInstance;
10
- /**
11
- * Create an HTTP client with authentication headers
12
- */
13
- export declare function createAuthenticatedClient(authHeader: string, additionalHeaders?: Record<string, string>): KyInstance;
14
- /**
15
- * HTTP client for JSON APIs
16
- */
17
- export declare const jsonHttpClient: KyInstance;
18
- //# sourceMappingURL=http.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AA8BvD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAY9D;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAIrB,CAAC;AAEH;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,UAAU,CAQZ;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,YAMzB,CAAC"}
package/dist/http.js DELETED
@@ -1,74 +0,0 @@
1
- import ky from 'ky';
2
- /**
3
- * Shared HTTP client configuration for all feeds
4
- */
5
- /**
6
- * Default retry configuration
7
- * - Max 2 retries (3 total attempts)
8
- * - Only retry transient errors (429, 5xx)
9
- * - Exponential backoff up to 5 seconds
10
- * - 30s timeout per request
11
- */
12
- const defaultRetryConfig = {
13
- retry: {
14
- limit: 2, // Max 2 retries (3 total attempts)
15
- methods: ['get', 'post'],
16
- statusCodes: [
17
- 408, // Request Timeout
18
- 429, // Too Many Requests (rate limit)
19
- 500, // Internal Server Error
20
- 502, // Bad Gateway
21
- 503, // Service Unavailable
22
- 504, // Gateway Timeout
23
- ],
24
- backoffLimit: 5000, // Max 5 seconds delay between retries
25
- },
26
- timeout: 30000, // 30 second timeout per request
27
- };
28
- /**
29
- * Create a configured ky instance with custom options
30
- */
31
- export function createHttpClient(options) {
32
- return ky.create({
33
- ...defaultRetryConfig,
34
- ...options,
35
- // Merge retry config if provided
36
- retry: options?.retry
37
- ? {
38
- ...defaultRetryConfig.retry,
39
- ...(typeof options.retry === 'number' ? { limit: options.retry } : options.retry),
40
- }
41
- : defaultRetryConfig.retry,
42
- });
43
- }
44
- /**
45
- * Default HTTP client for feeds with standard User-Agent
46
- */
47
- export const httpClient = createHttpClient({
48
- headers: {
49
- 'User-Agent': 'UserResearchBot/1.0',
50
- },
51
- });
52
- /**
53
- * Create an HTTP client with authentication headers
54
- */
55
- export function createAuthenticatedClient(authHeader, additionalHeaders) {
56
- return createHttpClient({
57
- headers: {
58
- 'User-Agent': 'UserResearchBot/1.0',
59
- Authorization: authHeader,
60
- ...additionalHeaders,
61
- },
62
- });
63
- }
64
- /**
65
- * HTTP client for JSON APIs
66
- */
67
- export const jsonHttpClient = createHttpClient({
68
- headers: {
69
- 'User-Agent': 'UserResearchBot/1.0',
70
- Accept: 'application/json',
71
- 'Content-Type': 'application/json',
72
- },
73
- });
74
- //# sourceMappingURL=http.js.map
package/dist/http.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,MAAM,IAAI,CAAC;AAEvD;;GAEG;AAEH;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE;QACL,KAAK,EAAE,CAAC,EAAE,mCAAmC;QAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE;YACX,GAAG,EAAE,kBAAkB;YACvB,GAAG,EAAE,iCAAiC;YACtC,GAAG,EAAE,wBAAwB;YAC7B,GAAG,EAAE,cAAc;YACnB,GAAG,EAAE,sBAAsB;YAC3B,GAAG,EAAE,kBAAkB;SACxB;QACD,YAAY,EAAE,IAAI,EAAE,sCAAsC;KAC3D;IACD,OAAO,EAAE,KAAK,EAAE,gCAAgC;CACjD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAiB;IAChD,OAAO,EAAE,CAAC,MAAM,CAAC;QACf,GAAG,kBAAkB;QACrB,GAAG,OAAO;QACV,iCAAiC;QACjC,KAAK,EAAE,OAAO,EAAE,KAAK;YACnB,CAAC,CAAC;gBACE,GAAG,kBAAkB,CAAC,KAAK;gBAC3B,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;aAClF;YACH,CAAC,CAAC,kBAAkB,CAAC,KAAK;KAC7B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACzC,OAAO,EAAE;QACP,YAAY,EAAE,qBAAqB;KACpC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,iBAA0C;IAE1C,OAAO,gBAAgB,CAAC;QACtB,OAAO,EAAE;YACP,YAAY,EAAE,qBAAqB;YACnC,aAAa,EAAE,UAAU;YACzB,GAAG,iBAAiB;SACrB;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;IAC7C,OAAO,EAAE;QACP,YAAY,EAAE,qBAAqB;QACnC,MAAM,EAAE,kBAAkB;QAC1B,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAC"}
@@ -1,93 +0,0 @@
1
- /**
2
- * Paginated Feed Base Class
3
- *
4
- * Provides a reusable pagination pattern for feeds that fetch data in pages.
5
- * Uses the template method pattern - subclasses implement specific methods while
6
- * the base class handles the pagination loop, rate limiting, and checkpoint management.
7
- */
8
- import { BaseFeed } from './base.js';
9
- import type { Checkpoint, Content, Env, FeedOptions } from './types.js';
10
- /**
11
- * Configuration for pagination behavior
12
- */
13
- export interface PaginationConfig {
14
- /** Maximum pages to fetch (safety limit). Default: 50 */
15
- maxPages: number;
16
- /** Expected items per page (for partial page detection). Default: 100 */
17
- pageSize: number;
18
- /** Milliseconds to wait between page requests. Default: 1000 */
19
- rateLimitMs: number;
20
- /** Whether to update checkpoint after each page (for resume). Default: false */
21
- incrementalCheckpoint: boolean;
22
- }
23
- /**
24
- * Result from fetching a single page
25
- */
26
- export interface PageFetchResult<TItem> {
27
- /** Items from this page */
28
- items: TItem[];
29
- /** Token/cursor for next page (null = no more pages) */
30
- nextToken: string | null;
31
- /** Optional: raw item count before any filtering (for logging) */
32
- rawCount?: number;
33
- }
34
- /**
35
- * Extended checkpoint interface with pagination token
36
- */
37
- export interface PaginatedCheckpoint extends Checkpoint {
38
- /** Pagination token for resuming sync */
39
- pagination_token?: string | null;
40
- /** Whether initial sync completed (used to choose checkpoint boundary) */
41
- initial_complete?: boolean;
42
- }
43
- /**
44
- * Result from the paginate() method
45
- */
46
- export interface PaginateResult<TCheckpoint extends Checkpoint> {
47
- contents: Content[];
48
- checkpoint: TCheckpoint;
49
- parentMap?: Map<string, string>;
50
- nextSyncRecommendedAt?: Date;
51
- }
52
- /**
53
- * Base class for feeds with cursor/page-based pagination
54
- */
55
- export declare abstract class PaginatedFeed<TItem, TCheckpoint extends PaginatedCheckpoint = PaginatedCheckpoint> extends BaseFeed {
56
- /**
57
- * Default pagination configuration
58
- */
59
- protected getPaginationConfig(): PaginationConfig;
60
- /**
61
- * ABSTRACT: Fetch a single page of items from the platform
62
- */
63
- protected abstract fetchPage(cursor: string | null, options: FeedOptions, env: Env): Promise<PageFetchResult<TItem>>;
64
- /**
65
- * ABSTRACT: Transform a platform item to Content format
66
- */
67
- protected abstract transformItem(item: TItem, options: FeedOptions): Content;
68
- /**
69
- * ABSTRACT: Extract published date from platform item
70
- */
71
- protected abstract getItemDate(item: TItem): Date;
72
- /**
73
- * OPTIONAL: Filter items before transformation
74
- */
75
- protected filterItem(_item: TItem, _options: FeedOptions): boolean;
76
- /**
77
- * OPTIONAL: Extract parent ID for hierarchical content
78
- */
79
- protected getParentId(_item: TItem): string | null;
80
- /**
81
- * OPTIONAL: Extract pagination token from checkpoint
82
- */
83
- protected getPaginationToken(checkpoint: TCheckpoint | null): string | null;
84
- /**
85
- * OPTIONAL: Create checkpoint with feed-specific fields
86
- */
87
- protected createCheckpoint(existing: TCheckpoint | null, latestContent: Content | null, nextToken: string | null, itemsProcessed: number): TCheckpoint;
88
- /**
89
- * Main pagination loop - handles both initial and incremental syncs
90
- */
91
- protected paginate(options: FeedOptions, checkpoint: TCheckpoint | null, env: Env, updateCheckpointFn?: (checkpoint: Checkpoint) => Promise<void>): Promise<PaginateResult<TCheckpoint>>;
92
- }
93
- //# sourceMappingURL=paginated.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paginated.d.ts","sourceRoot":"","sources":["../src/paginated.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAkB,MAAM,WAAW,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,2BAA2B;IAC3B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,wDAAwD;IACxD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,WAAW,SAAS,UAAU;IAC5D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;IACxB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,8BAAsB,aAAa,CACjC,KAAK,EACL,WAAW,SAAS,mBAAmB,GAAG,mBAAmB,CAC7D,SAAQ,QAAQ;IAChB;;OAEG;IACH,SAAS,CAAC,mBAAmB,IAAI,gBAAgB;IASjD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAElC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO;IAE5E;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAEjD;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO;IAIlE;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAI3E;;OAEG;IACH,SAAS,CAAC,gBAAgB,CACxB,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,aAAa,EAAE,OAAO,GAAG,IAAI,EAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,cAAc,EAAE,MAAM,GACrB,WAAW;IAUd;;OAEG;cACa,QAAQ,CACtB,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,WAAW,GAAG,IAAI,EAC9B,GAAG,EAAE,GAAG,EACR,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7D,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;CA6JxC"}