quickbase-js 1.2.0 → 2.0.0-alpha.2
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 +351 -227
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +29 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/sso-token.d.ts +28 -0
- package/dist/auth/sso-token.d.ts.map +1 -0
- package/dist/auth/sso-token.js +108 -0
- package/dist/auth/sso-token.js.map +1 -0
- package/dist/auth/temp-token.d.ts +31 -0
- package/dist/auth/temp-token.d.ts.map +1 -0
- package/dist/auth/temp-token.js +121 -0
- package/dist/auth/temp-token.js.map +1 -0
- package/dist/auth/token-cache.d.ts +44 -0
- package/dist/auth/token-cache.d.ts.map +1 -0
- package/dist/auth/token-cache.js +84 -0
- package/dist/auth/token-cache.js.map +1 -0
- package/dist/auth/types.d.ts +44 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user-token.d.ts +17 -0
- package/dist/auth/user-token.d.ts.map +1 -0
- package/dist/auth/user-token.js +30 -0
- package/dist/auth/user-token.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/pagination.d.ts +131 -0
- package/dist/client/pagination.d.ts.map +1 -0
- package/dist/client/pagination.js +226 -0
- package/dist/client/pagination.js.map +1 -0
- package/dist/client/request.d.ts +40 -0
- package/dist/client/request.d.ts.map +1 -0
- package/dist/client/request.js +194 -0
- package/dist/client/request.js.map +1 -0
- package/dist/client/retry.d.ts +41 -0
- package/dist/client/retry.d.ts.map +1 -0
- package/dist/client/retry.js +122 -0
- package/dist/client/retry.js.map +1 -0
- package/dist/client/throttle.d.ts +46 -0
- package/dist/client/throttle.d.ts.map +1 -0
- package/dist/client/throttle.js +85 -0
- package/dist/client/throttle.js.map +1 -0
- package/dist/core/config.d.ts +13 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +120 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dates.d.ts +18 -0
- package/dist/core/dates.d.ts.map +1 -0
- package/dist/core/dates.js +58 -0
- package/dist/core/dates.js.map +1 -0
- package/dist/core/errors.d.ts +134 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +185 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +41 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +96 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +154 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +23 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generated/client.d.ts +18 -0
- package/dist/generated/client.d.ts.map +1 -0
- package/dist/generated/client.js +1390 -0
- package/dist/generated/client.js.map +1 -0
- package/dist/generated/types.d.ts +3827 -0
- package/dist/generated/types.d.ts.map +1 -0
- package/dist/generated/types.js +8 -0
- package/dist/generated/types.js.map +1 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/quickbase.esm.js +7 -0
- package/dist/quickbase.esm.js.map +7 -0
- package/dist/quickbase.min.js +7 -0
- package/dist/quickbase.min.js.map +7 -0
- package/package.json +57 -86
- package/dist/esm/quickbase.d.ts +0 -8094
- package/dist/esm/quickbase.js +0 -8333
- package/dist/esm/quickbase.js.map +0 -1
- package/dist/esm/quickbase.min.js +0 -2
- package/dist/esm/quickbase.min.js.map +0 -1
- package/dist/umd/quickbase.umd.js +0 -8909
- package/dist/umd/quickbase.umd.js.map +0 -1
- package/dist/umd/quickbase.umd.min.js +0 -2
- package/dist/umd/quickbase.umd.min.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpF,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,KAAK,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAUpB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination support with fluent API
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic pagination for QuickBase API endpoints that return
|
|
5
|
+
* paginated results. Supports both skip-based and token-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Fetch single page (default)
|
|
10
|
+
* const page = await client.runQuery({ ... });
|
|
11
|
+
*
|
|
12
|
+
* // Fetch all pages automatically
|
|
13
|
+
* const all = await client.runQuery({ ... }).all();
|
|
14
|
+
*
|
|
15
|
+
* // Fetch with record limit
|
|
16
|
+
* const limited = await client.runQuery({ ... }).paginate({ limit: 500 });
|
|
17
|
+
*
|
|
18
|
+
* // Explicitly single page (if autoPaginate is enabled globally)
|
|
19
|
+
* const single = await client.runQuery({ ... }).noPaginate();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Pagination options for controlling automatic pagination behavior
|
|
24
|
+
*/
|
|
25
|
+
export interface PaginationOptions {
|
|
26
|
+
/** Maximum number of records to fetch across all pages */
|
|
27
|
+
limit?: number;
|
|
28
|
+
/** Starting offset for skip-based pagination */
|
|
29
|
+
skip?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Metadata returned with paginated responses
|
|
33
|
+
*/
|
|
34
|
+
export interface PaginationMetadata {
|
|
35
|
+
totalRecords?: number;
|
|
36
|
+
numRecords?: number;
|
|
37
|
+
numFields?: number;
|
|
38
|
+
skip?: number;
|
|
39
|
+
top?: number;
|
|
40
|
+
nextPageToken?: string;
|
|
41
|
+
nextToken?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A paginated response from the QuickBase API
|
|
45
|
+
*/
|
|
46
|
+
export interface PaginatedResponse<T = unknown> {
|
|
47
|
+
data?: T[];
|
|
48
|
+
fields?: Array<{
|
|
49
|
+
id: number;
|
|
50
|
+
label: string;
|
|
51
|
+
type: string;
|
|
52
|
+
}>;
|
|
53
|
+
metadata: PaginationMetadata;
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Determines the type of pagination from a response
|
|
58
|
+
*/
|
|
59
|
+
export type PaginationType = 'skip' | 'token' | 'none';
|
|
60
|
+
/**
|
|
61
|
+
* Detect pagination type from response metadata
|
|
62
|
+
*/
|
|
63
|
+
export declare function detectPaginationType(metadata: PaginationMetadata): PaginationType;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a response has more pages available
|
|
66
|
+
*/
|
|
67
|
+
export declare function hasMorePages(response: PaginatedResponse, paginationType: PaginationType, currentCount: number): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Find the data array key in a response object
|
|
70
|
+
*/
|
|
71
|
+
export declare function findDataKey(response: PaginatedResponse): string;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a response looks like a paginated response
|
|
74
|
+
*/
|
|
75
|
+
export declare function isPaginatedResponse(response: unknown): response is PaginatedResponse;
|
|
76
|
+
/**
|
|
77
|
+
* Request executor function type
|
|
78
|
+
*/
|
|
79
|
+
export type RequestExecutor<T> = () => Promise<T>;
|
|
80
|
+
/**
|
|
81
|
+
* Request executor with pagination parameters
|
|
82
|
+
*/
|
|
83
|
+
export type PaginatedRequestExecutor<T> = (params: {
|
|
84
|
+
skip?: number;
|
|
85
|
+
nextPageToken?: string;
|
|
86
|
+
nextToken?: string;
|
|
87
|
+
}) => Promise<T>;
|
|
88
|
+
/**
|
|
89
|
+
* A thenable request that supports fluent pagination methods
|
|
90
|
+
*
|
|
91
|
+
* This class wraps an API request and allows chaining pagination methods
|
|
92
|
+
* while still being directly awaitable.
|
|
93
|
+
*/
|
|
94
|
+
export declare class PaginatedRequest<T> implements PromiseLike<T> {
|
|
95
|
+
private readonly executor;
|
|
96
|
+
private readonly paginatedExecutor?;
|
|
97
|
+
private readonly defaultAutoPaginate;
|
|
98
|
+
constructor(executor: RequestExecutor<T>, options?: {
|
|
99
|
+
paginatedExecutor?: PaginatedRequestExecutor<T>;
|
|
100
|
+
autoPaginate?: boolean;
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* Implement PromiseLike to allow direct awaiting
|
|
104
|
+
* Default behavior respects the global autoPaginate setting
|
|
105
|
+
*/
|
|
106
|
+
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
107
|
+
/**
|
|
108
|
+
* Fetch all pages and combine results
|
|
109
|
+
*/
|
|
110
|
+
all(): Promise<T>;
|
|
111
|
+
/**
|
|
112
|
+
* Fetch pages with optional limit
|
|
113
|
+
*/
|
|
114
|
+
paginate(options?: PaginationOptions): Promise<T>;
|
|
115
|
+
/**
|
|
116
|
+
* Explicitly fetch only a single page (no pagination)
|
|
117
|
+
*/
|
|
118
|
+
noPaginate(): Promise<T>;
|
|
119
|
+
/**
|
|
120
|
+
* Get the underlying promise (for compatibility)
|
|
121
|
+
*/
|
|
122
|
+
toPromise(): Promise<T>;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create a paginated request wrapper
|
|
126
|
+
*/
|
|
127
|
+
export declare function createPaginatedRequest<T>(executor: RequestExecutor<T>, options?: {
|
|
128
|
+
paginatedExecutor?: PaginatedRequestExecutor<T>;
|
|
129
|
+
autoPaginate?: boolean;
|
|
130
|
+
}): PaginatedRequest<T>;
|
|
131
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/client/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination support with fluent API
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic pagination for QuickBase API endpoints that return
|
|
5
|
+
* paginated results. Supports both skip-based and token-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Fetch single page (default)
|
|
10
|
+
* const page = await client.runQuery({ ... });
|
|
11
|
+
*
|
|
12
|
+
* // Fetch all pages automatically
|
|
13
|
+
* const all = await client.runQuery({ ... }).all();
|
|
14
|
+
*
|
|
15
|
+
* // Fetch with record limit
|
|
16
|
+
* const limited = await client.runQuery({ ... }).paginate({ limit: 500 });
|
|
17
|
+
*
|
|
18
|
+
* // Explicitly single page (if autoPaginate is enabled globally)
|
|
19
|
+
* const single = await client.runQuery({ ... }).noPaginate();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Detect pagination type from response metadata
|
|
24
|
+
*/
|
|
25
|
+
export function detectPaginationType(metadata) {
|
|
26
|
+
if (metadata.totalRecords !== undefined && metadata.skip !== undefined) {
|
|
27
|
+
return 'skip';
|
|
28
|
+
}
|
|
29
|
+
if (metadata.nextPageToken !== undefined || metadata.nextToken !== undefined) {
|
|
30
|
+
return 'token';
|
|
31
|
+
}
|
|
32
|
+
return 'none';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a response has more pages available
|
|
36
|
+
*/
|
|
37
|
+
export function hasMorePages(response, paginationType, currentCount) {
|
|
38
|
+
const { metadata } = response;
|
|
39
|
+
if (paginationType === 'skip') {
|
|
40
|
+
return (metadata.totalRecords !== undefined &&
|
|
41
|
+
currentCount < metadata.totalRecords);
|
|
42
|
+
}
|
|
43
|
+
if (paginationType === 'token') {
|
|
44
|
+
const nextToken = metadata.nextPageToken ?? metadata.nextToken;
|
|
45
|
+
return nextToken !== undefined && nextToken !== '';
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Find the data array key in a response object
|
|
51
|
+
*/
|
|
52
|
+
export function findDataKey(response) {
|
|
53
|
+
for (const key of Object.keys(response)) {
|
|
54
|
+
if (Array.isArray(response[key])) {
|
|
55
|
+
return key;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return 'data';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a response looks like a paginated response
|
|
62
|
+
*/
|
|
63
|
+
export function isPaginatedResponse(response) {
|
|
64
|
+
if (!response || typeof response !== 'object') {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const obj = response;
|
|
68
|
+
// Must have metadata object
|
|
69
|
+
if (!obj.metadata || typeof obj.metadata !== 'object') {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
// Must have an array field
|
|
73
|
+
const hasArrayField = Object.values(obj).some(Array.isArray);
|
|
74
|
+
if (!hasArrayField) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const metadata = obj.metadata;
|
|
78
|
+
// Check for pagination indicators
|
|
79
|
+
return (metadata.totalRecords !== undefined ||
|
|
80
|
+
metadata.numRecords !== undefined ||
|
|
81
|
+
metadata.nextPageToken !== undefined ||
|
|
82
|
+
metadata.nextToken !== undefined);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A thenable request that supports fluent pagination methods
|
|
86
|
+
*
|
|
87
|
+
* This class wraps an API request and allows chaining pagination methods
|
|
88
|
+
* while still being directly awaitable.
|
|
89
|
+
*/
|
|
90
|
+
export class PaginatedRequest {
|
|
91
|
+
executor;
|
|
92
|
+
paginatedExecutor;
|
|
93
|
+
defaultAutoPaginate;
|
|
94
|
+
constructor(executor, options) {
|
|
95
|
+
this.executor = executor;
|
|
96
|
+
this.paginatedExecutor = options?.paginatedExecutor;
|
|
97
|
+
this.defaultAutoPaginate = options?.autoPaginate ?? false;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Implement PromiseLike to allow direct awaiting
|
|
101
|
+
* Default behavior respects the global autoPaginate setting
|
|
102
|
+
*/
|
|
103
|
+
then(onfulfilled, onrejected) {
|
|
104
|
+
const promise = this.defaultAutoPaginate ? this.all() : this.executor();
|
|
105
|
+
return promise.then(onfulfilled, onrejected);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Fetch all pages and combine results
|
|
109
|
+
*/
|
|
110
|
+
async all() {
|
|
111
|
+
return this.paginate({});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Fetch pages with optional limit
|
|
115
|
+
*/
|
|
116
|
+
async paginate(options = {}) {
|
|
117
|
+
if (!this.paginatedExecutor) {
|
|
118
|
+
// Not a paginated endpoint, just execute normally
|
|
119
|
+
return this.executor();
|
|
120
|
+
}
|
|
121
|
+
const { limit, skip: initialSkip = 0 } = options;
|
|
122
|
+
let allRecords = [];
|
|
123
|
+
let lastResponse = null;
|
|
124
|
+
let paginationType = 'none';
|
|
125
|
+
let currentSkip = initialSkip;
|
|
126
|
+
let nextToken;
|
|
127
|
+
// Fetch first page
|
|
128
|
+
const firstResponse = await this.paginatedExecutor({ skip: initialSkip });
|
|
129
|
+
if (!isPaginatedResponse(firstResponse)) {
|
|
130
|
+
// Not a paginated response, return as-is
|
|
131
|
+
return firstResponse;
|
|
132
|
+
}
|
|
133
|
+
lastResponse = firstResponse;
|
|
134
|
+
paginationType = detectPaginationType(firstResponse.metadata);
|
|
135
|
+
const dataKey = findDataKey(firstResponse);
|
|
136
|
+
const firstPageData = firstResponse[dataKey] || [];
|
|
137
|
+
allRecords = [...firstPageData];
|
|
138
|
+
// Initialize continuation state
|
|
139
|
+
if (paginationType === 'skip') {
|
|
140
|
+
currentSkip = initialSkip + firstPageData.length;
|
|
141
|
+
}
|
|
142
|
+
else if (paginationType === 'token') {
|
|
143
|
+
nextToken = firstResponse.metadata.nextPageToken ?? firstResponse.metadata.nextToken;
|
|
144
|
+
}
|
|
145
|
+
// Fetch remaining pages
|
|
146
|
+
while (hasMorePages(lastResponse, paginationType, allRecords.length)) {
|
|
147
|
+
// Check limit
|
|
148
|
+
if (limit !== undefined && allRecords.length >= limit) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
// Fetch next page
|
|
152
|
+
let nextResponse;
|
|
153
|
+
if (paginationType === 'skip') {
|
|
154
|
+
nextResponse = await this.paginatedExecutor({ skip: currentSkip });
|
|
155
|
+
}
|
|
156
|
+
else if (paginationType === 'token' && nextToken) {
|
|
157
|
+
const tokenKey = lastResponse.metadata.nextPageToken !== undefined
|
|
158
|
+
? 'nextPageToken'
|
|
159
|
+
: 'nextToken';
|
|
160
|
+
nextResponse = await this.paginatedExecutor({ [tokenKey]: nextToken });
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
lastResponse = nextResponse;
|
|
166
|
+
const pageData = nextResponse[dataKey] || [];
|
|
167
|
+
// Check for empty response
|
|
168
|
+
if (pageData.length === 0) {
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
// Apply limit if needed
|
|
172
|
+
if (limit !== undefined) {
|
|
173
|
+
const remainingCapacity = limit - allRecords.length;
|
|
174
|
+
allRecords = allRecords.concat(pageData.slice(0, remainingCapacity));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
allRecords = allRecords.concat(pageData);
|
|
178
|
+
}
|
|
179
|
+
// Update continuation state
|
|
180
|
+
if (paginationType === 'skip') {
|
|
181
|
+
currentSkip += pageData.length;
|
|
182
|
+
}
|
|
183
|
+
else if (paginationType === 'token') {
|
|
184
|
+
nextToken = nextResponse.metadata.nextPageToken ?? nextResponse.metadata.nextToken;
|
|
185
|
+
if (!nextToken) {
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Build final response
|
|
191
|
+
const finalResponse = {
|
|
192
|
+
...lastResponse,
|
|
193
|
+
[dataKey]: allRecords,
|
|
194
|
+
metadata: {
|
|
195
|
+
...lastResponse.metadata,
|
|
196
|
+
numRecords: allRecords.length,
|
|
197
|
+
skip: initialSkip,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
// Clear pagination tokens in final response
|
|
201
|
+
if (paginationType === 'token') {
|
|
202
|
+
delete finalResponse.metadata.nextPageToken;
|
|
203
|
+
delete finalResponse.metadata.nextToken;
|
|
204
|
+
}
|
|
205
|
+
return finalResponse;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Explicitly fetch only a single page (no pagination)
|
|
209
|
+
*/
|
|
210
|
+
async noPaginate() {
|
|
211
|
+
return this.executor();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get the underlying promise (for compatibility)
|
|
215
|
+
*/
|
|
216
|
+
toPromise() {
|
|
217
|
+
return this.then();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Create a paginated request wrapper
|
|
222
|
+
*/
|
|
223
|
+
export function createPaginatedRequest(executor, options) {
|
|
224
|
+
return new PaginatedRequest(executor, options);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/client/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request execution module
|
|
3
|
+
*
|
|
4
|
+
* Handles the full request lifecycle:
|
|
5
|
+
* 1. Authentication
|
|
6
|
+
* 2. Throttling (if enabled)
|
|
7
|
+
* 3. Request execution
|
|
8
|
+
* 4. Error handling with retry
|
|
9
|
+
*/
|
|
10
|
+
import type { ResolvedConfig } from '../core/types.js';
|
|
11
|
+
import type { AuthStrategy } from '../auth/types.js';
|
|
12
|
+
import type { Logger } from '../core/logger.js';
|
|
13
|
+
import type { Throttle } from './throttle.js';
|
|
14
|
+
export interface RequestOptions {
|
|
15
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
16
|
+
path: string;
|
|
17
|
+
body?: unknown;
|
|
18
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
19
|
+
/** Database ID for temp token auth */
|
|
20
|
+
dbid?: string;
|
|
21
|
+
/** Custom headers */
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export interface RequestExecutorOptions {
|
|
25
|
+
config: ResolvedConfig;
|
|
26
|
+
auth: AuthStrategy;
|
|
27
|
+
throttle: Throttle;
|
|
28
|
+
logger: Logger;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Execute a request with full retry logic
|
|
32
|
+
*/
|
|
33
|
+
export declare function executeRequest<T = unknown>(options: RequestOptions, executor: RequestExecutorOptions): Promise<T>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a request executor
|
|
36
|
+
*/
|
|
37
|
+
export declare function createRequestExecutor(options: RequestExecutorOptions): {
|
|
38
|
+
execute: <T = unknown>(requestOptions: RequestOptions) => Promise<T>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/client/request.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAY9C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9D,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsID;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,CAAC,CAAC,CA2EZ;AAcD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB;cAEvD,CAAC,4BAA4B,cAAc;EAGxD"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request execution module
|
|
3
|
+
*
|
|
4
|
+
* Handles the full request lifecycle:
|
|
5
|
+
* 1. Authentication
|
|
6
|
+
* 2. Throttling (if enabled)
|
|
7
|
+
* 3. Request execution
|
|
8
|
+
* 4. Error handling with retry
|
|
9
|
+
*/
|
|
10
|
+
import { QuickbaseError, RateLimitError, TimeoutError, parseErrorResponse, isRetryableError, } from '../core/errors.js';
|
|
11
|
+
import { extractRateLimitInfo, sleep } from './retry.js';
|
|
12
|
+
import { getRealmHostname } from '../core/config.js';
|
|
13
|
+
import { transformDates } from '../core/dates.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build URL with query parameters
|
|
16
|
+
*/
|
|
17
|
+
function buildUrl(baseUrl, path, query) {
|
|
18
|
+
const url = new URL(path, baseUrl);
|
|
19
|
+
if (query) {
|
|
20
|
+
for (const [key, value] of Object.entries(query)) {
|
|
21
|
+
if (value !== undefined) {
|
|
22
|
+
url.searchParams.set(key, String(value));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return url.toString();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create request headers
|
|
30
|
+
*/
|
|
31
|
+
async function buildHeaders(auth, realmHostname, dbid, customHeaders) {
|
|
32
|
+
const token = await auth.getToken(dbid);
|
|
33
|
+
const authHeader = auth.getAuthorizationHeader(token);
|
|
34
|
+
return {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
'QB-Realm-Hostname': realmHostname,
|
|
37
|
+
'Authorization': authHeader,
|
|
38
|
+
...customHeaders,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Execute a single request (no retry logic)
|
|
43
|
+
*/
|
|
44
|
+
async function executeSingleRequest(options, executor, _context) {
|
|
45
|
+
const { config, auth, throttle, logger } = executor;
|
|
46
|
+
const url = buildUrl(config.baseUrl, options.path, options.query);
|
|
47
|
+
const realmHostname = getRealmHostname(config.realm);
|
|
48
|
+
// Get auth headers
|
|
49
|
+
const headers = await buildHeaders(auth, realmHostname, options.dbid, options.headers);
|
|
50
|
+
// Apply throttling if enabled
|
|
51
|
+
await throttle.acquire();
|
|
52
|
+
// Build fetch options
|
|
53
|
+
const fetchOptions = {
|
|
54
|
+
method: options.method,
|
|
55
|
+
headers,
|
|
56
|
+
};
|
|
57
|
+
if (options.body !== undefined) {
|
|
58
|
+
fetchOptions.body = JSON.stringify(options.body);
|
|
59
|
+
}
|
|
60
|
+
// Create abort controller for timeout
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timeoutId = setTimeout(() => controller.abort(), config.timeout);
|
|
63
|
+
fetchOptions.signal = controller.signal;
|
|
64
|
+
const startTime = Date.now();
|
|
65
|
+
try {
|
|
66
|
+
const response = await config.fetchApi(url, fetchOptions);
|
|
67
|
+
const duration = Date.now() - startTime;
|
|
68
|
+
logger.timing(options.method, options.path, duration);
|
|
69
|
+
return response;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
73
|
+
throw new TimeoutError(config.timeout);
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
clearTimeout(timeoutId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Handle response and throw appropriate errors
|
|
83
|
+
*/
|
|
84
|
+
async function handleResponse(response, requestUrl, context, executor) {
|
|
85
|
+
const { config, logger } = executor;
|
|
86
|
+
if (response.ok) {
|
|
87
|
+
return response;
|
|
88
|
+
}
|
|
89
|
+
// Extract rate limit info for 429s
|
|
90
|
+
if (response.status === 429) {
|
|
91
|
+
const rateLimitInfo = extractRateLimitInfo(response, requestUrl, context.attempt);
|
|
92
|
+
logger.rateLimit({
|
|
93
|
+
url: requestUrl,
|
|
94
|
+
status: 429,
|
|
95
|
+
retryAfter: rateLimitInfo.retryAfter,
|
|
96
|
+
attempt: context.attempt,
|
|
97
|
+
rayId: rateLimitInfo.qbApiRay || rateLimitInfo.cfRay,
|
|
98
|
+
});
|
|
99
|
+
// Notify callback
|
|
100
|
+
if (config.onRateLimit) {
|
|
101
|
+
config.onRateLimit(rateLimitInfo);
|
|
102
|
+
}
|
|
103
|
+
throw new RateLimitError(rateLimitInfo);
|
|
104
|
+
}
|
|
105
|
+
// Parse and throw appropriate error
|
|
106
|
+
throw await parseErrorResponse(response, requestUrl);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Execute a request with full retry logic
|
|
110
|
+
*/
|
|
111
|
+
export async function executeRequest(options, executor) {
|
|
112
|
+
const { config, auth, logger } = executor;
|
|
113
|
+
const maxAttempts = config.retry.maxAttempts;
|
|
114
|
+
const context = {
|
|
115
|
+
methodName: `${options.method} ${options.path}`,
|
|
116
|
+
attempt: 1,
|
|
117
|
+
maxAttempts,
|
|
118
|
+
dbid: options.dbid,
|
|
119
|
+
startTime: Date.now(),
|
|
120
|
+
};
|
|
121
|
+
let lastError = null;
|
|
122
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
123
|
+
context.attempt = attempt;
|
|
124
|
+
try {
|
|
125
|
+
const response = await executeSingleRequest(options, executor, context);
|
|
126
|
+
const url = buildUrl(config.baseUrl, options.path, options.query);
|
|
127
|
+
await handleResponse(response, url, context, executor);
|
|
128
|
+
// Parse JSON response and optionally transform dates
|
|
129
|
+
const data = await response.json();
|
|
130
|
+
return transformDates(data, config.convertDates);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
lastError = error;
|
|
134
|
+
// Check if error is retryable
|
|
135
|
+
if (!isRetryableError(error)) {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
// Don't retry if we've exhausted attempts
|
|
139
|
+
if (attempt >= maxAttempts) {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
// Handle auth errors specially - try to refresh token
|
|
143
|
+
if (error instanceof QuickbaseError && error.statusCode === 401) {
|
|
144
|
+
const refreshed = await auth.handleAuthError(options.dbid);
|
|
145
|
+
if (!refreshed) {
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
logger.debug('Token refreshed, retrying request');
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// Calculate retry delay
|
|
152
|
+
let delayMs;
|
|
153
|
+
let reason;
|
|
154
|
+
if (error instanceof RateLimitError) {
|
|
155
|
+
delayMs = error.retryAfter
|
|
156
|
+
? error.retryAfter * 1000
|
|
157
|
+
: calculateBackoff(attempt, config.retry);
|
|
158
|
+
reason = 'Rate limited (429)';
|
|
159
|
+
}
|
|
160
|
+
else if (error instanceof TimeoutError) {
|
|
161
|
+
delayMs = calculateBackoff(attempt, config.retry);
|
|
162
|
+
reason = 'Timeout';
|
|
163
|
+
}
|
|
164
|
+
else if (error instanceof QuickbaseError && error.statusCode >= 500) {
|
|
165
|
+
delayMs = calculateBackoff(attempt, config.retry);
|
|
166
|
+
reason = `Server error (${error.statusCode})`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
delayMs = calculateBackoff(attempt, config.retry);
|
|
170
|
+
reason = 'Retryable error';
|
|
171
|
+
}
|
|
172
|
+
logger.retry(attempt, maxAttempts, delayMs, reason);
|
|
173
|
+
await sleep(delayMs);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
throw lastError || new Error('Request failed');
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Calculate exponential backoff delay with jitter
|
|
180
|
+
*/
|
|
181
|
+
function calculateBackoff(attempt, config) {
|
|
182
|
+
const delay = config.initialDelayMs * Math.pow(config.multiplier, attempt - 1);
|
|
183
|
+
const jitter = delay * 0.1 * (Math.random() * 2 - 1);
|
|
184
|
+
return Math.min(delay + jitter, config.maxDelayMs);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a request executor
|
|
188
|
+
*/
|
|
189
|
+
export function createRequestExecutor(options) {
|
|
190
|
+
return {
|
|
191
|
+
execute: (requestOptions) => executeRequest(requestOptions, options),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/client/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry logic with exponential backoff
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - HTTP 429 (Rate Limited) - uses Retry-After header
|
|
6
|
+
* - HTTP 5xx (Server Errors) - exponential backoff
|
|
7
|
+
* - Timeout errors - exponential backoff
|
|
8
|
+
*/
|
|
9
|
+
import type { RequestContext, RateLimitInfo, ResolvedConfig } from '../core/types.js';
|
|
10
|
+
import type { Logger } from '../core/logger.js';
|
|
11
|
+
export interface RetryOptions {
|
|
12
|
+
maxAttempts: number;
|
|
13
|
+
initialDelayMs: number;
|
|
14
|
+
maxDelayMs: number;
|
|
15
|
+
multiplier: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Calculate delay for exponential backoff
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateBackoffDelay(attempt: number, options: RetryOptions): number;
|
|
21
|
+
/**
|
|
22
|
+
* Get delay from Retry-After header or fall back to backoff calculation
|
|
23
|
+
*/
|
|
24
|
+
export declare function getRetryDelay(response: Response | null, attempt: number, options: RetryOptions): number;
|
|
25
|
+
/**
|
|
26
|
+
* Extract rate limit info from response headers
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractRateLimitInfo(response: Response, requestUrl: string, attempt: number): RateLimitInfo;
|
|
29
|
+
/**
|
|
30
|
+
* Sleep for a given duration
|
|
31
|
+
*/
|
|
32
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Determine if a response status is retryable
|
|
35
|
+
*/
|
|
36
|
+
export declare function isRetryableStatus(status: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Execute a request with retry logic
|
|
39
|
+
*/
|
|
40
|
+
export declare function executeWithRetry<T>(fn: (context: RequestContext) => Promise<T>, context: RequestContext, config: ResolvedConfig, logger: Logger): Promise<T>;
|
|
41
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAQhD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GACpB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GACpB,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,aAAa,CAaf;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3C,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,CAAC,CAuDZ"}
|