@nangohq/runner-sdk 0.70.5 → 0.70.7
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/action.d.ts +4 -8
- package/dist/action.js +0 -102
- package/dist/action.js.map +1 -1
- package/dist/baseUrlOverrideDenylist.d.ts +11 -11
- package/dist/baseUrlOverrideDenylist.js +46 -26
- package/dist/baseUrlOverrideDenylist.js.map +1 -1
- package/dist/baseUrlOverrideDenylist.unit.test.js +76 -0
- package/dist/baseUrlOverrideDenylist.unit.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/paginate.service.unit.test.js +28 -19
- package/dist/paginate.service.unit.test.js.map +1 -1
- package/dist/uncontrolledFetch.d.ts +17 -0
- package/dist/uncontrolledFetch.js +192 -0
- package/dist/uncontrolledFetch.js.map +1 -0
- package/dist/uncontrolledFetch.unit.test.d.ts +1 -0
- package/dist/uncontrolledFetch.unit.test.js +490 -0
- package/dist/uncontrolledFetch.unit.test.js.map +1 -0
- package/models.d.ts +1 -0
- package/package.json +6 -6
- package/dist/action.uncontrolledFetch.unit.test.js +0 -182
- package/dist/action.uncontrolledFetch.unit.test.js.map +0 -1
- /package/dist/{action.uncontrolledFetch.unit.test.d.ts → baseUrlOverrideDenylist.unit.test.d.ts} +0 -0
|
@@ -3,11 +3,20 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
5
|
import PaginationService from './paginate.service.js';
|
|
6
|
+
function asAxiosResponse(partial) {
|
|
7
|
+
return {
|
|
8
|
+
status: 200,
|
|
9
|
+
statusText: 'OK',
|
|
10
|
+
headers: {},
|
|
11
|
+
config: {},
|
|
12
|
+
...partial
|
|
13
|
+
};
|
|
14
|
+
}
|
|
6
15
|
describe('PaginationService', () => {
|
|
7
16
|
describe('cursor pagination', () => {
|
|
8
17
|
let config;
|
|
9
18
|
let paginationConfig;
|
|
10
|
-
let proxy;
|
|
19
|
+
let proxy;
|
|
11
20
|
beforeEach(() => {
|
|
12
21
|
config = {
|
|
13
22
|
endpoint: '/test',
|
|
@@ -22,14 +31,14 @@ describe('PaginationService', () => {
|
|
|
22
31
|
limit_name_in_request: 'pagination.per_page',
|
|
23
32
|
response_path: 'data'
|
|
24
33
|
};
|
|
25
|
-
proxy = vi.fn().mockResolvedValue({
|
|
34
|
+
proxy = vi.fn().mockResolvedValue(asAxiosResponse({
|
|
26
35
|
data: {
|
|
27
36
|
data: [{ id: 1 }],
|
|
28
37
|
pages: {
|
|
29
38
|
next: { starting_after: 'next-cursor' }
|
|
30
39
|
}
|
|
31
40
|
}
|
|
32
|
-
});
|
|
41
|
+
}));
|
|
33
42
|
});
|
|
34
43
|
describe('dot notation handling', () => {
|
|
35
44
|
it('should expand dot notation in body parameters', async () => {
|
|
@@ -96,22 +105,22 @@ describe('PaginationService', () => {
|
|
|
96
105
|
});
|
|
97
106
|
it('should handle updates to cursor with dot notation', async () => {
|
|
98
107
|
proxy
|
|
99
|
-
.mockResolvedValueOnce({
|
|
108
|
+
.mockResolvedValueOnce(asAxiosResponse({
|
|
100
109
|
data: {
|
|
101
110
|
data: [{ id: 1 }],
|
|
102
111
|
pages: {
|
|
103
112
|
next: { starting_after: 'next-cursor' }
|
|
104
113
|
}
|
|
105
114
|
}
|
|
106
|
-
})
|
|
107
|
-
.mockResolvedValueOnce({
|
|
115
|
+
}))
|
|
116
|
+
.mockResolvedValueOnce(asAxiosResponse({
|
|
108
117
|
data: {
|
|
109
118
|
data: [{ id: 2 }],
|
|
110
119
|
pages: {
|
|
111
120
|
next: null
|
|
112
121
|
}
|
|
113
122
|
}
|
|
114
|
-
});
|
|
123
|
+
}));
|
|
115
124
|
const generator = PaginationService.cursor(config, paginationConfig, { 'pagination.per_page': 150 }, true, proxy);
|
|
116
125
|
await generator.next(); // First page
|
|
117
126
|
await generator.next(); // Second page
|
|
@@ -127,12 +136,12 @@ describe('PaginationService', () => {
|
|
|
127
136
|
});
|
|
128
137
|
describe('response handling', () => {
|
|
129
138
|
it('should stop pagination when no next cursor', async () => {
|
|
130
|
-
proxy.mockResolvedValueOnce({
|
|
139
|
+
proxy.mockResolvedValueOnce(asAxiosResponse({
|
|
131
140
|
data: {
|
|
132
141
|
data: [{ id: 1 }],
|
|
133
142
|
pages: { next: null }
|
|
134
143
|
}
|
|
135
|
-
});
|
|
144
|
+
}));
|
|
136
145
|
const generator = PaginationService.cursor(config, paginationConfig, { 'pagination.per_page': 150 }, true, proxy);
|
|
137
146
|
const first = await generator.next();
|
|
138
147
|
expect(first.value).toEqual([{ id: 1 }]);
|
|
@@ -142,24 +151,24 @@ describe('PaginationService', () => {
|
|
|
142
151
|
});
|
|
143
152
|
describe('error handling', () => {
|
|
144
153
|
it('should handle undefined response data', async () => {
|
|
145
|
-
proxy.mockResolvedValueOnce({
|
|
154
|
+
proxy.mockResolvedValueOnce(asAxiosResponse({
|
|
146
155
|
data: {
|
|
147
156
|
pages: { next: null }
|
|
148
157
|
}
|
|
149
|
-
});
|
|
158
|
+
}));
|
|
150
159
|
const generator = PaginationService.cursor(config, paginationConfig, { 'pagination.per_page': 150 }, true, proxy);
|
|
151
160
|
const result = await generator.next();
|
|
152
161
|
expect(result.done).toBe(true);
|
|
153
162
|
});
|
|
154
163
|
it('should handle invalid cursor values', async () => {
|
|
155
|
-
proxy.mockResolvedValueOnce({
|
|
164
|
+
proxy.mockResolvedValueOnce(asAxiosResponse({
|
|
156
165
|
data: {
|
|
157
166
|
data: [{ id: 1 }],
|
|
158
167
|
pages: {
|
|
159
168
|
next: { starting_after: ' ' } // Empty string with spaces
|
|
160
169
|
}
|
|
161
170
|
}
|
|
162
|
-
});
|
|
171
|
+
}));
|
|
163
172
|
const generator = PaginationService.cursor(config, paginationConfig, { 'pagination.per_page': 150 }, true, proxy);
|
|
164
173
|
const first = await generator.next();
|
|
165
174
|
expect(first.value).toEqual([{ id: 1 }]);
|
|
@@ -189,7 +198,7 @@ describe('PaginationService', () => {
|
|
|
189
198
|
response_path: 'data',
|
|
190
199
|
limit_name_in_request: 'limit'
|
|
191
200
|
};
|
|
192
|
-
proxy.mockResolvedValueOnce({
|
|
201
|
+
proxy.mockResolvedValueOnce(asAxiosResponse({
|
|
193
202
|
headers: {
|
|
194
203
|
link: '<https://api.example.com/next>; rel="next"'
|
|
195
204
|
},
|
|
@@ -199,7 +208,7 @@ describe('PaginationService', () => {
|
|
|
199
208
|
next_url: 'https://api.example.com/next-body'
|
|
200
209
|
}
|
|
201
210
|
}
|
|
202
|
-
});
|
|
211
|
+
}));
|
|
203
212
|
const generator = PaginationService.link(config, paginationConfig, {}, false, proxy);
|
|
204
213
|
const firstPage = await generator.next();
|
|
205
214
|
expect(firstPage.value).toEqual([{ id: 1 }]);
|
|
@@ -215,7 +224,7 @@ describe('PaginationService', () => {
|
|
|
215
224
|
response_path: 'data',
|
|
216
225
|
limit_name_in_request: 'limit'
|
|
217
226
|
};
|
|
218
|
-
proxy.mockResolvedValueOnce({
|
|
227
|
+
proxy.mockResolvedValueOnce(asAxiosResponse({
|
|
219
228
|
headers: {
|
|
220
229
|
link: undefined
|
|
221
230
|
},
|
|
@@ -225,7 +234,7 @@ describe('PaginationService', () => {
|
|
|
225
234
|
next_url: 'https://api.example.com/next-body'
|
|
226
235
|
}
|
|
227
236
|
}
|
|
228
|
-
});
|
|
237
|
+
}));
|
|
229
238
|
const generator = PaginationService.link(config, paginationConfig, {}, false, proxy);
|
|
230
239
|
const firstPage = await generator.next();
|
|
231
240
|
expect(firstPage.value).toEqual([{ id: 1 }]);
|
|
@@ -241,7 +250,7 @@ describe('PaginationService', () => {
|
|
|
241
250
|
response_path: 'data',
|
|
242
251
|
limit_name_in_request: 'limit'
|
|
243
252
|
};
|
|
244
|
-
proxy.mockResolvedValueOnce({
|
|
253
|
+
proxy.mockResolvedValueOnce(asAxiosResponse({
|
|
245
254
|
headers: {
|
|
246
255
|
link: ''
|
|
247
256
|
},
|
|
@@ -251,7 +260,7 @@ describe('PaginationService', () => {
|
|
|
251
260
|
next_url: 'https://api.example.com/next-body'
|
|
252
261
|
}
|
|
253
262
|
}
|
|
254
|
-
});
|
|
263
|
+
}));
|
|
255
264
|
const generator = PaginationService.link(config, paginationConfig, {}, false, proxy);
|
|
256
265
|
const firstPage = await generator.next();
|
|
257
266
|
expect(firstPage.value).toEqual([{ id: 1 }]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paginate.service.unit.test.js","sourceRoot":"","sources":["../lib/paginate.service.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"paginate.service.unit.test.js","sourceRoot":"","sources":["../lib/paginate.service.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HTTP_METHOD } from '@nangohq/types';
|
|
2
|
+
export interface UncontrolledFetchOptions {
|
|
3
|
+
url: URL;
|
|
4
|
+
method?: HTTP_METHOD;
|
|
5
|
+
headers?: Record<string, string> | undefined;
|
|
6
|
+
body?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function executeUncontrolledFetch(options: UncontrolledFetchOptions, onBytes: (params: {
|
|
9
|
+
bytesSent: number;
|
|
10
|
+
bytesReceived: number;
|
|
11
|
+
}) => void): Promise<Response>;
|
|
12
|
+
export declare function parseContentLength(headers: Headers): number | null;
|
|
13
|
+
export declare function countHeaderBytes(headers: Headers): number;
|
|
14
|
+
export declare function countRequestBytes(headers: Headers, body?: string): number;
|
|
15
|
+
export declare function tapResponseStreamAndCount(response: Response, onStreamedBytes: (params: {
|
|
16
|
+
bytes: number;
|
|
17
|
+
}) => void): Response;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { getBaseUrlOverrideDenylistFromEnv, isBaseUrlOverrideDenied } from './baseUrlOverrideDenylist.js';
|
|
2
|
+
import { ActionError } from './errors.js';
|
|
3
|
+
const UNCONTROLLED_FETCH_MAX_REDIRECTS = 5;
|
|
4
|
+
const REDIRECT_STATUS_CODES = new Set([301, 302, 303, 307, 308]);
|
|
5
|
+
const ALLOWED_REDIRECT_PROTOCOLS = new Set(['http:', 'https:']);
|
|
6
|
+
const makeActionError = (code, message) => {
|
|
7
|
+
return new ActionError({ code, message });
|
|
8
|
+
};
|
|
9
|
+
export async function executeUncontrolledFetch(options, onBytes) {
|
|
10
|
+
const recordTransfer = (params) => {
|
|
11
|
+
if (params.bytesSent > 0 || params.bytesReceived > 0)
|
|
12
|
+
onBytes(params);
|
|
13
|
+
};
|
|
14
|
+
const baseUrlOverrideDenylist = getBaseUrlOverrideDenylistFromEnv();
|
|
15
|
+
const throwIfDenied = (absoluteUrl) => {
|
|
16
|
+
if (baseUrlOverrideDenylist.size > 0 && isBaseUrlOverrideDenied(absoluteUrl, baseUrlOverrideDenylist)) {
|
|
17
|
+
throw makeActionError('url_not_allowed', 'This URL is not allowed by server configuration.');
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
throwIfDenied(options.url.toString());
|
|
21
|
+
let currentUrl = new URL(options.url.href);
|
|
22
|
+
let method = options.method || 'GET';
|
|
23
|
+
let body = options.body ?? undefined;
|
|
24
|
+
const headerBag = new Headers(options.headers);
|
|
25
|
+
for (let redirectsFollowed = 0;; redirectsFollowed++) {
|
|
26
|
+
const props = {
|
|
27
|
+
headers: new Headers(headerBag),
|
|
28
|
+
method,
|
|
29
|
+
redirect: 'manual'
|
|
30
|
+
// TODO: use agent
|
|
31
|
+
};
|
|
32
|
+
if (body) {
|
|
33
|
+
props.body = body;
|
|
34
|
+
}
|
|
35
|
+
const response = await fetch(currentUrl, props);
|
|
36
|
+
const bytesSent = countRequestBytes(props.headers, body);
|
|
37
|
+
const bytesReceived = countHeaderBytes(response.headers);
|
|
38
|
+
if (!REDIRECT_STATUS_CODES.has(response.status)) {
|
|
39
|
+
if (response.body === null) {
|
|
40
|
+
recordTransfer({ bytesSent, bytesReceived });
|
|
41
|
+
return response;
|
|
42
|
+
}
|
|
43
|
+
const contentLength = parseContentLength(response.headers);
|
|
44
|
+
if (contentLength !== null) {
|
|
45
|
+
recordTransfer({ bytesSent: bytesSent, bytesReceived: bytesReceived + contentLength });
|
|
46
|
+
return response;
|
|
47
|
+
}
|
|
48
|
+
// CL not present: emit known bytes now; body bytes follow when stream settles.
|
|
49
|
+
recordTransfer({ bytesSent, bytesReceived });
|
|
50
|
+
return tapResponseStreamAndCount(response, ({ bytes }) => {
|
|
51
|
+
recordTransfer({ bytesSent: 0, bytesReceived: bytes });
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
recordTransfer({ bytesSent, bytesReceived });
|
|
55
|
+
const location = response.headers.get('Location');
|
|
56
|
+
if (!location) {
|
|
57
|
+
// Return as-is when there's a redirect status but no Location header.
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
// We're about to follow the redirect; we won't return this response, so cancel its body.
|
|
61
|
+
void response.body?.cancel();
|
|
62
|
+
if (redirectsFollowed >= UNCONTROLLED_FETCH_MAX_REDIRECTS) {
|
|
63
|
+
throw makeActionError('too_many_redirects', `Exceeded maximum of ${UNCONTROLLED_FETCH_MAX_REDIRECTS} redirects.`);
|
|
64
|
+
}
|
|
65
|
+
let nextUrl;
|
|
66
|
+
try {
|
|
67
|
+
nextUrl = new URL(location, currentUrl);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw makeActionError('invalid_redirect', 'Redirect Location could not be parsed as a URL.');
|
|
71
|
+
}
|
|
72
|
+
// Native fetch rejects redirects to non-HTTP(S) schemes.
|
|
73
|
+
if (!ALLOWED_REDIRECT_PROTOCOLS.has(nextUrl.protocol)) {
|
|
74
|
+
throw makeActionError('invalid_redirect', 'Redirect Location must use http: or https:.');
|
|
75
|
+
}
|
|
76
|
+
throwIfDenied(nextUrl.toString());
|
|
77
|
+
// Native fetch strips sensitive headers when redirecting to a different origin.
|
|
78
|
+
// Because we follow redirects manually, we must replicate that to avoid credential leaks.
|
|
79
|
+
if (currentUrl.origin !== nextUrl.origin) {
|
|
80
|
+
headerBag.delete('authorization');
|
|
81
|
+
headerBag.delete('proxy-authorization');
|
|
82
|
+
headerBag.delete('cookie');
|
|
83
|
+
}
|
|
84
|
+
// Match common fetch redirect semantics:
|
|
85
|
+
// - 303: switch to GET only if method is neither GET nor HEAD (drop body)
|
|
86
|
+
// - 301/302: switch to GET only for POST (preserve PUT/PATCH/DELETE, etc.)
|
|
87
|
+
// - 307/308: preserve method and body
|
|
88
|
+
const upperMethod = method.toUpperCase();
|
|
89
|
+
const shouldSwitchToGet = (response.status === 303 && upperMethod !== 'GET' && upperMethod !== 'HEAD') ||
|
|
90
|
+
((response.status === 301 || response.status === 302) && upperMethod === 'POST');
|
|
91
|
+
if (shouldSwitchToGet) {
|
|
92
|
+
method = 'GET';
|
|
93
|
+
body = undefined;
|
|
94
|
+
// When we rewrite to GET, drop request-body specific headers (native fetch does not forward them).
|
|
95
|
+
for (const h of [
|
|
96
|
+
'content-length',
|
|
97
|
+
'content-type',
|
|
98
|
+
'content-encoding',
|
|
99
|
+
'content-language',
|
|
100
|
+
'content-location',
|
|
101
|
+
'content-md5',
|
|
102
|
+
'content-range',
|
|
103
|
+
'transfer-encoding'
|
|
104
|
+
]) {
|
|
105
|
+
headerBag.delete(h);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
currentUrl = nextUrl;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function parseContentLength(headers) {
|
|
112
|
+
const cl = headers.get('content-length');
|
|
113
|
+
if (cl === null)
|
|
114
|
+
return null;
|
|
115
|
+
const n = parseInt(cl, 10);
|
|
116
|
+
return Number.isFinite(n) && n >= 0 ? n : null;
|
|
117
|
+
}
|
|
118
|
+
export function countHeaderBytes(headers) {
|
|
119
|
+
let bytes = 0;
|
|
120
|
+
headers.forEach((value, name) => {
|
|
121
|
+
bytes += Buffer.byteLength(name, 'utf8') + Buffer.byteLength(value, 'utf8');
|
|
122
|
+
});
|
|
123
|
+
return bytes;
|
|
124
|
+
}
|
|
125
|
+
export function countRequestBytes(headers, body) {
|
|
126
|
+
let bytes = body !== undefined ? Buffer.byteLength(body, 'utf8') : 0;
|
|
127
|
+
bytes += countHeaderBytes(headers);
|
|
128
|
+
return bytes;
|
|
129
|
+
}
|
|
130
|
+
export function tapResponseStreamAndCount(response, onStreamedBytes) {
|
|
131
|
+
// defensive check: shouldn't happen as we validate before calling this function
|
|
132
|
+
if (response.body === null) {
|
|
133
|
+
return response;
|
|
134
|
+
}
|
|
135
|
+
let streamedBytes = 0;
|
|
136
|
+
const { readable, writable } = new TransformStream({
|
|
137
|
+
transform(chunk, controller) {
|
|
138
|
+
streamedBytes += chunk.byteLength;
|
|
139
|
+
controller.enqueue(chunk);
|
|
140
|
+
},
|
|
141
|
+
flush() {
|
|
142
|
+
onStreamedBytes({ bytes: streamedBytes });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
void response.body.pipeTo(writable).catch(() => {
|
|
146
|
+
// Swallow errors: if the caller cancels the stream the flush may not fire,
|
|
147
|
+
// which is acceptable — we avoid forcing a download just for metering.
|
|
148
|
+
});
|
|
149
|
+
return proxyResponseBody(readable, response);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Returns a Proxy over `response` that routes property accesses in two ways:
|
|
153
|
+
* - Body-related properties (`body`, `bodyUsed`, `text`, `json`, `arrayBuffer`,
|
|
154
|
+
* `blob`, `formData`, `clone`) are routed to a body façade built on top of
|
|
155
|
+
* `readable`, so body consumption goes through the tapped stream.
|
|
156
|
+
* - Everything else (including `url`, `type`, and other runtime-populated
|
|
157
|
+
* read-only fields) is routed to the original response object, which
|
|
158
|
+
* constructing `new Response(…)` would silently drop.
|
|
159
|
+
*
|
|
160
|
+
* Note: `clone()` resolves through the body façade, so clones lose `url`/`type` —
|
|
161
|
+
* acceptable since `clone()` is used for body re-reading, not metadata access.
|
|
162
|
+
*/
|
|
163
|
+
function proxyResponseBody(readable, response) {
|
|
164
|
+
const bodyFacade = new Response(readable, {
|
|
165
|
+
status: response.status,
|
|
166
|
+
statusText: response.statusText,
|
|
167
|
+
headers: response.headers
|
|
168
|
+
});
|
|
169
|
+
return new Proxy(response, {
|
|
170
|
+
get(target, prop) {
|
|
171
|
+
switch (prop) {
|
|
172
|
+
case 'body':
|
|
173
|
+
return readable;
|
|
174
|
+
case 'bodyUsed':
|
|
175
|
+
return bodyFacade.bodyUsed;
|
|
176
|
+
case 'text':
|
|
177
|
+
case 'json':
|
|
178
|
+
case 'arrayBuffer':
|
|
179
|
+
case 'blob':
|
|
180
|
+
case 'formData':
|
|
181
|
+
case 'bytes':
|
|
182
|
+
case 'clone':
|
|
183
|
+
return prop in bodyFacade ? bodyFacade[prop].bind(bodyFacade) : undefined;
|
|
184
|
+
default: {
|
|
185
|
+
const val = Reflect.get(target, prop, target);
|
|
186
|
+
return typeof val === 'function' ? val.bind(target) : val;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=uncontrolledFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uncontrolledFetch.js","sourceRoot":"","sources":["../lib/uncontrolledFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|