@lobu/connector-sdk 6.1.1 → 7.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.
- package/dist/browser/acquire.d.ts +7 -0
- package/dist/browser/acquire.d.ts.map +1 -1
- package/dist/browser/acquire.js +68 -16
- package/dist/browser/acquire.js.map +1 -1
- package/dist/browser/cdp-page.d.ts.map +1 -1
- package/dist/browser/cdp-page.js +40 -12
- package/dist/browser/cdp-page.js.map +1 -1
- package/dist/browser/launcher.d.ts +1 -2
- package/dist/browser/launcher.d.ts.map +1 -1
- package/dist/browser/launcher.js +1 -1
- package/dist/browser/launcher.js.map +1 -1
- package/dist/browser-network.d.ts +6 -0
- package/dist/browser-network.d.ts.map +1 -1
- package/dist/browser-network.js +78 -31
- package/dist/browser-network.js.map +1 -1
- package/dist/connector-types.d.ts +32 -0
- package/dist/connector-types.d.ts.map +1 -1
- package/dist/connector-types.js.map +1 -1
- package/dist/index.d.ts +2 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +0 -134
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/api-paginated.d.ts +0 -79
- package/dist/api-paginated.d.ts.map +0 -1
- package/dist/api-paginated.js +0 -120
- package/dist/api-paginated.js.map +0 -1
- package/dist/base.d.ts +0 -65
- package/dist/base.d.ts.map +0 -1
- package/dist/base.js +0 -122
- package/dist/base.js.map +0 -1
- package/dist/browser-paginated.d.ts +0 -141
- package/dist/browser-paginated.d.ts.map +0 -1
- package/dist/browser-paginated.js +0 -269
- package/dist/browser-paginated.js.map +0 -1
- package/dist/http.d.ts +0 -18
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -74
- package/dist/http.js.map +0 -1
- package/dist/paginated.d.ts +0 -93
- package/dist/paginated.d.ts.map +0 -1
- package/dist/paginated.js +0 -167
- package/dist/paginated.js.map +0 -1
package/dist/paginated.d.ts
DELETED
|
@@ -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
|
package/dist/paginated.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/paginated.js
DELETED
|
@@ -1,167 +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, RateLimitError } from './base.js';
|
|
9
|
-
import { sdkLogger } from './logger.js';
|
|
10
|
-
/**
|
|
11
|
-
* Base class for feeds with cursor/page-based pagination
|
|
12
|
-
*/
|
|
13
|
-
export class PaginatedFeed extends BaseFeed {
|
|
14
|
-
/**
|
|
15
|
-
* Default pagination configuration
|
|
16
|
-
*/
|
|
17
|
-
getPaginationConfig() {
|
|
18
|
-
return {
|
|
19
|
-
maxPages: 50,
|
|
20
|
-
pageSize: 100,
|
|
21
|
-
rateLimitMs: 1000,
|
|
22
|
-
incrementalCheckpoint: false,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* OPTIONAL: Filter items before transformation
|
|
27
|
-
*/
|
|
28
|
-
filterItem(_item, _options) {
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* OPTIONAL: Extract parent ID for hierarchical content
|
|
33
|
-
*/
|
|
34
|
-
getParentId(_item) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* OPTIONAL: Extract pagination token from checkpoint
|
|
39
|
-
*/
|
|
40
|
-
getPaginationToken(checkpoint) {
|
|
41
|
-
return checkpoint?.pagination_token ?? null;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* OPTIONAL: Create checkpoint with feed-specific fields
|
|
45
|
-
*/
|
|
46
|
-
createCheckpoint(existing, latestContent, nextToken, itemsProcessed) {
|
|
47
|
-
return {
|
|
48
|
-
updated_at: new Date(),
|
|
49
|
-
last_timestamp: latestContent?.occurred_at ?? existing?.last_timestamp,
|
|
50
|
-
pagination_token: nextToken,
|
|
51
|
-
total_items_processed: (existing?.total_items_processed || 0) + itemsProcessed,
|
|
52
|
-
initial_complete: existing?.initial_complete ?? false,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Main pagination loop - handles both initial and incremental syncs
|
|
57
|
-
*/
|
|
58
|
-
async paginate(options, checkpoint, env, updateCheckpointFn) {
|
|
59
|
-
const config = this.getPaginationConfig();
|
|
60
|
-
const existingToken = this.getPaginationToken(checkpoint);
|
|
61
|
-
const parentMap = new Map();
|
|
62
|
-
const initialComplete = checkpoint?.initial_complete ?? (!!checkpoint?.last_timestamp && !existingToken);
|
|
63
|
-
const isIncremental = initialComplete && !existingToken;
|
|
64
|
-
const lookbackDate = this.getLookbackDate(options);
|
|
65
|
-
const checkpointTimestamp = checkpoint?.last_timestamp ?? null;
|
|
66
|
-
const checkpointDate = checkpointTimestamp
|
|
67
|
-
? checkpointTimestamp instanceof Date
|
|
68
|
-
? checkpointTimestamp
|
|
69
|
-
: new Date(checkpointTimestamp)
|
|
70
|
-
: null;
|
|
71
|
-
const boundaryDate = initialComplete && checkpointDate ? checkpointDate : lookbackDate;
|
|
72
|
-
const allContents = [];
|
|
73
|
-
let cursor = isIncremental ? null : existingToken;
|
|
74
|
-
let pageCount = 0;
|
|
75
|
-
let stopReason = null;
|
|
76
|
-
let rateLimitRetryMs;
|
|
77
|
-
const modeLabel = isIncremental ? 'incremental' : cursor ? 'resumed' : 'initial';
|
|
78
|
-
sdkLogger.info(`[${this.type}] Starting ${modeLabel} sync (max ${config.maxPages} pages)`);
|
|
79
|
-
while (pageCount < config.maxPages) {
|
|
80
|
-
if (pageCount > 0) {
|
|
81
|
-
await this.sleep(config.rateLimitMs);
|
|
82
|
-
}
|
|
83
|
-
let result;
|
|
84
|
-
try {
|
|
85
|
-
result = await this.fetchPage(cursor, options, env);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
if (error instanceof RateLimitError) {
|
|
89
|
-
sdkLogger.warn({ error: error.message }, `[${this.type}] Rate limit hit after ${pageCount} pages, pausing`);
|
|
90
|
-
stopReason = 'rate_limited';
|
|
91
|
-
rateLimitRetryMs = error.retryAfterMs;
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
throw error;
|
|
95
|
-
}
|
|
96
|
-
const rawCount = result.rawCount ?? result.items.length;
|
|
97
|
-
if (result.items.length === 0) {
|
|
98
|
-
sdkLogger.info(`[${this.type}] Empty page at ${pageCount + 1}, stopping`);
|
|
99
|
-
stopReason = 'empty_page';
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
const pageContents = [];
|
|
103
|
-
for (const item of result.items) {
|
|
104
|
-
if (!this.filterItem(item, options))
|
|
105
|
-
continue;
|
|
106
|
-
const content = this.transformItem(item, options);
|
|
107
|
-
pageContents.push(content);
|
|
108
|
-
const parentId = this.getParentId(item);
|
|
109
|
-
if (parentId) {
|
|
110
|
-
parentMap.set(content.origin_id, parentId);
|
|
111
|
-
if (!content.origin_parent_id) {
|
|
112
|
-
content.origin_parent_id = parentId;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
const boundaryContents = pageContents.filter((c) => c.occurred_at >= boundaryDate);
|
|
117
|
-
allContents.push(...boundaryContents);
|
|
118
|
-
pageCount++;
|
|
119
|
-
sdkLogger.info(`[${this.type}] Page ${pageCount}: raw=${rawCount}, ` +
|
|
120
|
-
`filtered=${pageContents.length}, recent=${boundaryContents.length}, ` +
|
|
121
|
-
`nextToken=${result.nextToken ? 'yes' : 'no'}`);
|
|
122
|
-
if (config.incrementalCheckpoint && updateCheckpointFn && allContents.length > 0) {
|
|
123
|
-
const incrementalCP = this.createCheckpoint(checkpoint, allContents[0], result.nextToken, boundaryContents.length);
|
|
124
|
-
await updateCheckpointFn(incrementalCP);
|
|
125
|
-
sdkLogger.debug(`[${this.type}] Saved incremental checkpoint after page ${pageCount}`);
|
|
126
|
-
}
|
|
127
|
-
if (boundaryContents.length === 0 && pageContents.length > 0) {
|
|
128
|
-
sdkLogger.info(`[${this.type}] Reached boundary after ${pageCount} pages`);
|
|
129
|
-
stopReason = 'boundary';
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
if (result.items.length < config.pageSize) {
|
|
133
|
-
sdkLogger.info(`[${this.type}] Partial page (${result.items.length}/${config.pageSize}), end reached`);
|
|
134
|
-
stopReason = 'partial_page';
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
if (!result.nextToken) {
|
|
138
|
-
sdkLogger.info(`[${this.type}] No next token after page ${pageCount}, end reached`);
|
|
139
|
-
stopReason = 'no_next_token';
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
cursor = result.nextToken;
|
|
143
|
-
}
|
|
144
|
-
if (!stopReason && pageCount >= config.maxPages) {
|
|
145
|
-
stopReason = 'max_pages';
|
|
146
|
-
}
|
|
147
|
-
if (stopReason === 'max_pages') {
|
|
148
|
-
sdkLogger.warn(`[${this.type}] Hit max page limit (${config.maxPages})`);
|
|
149
|
-
}
|
|
150
|
-
sdkLogger.info(`[${this.type}] Pagination complete: ${allContents.length} items from ${pageCount} pages`);
|
|
151
|
-
const resumeToken = stopReason === 'max_pages' || stopReason === 'rate_limited' ? cursor : null;
|
|
152
|
-
const shouldMarkComplete = initialComplete ||
|
|
153
|
-
(!initialComplete && stopReason !== 'max_pages' && stopReason !== 'rate_limited');
|
|
154
|
-
const nextSyncRecommendedAt = stopReason === 'rate_limited'
|
|
155
|
-
? new Date(Date.now() + (rateLimitRetryMs ?? config.rateLimitMs))
|
|
156
|
-
: undefined;
|
|
157
|
-
const finalCheckpoint = this.createCheckpoint(checkpoint, allContents[0] || null, resumeToken, allContents.length);
|
|
158
|
-
finalCheckpoint.initial_complete = shouldMarkComplete;
|
|
159
|
-
return {
|
|
160
|
-
contents: allContents,
|
|
161
|
-
checkpoint: finalCheckpoint,
|
|
162
|
-
parentMap: parentMap.size > 0 ? parentMap : undefined,
|
|
163
|
-
nextSyncRecommendedAt,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=paginated.js.map
|
package/dist/paginated.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paginated.js","sourceRoot":"","sources":["../src/paginated.ts"],"names":[],"mappings":"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"}
|