@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.
@@ -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; // Use ReturnType for type inference
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":"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"}
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 {};