@paid-ai/paid-node 1.0.0 → 1.0.1-alpha0

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 (156) hide show
  1. package/dist/cjs/BaseClient.d.ts +4 -17
  2. package/dist/cjs/BaseClient.js +0 -59
  3. package/dist/cjs/Client.d.ts +28 -28
  4. package/dist/cjs/Client.js +52 -11
  5. package/dist/cjs/api/errors/BadRequestError.js +1 -5
  6. package/dist/cjs/api/errors/ForbiddenError.js +1 -5
  7. package/dist/cjs/api/errors/InternalServerError.js +1 -5
  8. package/dist/cjs/api/errors/NotFoundError.js +1 -5
  9. package/dist/cjs/api/resources/agents/client/Client.d.ts +23 -22
  10. package/dist/cjs/api/resources/agents/client/Client.js +158 -55
  11. package/dist/cjs/api/resources/contacts/client/Client.d.ts +19 -18
  12. package/dist/cjs/api/resources/contacts/client/Client.js +122 -43
  13. package/dist/cjs/api/resources/customers/client/Client.d.ts +37 -36
  14. package/dist/cjs/api/resources/customers/client/Client.js +315 -113
  15. package/dist/cjs/api/resources/orders/client/Client.d.ts +28 -27
  16. package/dist/cjs/api/resources/orders/client/Client.js +177 -62
  17. package/dist/cjs/api/resources/orders/resources/lines/client/Client.d.ts +9 -8
  18. package/dist/cjs/api/resources/orders/resources/lines/client/Client.js +32 -13
  19. package/dist/cjs/api/resources/plans/client/Client.d.ts +13 -12
  20. package/dist/cjs/api/resources/plans/client/Client.js +82 -32
  21. package/dist/cjs/api/resources/products/client/Client.d.ts +23 -22
  22. package/dist/cjs/api/resources/products/client/Client.js +158 -55
  23. package/dist/cjs/api/resources/products/client/requests/index.d.ts +1 -1
  24. package/dist/cjs/api/resources/products/client/requests/index.js +0 -3
  25. package/dist/cjs/api/resources/traces/client/Client.d.ts +9 -8
  26. package/dist/cjs/api/resources/traces/client/Client.js +57 -23
  27. package/dist/cjs/api/resources/usage/client/Client.d.ts +13 -12
  28. package/dist/cjs/api/resources/usage/client/Client.js +68 -25
  29. package/dist/cjs/core/auth/AuthProvider.d.ts +1 -4
  30. package/dist/cjs/core/auth/BearerToken.d.ts +1 -3
  31. package/dist/cjs/core/auth/BearerToken.js +6 -7
  32. package/dist/cjs/core/auth/index.d.ts +0 -1
  33. package/dist/cjs/core/auth/index.js +1 -3
  34. package/dist/cjs/core/fetcher/BinaryResponse.d.ts +7 -6
  35. package/dist/cjs/core/fetcher/EndpointSupplier.d.ts +2 -2
  36. package/dist/cjs/core/fetcher/Fetcher.d.ts +4 -10
  37. package/dist/cjs/core/fetcher/Fetcher.js +10 -204
  38. package/dist/cjs/core/fetcher/ResponseWithBody.d.ts +4 -0
  39. package/dist/cjs/core/fetcher/ResponseWithBody.js +6 -0
  40. package/dist/cjs/core/fetcher/getRequestBody.d.ts +1 -1
  41. package/dist/cjs/core/fetcher/getRequestBody.js +0 -4
  42. package/dist/cjs/core/fetcher/getResponseBody.js +4 -18
  43. package/dist/cjs/core/fetcher/makeRequest.d.ts +1 -1
  44. package/dist/cjs/core/fetcher/makeRequest.js +2 -0
  45. package/dist/cjs/core/fetcher/requestWithRetries.js +9 -0
  46. package/dist/cjs/core/fetcher/signals.d.ts +7 -1
  47. package/dist/cjs/core/fetcher/signals.js +12 -0
  48. package/dist/cjs/core/headers.d.ts +2 -2
  49. package/dist/cjs/core/headers.js +4 -6
  50. package/dist/cjs/core/index.d.ts +0 -1
  51. package/dist/cjs/core/index.js +1 -2
  52. package/dist/cjs/core/runtime/runtime.js +10 -11
  53. package/dist/cjs/core/url/join.js +1 -0
  54. package/dist/cjs/errors/PaidError.js +1 -5
  55. package/dist/cjs/errors/PaidTimeoutError.js +1 -5
  56. package/dist/cjs/index.d.ts +0 -1
  57. package/dist/cjs/index.js +0 -4
  58. package/dist/cjs/version.d.ts +1 -1
  59. package/dist/cjs/version.js +1 -1
  60. package/dist/esm/BaseClient.d.mts +4 -17
  61. package/dist/esm/BaseClient.mjs +1 -24
  62. package/dist/esm/Client.d.mts +28 -28
  63. package/dist/esm/Client.mjs +27 -19
  64. package/dist/esm/api/errors/BadRequestError.mjs +1 -5
  65. package/dist/esm/api/errors/ForbiddenError.mjs +1 -5
  66. package/dist/esm/api/errors/InternalServerError.mjs +1 -5
  67. package/dist/esm/api/errors/NotFoundError.mjs +1 -5
  68. package/dist/esm/api/resources/agents/client/Client.d.mts +23 -22
  69. package/dist/esm/api/resources/agents/client/Client.mjs +157 -54
  70. package/dist/esm/api/resources/contacts/client/Client.d.mts +19 -18
  71. package/dist/esm/api/resources/contacts/client/Client.mjs +121 -42
  72. package/dist/esm/api/resources/customers/client/Client.d.mts +37 -36
  73. package/dist/esm/api/resources/customers/client/Client.mjs +314 -112
  74. package/dist/esm/api/resources/orders/client/Client.d.mts +28 -27
  75. package/dist/esm/api/resources/orders/client/Client.mjs +177 -62
  76. package/dist/esm/api/resources/orders/resources/lines/client/Client.d.mts +9 -8
  77. package/dist/esm/api/resources/orders/resources/lines/client/Client.mjs +31 -12
  78. package/dist/esm/api/resources/plans/client/Client.d.mts +13 -12
  79. package/dist/esm/api/resources/plans/client/Client.mjs +81 -31
  80. package/dist/esm/api/resources/products/client/Client.d.mts +23 -22
  81. package/dist/esm/api/resources/products/client/Client.mjs +157 -54
  82. package/dist/esm/api/resources/products/client/requests/index.d.mts +1 -1
  83. package/dist/esm/api/resources/products/client/requests/index.mjs +1 -1
  84. package/dist/esm/api/resources/traces/client/Client.d.mts +9 -8
  85. package/dist/esm/api/resources/traces/client/Client.mjs +56 -22
  86. package/dist/esm/api/resources/usage/client/Client.d.mts +13 -12
  87. package/dist/esm/api/resources/usage/client/Client.mjs +67 -24
  88. package/dist/esm/core/auth/AuthProvider.d.mts +1 -4
  89. package/dist/esm/core/auth/BearerToken.d.mts +1 -3
  90. package/dist/esm/core/auth/BearerToken.mjs +6 -7
  91. package/dist/esm/core/auth/index.d.mts +0 -1
  92. package/dist/esm/core/auth/index.mjs +0 -1
  93. package/dist/esm/core/fetcher/BinaryResponse.d.mts +7 -6
  94. package/dist/esm/core/fetcher/EndpointSupplier.d.mts +2 -2
  95. package/dist/esm/core/fetcher/Fetcher.d.mts +4 -10
  96. package/dist/esm/core/fetcher/Fetcher.mjs +10 -204
  97. package/dist/esm/core/fetcher/ResponseWithBody.d.mts +4 -0
  98. package/dist/esm/core/fetcher/ResponseWithBody.mjs +3 -0
  99. package/dist/esm/core/fetcher/getRequestBody.d.mts +1 -1
  100. package/dist/esm/core/fetcher/getRequestBody.mjs +0 -4
  101. package/dist/esm/core/fetcher/getResponseBody.mjs +4 -18
  102. package/dist/esm/core/fetcher/makeRequest.d.mts +1 -1
  103. package/dist/esm/core/fetcher/makeRequest.mjs +2 -0
  104. package/dist/esm/core/fetcher/requestWithRetries.mjs +9 -0
  105. package/dist/esm/core/fetcher/signals.d.mts +7 -1
  106. package/dist/esm/core/fetcher/signals.mjs +12 -0
  107. package/dist/esm/core/headers.d.mts +2 -2
  108. package/dist/esm/core/headers.mjs +4 -6
  109. package/dist/esm/core/index.d.mts +0 -1
  110. package/dist/esm/core/index.mjs +0 -1
  111. package/dist/esm/core/runtime/runtime.mjs +10 -11
  112. package/dist/esm/core/url/join.mjs +1 -0
  113. package/dist/esm/errors/PaidError.mjs +1 -5
  114. package/dist/esm/errors/PaidTimeoutError.mjs +1 -5
  115. package/dist/esm/index.d.mts +0 -1
  116. package/dist/esm/index.mjs +0 -1
  117. package/dist/esm/version.d.mts +1 -1
  118. package/dist/esm/version.mjs +1 -1
  119. package/package.json +3 -6
  120. package/reference.md +54 -54
  121. package/dist/cjs/auth/BearerAuthProvider.d.ts +0 -20
  122. package/dist/cjs/auth/BearerAuthProvider.js +0 -79
  123. package/dist/cjs/auth/index.d.ts +0 -1
  124. package/dist/cjs/auth/index.js +0 -5
  125. package/dist/cjs/core/auth/NoOpAuthProvider.d.ts +0 -5
  126. package/dist/cjs/core/auth/NoOpAuthProvider.js +0 -9
  127. package/dist/cjs/core/exports.d.ts +0 -1
  128. package/dist/cjs/core/exports.js +0 -17
  129. package/dist/cjs/core/logging/exports.d.ts +0 -18
  130. package/dist/cjs/core/logging/exports.js +0 -45
  131. package/dist/cjs/core/logging/index.d.ts +0 -1
  132. package/dist/cjs/core/logging/index.js +0 -17
  133. package/dist/cjs/core/logging/logger.d.ts +0 -126
  134. package/dist/cjs/core/logging/logger.js +0 -144
  135. package/dist/cjs/errors/handleNonStatusCodeError.d.ts +0 -2
  136. package/dist/cjs/errors/handleNonStatusCodeError.js +0 -65
  137. package/dist/cjs/exports.d.ts +0 -1
  138. package/dist/cjs/exports.js +0 -17
  139. package/dist/esm/auth/BearerAuthProvider.d.mts +0 -20
  140. package/dist/esm/auth/BearerAuthProvider.mjs +0 -42
  141. package/dist/esm/auth/index.d.mts +0 -1
  142. package/dist/esm/auth/index.mjs +0 -1
  143. package/dist/esm/core/auth/NoOpAuthProvider.d.mts +0 -5
  144. package/dist/esm/core/auth/NoOpAuthProvider.mjs +0 -5
  145. package/dist/esm/core/exports.d.mts +0 -1
  146. package/dist/esm/core/exports.mjs +0 -1
  147. package/dist/esm/core/logging/exports.d.mts +0 -18
  148. package/dist/esm/core/logging/exports.mjs +0 -9
  149. package/dist/esm/core/logging/index.d.mts +0 -1
  150. package/dist/esm/core/logging/index.mjs +0 -1
  151. package/dist/esm/core/logging/logger.d.mts +0 -126
  152. package/dist/esm/core/logging/logger.mjs +0 -138
  153. package/dist/esm/errors/handleNonStatusCodeError.d.mts +0 -2
  154. package/dist/esm/errors/handleNonStatusCodeError.mjs +0 -29
  155. package/dist/esm/exports.d.mts +0 -1
  156. package/dist/esm/exports.mjs +0 -1
@@ -12,153 +12,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.fetcher = void 0;
13
13
  exports.fetcherImpl = fetcherImpl;
14
14
  const json_js_1 = require("../json.js");
15
- const logger_js_1 = require("../logging/logger.js");
16
15
  const createRequestUrl_js_1 = require("./createRequestUrl.js");
17
16
  const EndpointSupplier_js_1 = require("./EndpointSupplier.js");
18
17
  const getErrorResponseBody_js_1 = require("./getErrorResponseBody.js");
19
18
  const getFetchFn_js_1 = require("./getFetchFn.js");
20
19
  const getRequestBody_js_1 = require("./getRequestBody.js");
21
20
  const getResponseBody_js_1 = require("./getResponseBody.js");
22
- const Headers_js_1 = require("./Headers.js");
23
21
  const makeRequest_js_1 = require("./makeRequest.js");
24
22
  const RawResponse_js_1 = require("./RawResponse.js");
25
23
  const requestWithRetries_js_1 = require("./requestWithRetries.js");
26
- const SENSITIVE_HEADERS = new Set([
27
- "authorization",
28
- "www-authenticate",
29
- "x-api-key",
30
- "api-key",
31
- "apikey",
32
- "x-api-token",
33
- "x-auth-token",
34
- "auth-token",
35
- "cookie",
36
- "set-cookie",
37
- "proxy-authorization",
38
- "proxy-authenticate",
39
- "x-csrf-token",
40
- "x-xsrf-token",
41
- "x-session-token",
42
- "x-access-token",
43
- ]);
44
- function redactHeaders(headers) {
45
- const filtered = {};
46
- for (const [key, value] of headers instanceof Headers_js_1.Headers ? headers.entries() : Object.entries(headers)) {
47
- if (SENSITIVE_HEADERS.has(key.toLowerCase())) {
48
- filtered[key] = "[REDACTED]";
49
- }
50
- else {
51
- filtered[key] = value;
52
- }
53
- }
54
- return filtered;
55
- }
56
- const SENSITIVE_QUERY_PARAMS = new Set([
57
- "api_key",
58
- "api-key",
59
- "apikey",
60
- "token",
61
- "access_token",
62
- "access-token",
63
- "auth_token",
64
- "auth-token",
65
- "password",
66
- "passwd",
67
- "secret",
68
- "api_secret",
69
- "api-secret",
70
- "apisecret",
71
- "key",
72
- "session",
73
- "session_id",
74
- "session-id",
75
- ]);
76
- function redactQueryParameters(queryParameters) {
77
- if (queryParameters == null) {
78
- return queryParameters;
79
- }
80
- const redacted = {};
81
- for (const [key, value] of Object.entries(queryParameters)) {
82
- if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) {
83
- redacted[key] = "[REDACTED]";
84
- }
85
- else {
86
- redacted[key] = value;
87
- }
88
- }
89
- return redacted;
90
- }
91
- function redactUrl(url) {
92
- const protocolIndex = url.indexOf("://");
93
- if (protocolIndex === -1)
94
- return url;
95
- const afterProtocol = protocolIndex + 3;
96
- // Find the first delimiter that marks the end of the authority section
97
- const pathStart = url.indexOf("/", afterProtocol);
98
- let queryStart = url.indexOf("?", afterProtocol);
99
- let fragmentStart = url.indexOf("#", afterProtocol);
100
- const firstDelimiter = Math.min(pathStart === -1 ? url.length : pathStart, queryStart === -1 ? url.length : queryStart, fragmentStart === -1 ? url.length : fragmentStart);
101
- // Find the LAST @ before the delimiter (handles multiple @ in credentials)
102
- let atIndex = -1;
103
- for (let i = afterProtocol; i < firstDelimiter; i++) {
104
- if (url[i] === "@") {
105
- atIndex = i;
106
- }
107
- }
108
- if (atIndex !== -1) {
109
- url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`;
110
- }
111
- // Recalculate queryStart since url might have changed
112
- queryStart = url.indexOf("?");
113
- if (queryStart === -1)
114
- return url;
115
- fragmentStart = url.indexOf("#", queryStart);
116
- const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length;
117
- const queryString = url.slice(queryStart + 1, queryEnd);
118
- if (queryString.length === 0)
119
- return url;
120
- // FAST PATH: Quick check if any sensitive keywords present
121
- // Using indexOf is faster than regex for simple substring matching
122
- const lower = queryString.toLowerCase();
123
- const hasSensitive = lower.includes("token") ||
124
- lower.includes("key") ||
125
- lower.includes("password") ||
126
- lower.includes("passwd") ||
127
- lower.includes("secret") ||
128
- lower.includes("session") ||
129
- lower.includes("auth");
130
- if (!hasSensitive) {
131
- return url;
132
- }
133
- // SLOW PATH: Parse and redact
134
- const redactedParams = [];
135
- const params = queryString.split("&");
136
- for (const param of params) {
137
- const equalIndex = param.indexOf("=");
138
- if (equalIndex === -1) {
139
- redactedParams.push(param);
140
- continue;
141
- }
142
- const key = param.slice(0, equalIndex);
143
- let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase());
144
- if (!shouldRedact && key.includes("%")) {
145
- try {
146
- const decodedKey = decodeURIComponent(key);
147
- shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase());
148
- }
149
- catch (_a) { }
150
- }
151
- redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param);
152
- }
153
- return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd);
154
- }
155
24
  function getHeaders(args) {
156
25
  return __awaiter(this, void 0, void 0, function* () {
157
26
  var _a;
158
- const newHeaders = new Headers_js_1.Headers();
159
- newHeaders.set("Accept", args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*");
27
+ const newHeaders = {};
160
28
  if (args.body !== undefined && args.contentType != null) {
161
- newHeaders.set("Content-Type", args.contentType);
29
+ newHeaders["Content-Type"] = args.contentType;
162
30
  }
163
31
  if (args.headers == null) {
164
32
  return newHeaders;
@@ -166,70 +34,39 @@ function getHeaders(args) {
166
34
  for (const [key, value] of Object.entries(args.headers)) {
167
35
  const result = yield EndpointSupplier_js_1.EndpointSupplier.get(value, { endpointMetadata: (_a = args.endpointMetadata) !== null && _a !== void 0 ? _a : {} });
168
36
  if (typeof result === "string") {
169
- newHeaders.set(key, result);
37
+ newHeaders[key] = result;
170
38
  continue;
171
39
  }
172
40
  if (result == null) {
173
41
  continue;
174
42
  }
175
- newHeaders.set(key, `${result}`);
43
+ newHeaders[key] = `${result}`;
176
44
  }
177
45
  return newHeaders;
178
46
  });
179
47
  }
180
48
  function fetcherImpl(args) {
181
49
  return __awaiter(this, void 0, void 0, function* () {
182
- var _a, _b, _c;
50
+ var _a;
183
51
  const url = (0, createRequestUrl_js_1.createRequestUrl)(args.url, args.queryParameters);
184
52
  const requestBody = yield (0, getRequestBody_js_1.getRequestBody)({
185
53
  body: args.body,
186
- type: (_a = args.requestType) !== null && _a !== void 0 ? _a : "other",
54
+ type: args.requestType === "json" ? "json" : "other",
187
55
  });
188
- const fetchFn = (_b = args.fetchFn) !== null && _b !== void 0 ? _b : (yield (0, getFetchFn_js_1.getFetchFn)());
189
- const headers = yield getHeaders(args);
190
- const logger = (0, logger_js_1.createLogger)(args.logging);
191
- if (logger.isDebug()) {
192
- const metadata = {
193
- method: args.method,
194
- url: redactUrl(url),
195
- headers: redactHeaders(headers),
196
- queryParameters: redactQueryParameters(args.queryParameters),
197
- hasBody: requestBody != null,
198
- };
199
- logger.debug("Making HTTP request", metadata);
200
- }
56
+ const fetchFn = yield (0, getFetchFn_js_1.getFetchFn)();
201
57
  try {
202
58
  const response = yield (0, requestWithRetries_js_1.requestWithRetries)(() => __awaiter(this, void 0, void 0, function* () {
203
- return (0, makeRequest_js_1.makeRequest)(fetchFn, url, args.method, headers, requestBody, args.timeoutMs, args.abortSignal, args.withCredentials, args.duplex);
59
+ return (0, makeRequest_js_1.makeRequest)(fetchFn, url, args.method, yield getHeaders(args), requestBody, args.timeoutMs, args.abortSignal, args.withCredentials, args.duplex);
204
60
  }), args.maxRetries);
205
61
  if (response.status >= 200 && response.status < 400) {
206
- if (logger.isDebug()) {
207
- const metadata = {
208
- method: args.method,
209
- url: redactUrl(url),
210
- statusCode: response.status,
211
- responseHeaders: redactHeaders(response.headers),
212
- };
213
- logger.debug("HTTP request succeeded", metadata);
214
- }
215
- const body = yield (0, getResponseBody_js_1.getResponseBody)(response, args.responseType);
216
62
  return {
217
63
  ok: true,
218
- body: body,
64
+ body: (yield (0, getResponseBody_js_1.getResponseBody)(response, args.responseType)),
219
65
  headers: response.headers,
220
66
  rawResponse: (0, RawResponse_js_1.toRawResponse)(response),
221
67
  };
222
68
  }
223
69
  else {
224
- if (logger.isError()) {
225
- const metadata = {
226
- method: args.method,
227
- url: redactUrl(url),
228
- statusCode: response.status,
229
- responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())),
230
- };
231
- logger.error("HTTP request failed with error status", metadata);
232
- }
233
70
  return {
234
71
  ok: false,
235
72
  error: {
@@ -242,14 +79,7 @@ function fetcherImpl(args) {
242
79
  }
243
80
  }
244
81
  catch (error) {
245
- if ((_c = args.abortSignal) === null || _c === void 0 ? void 0 : _c.aborted) {
246
- if (logger.isError()) {
247
- const metadata = {
248
- method: args.method,
249
- url: redactUrl(url),
250
- };
251
- logger.error("HTTP request was aborted", metadata);
252
- }
82
+ if ((_a = args.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {
253
83
  return {
254
84
  ok: false,
255
85
  error: {
@@ -260,14 +90,6 @@ function fetcherImpl(args) {
260
90
  };
261
91
  }
262
92
  else if (error instanceof Error && error.name === "AbortError") {
263
- if (logger.isError()) {
264
- const metadata = {
265
- method: args.method,
266
- url: redactUrl(url),
267
- timeoutMs: args.timeoutMs,
268
- };
269
- logger.error("HTTP request timed out", metadata);
270
- }
271
93
  return {
272
94
  ok: false,
273
95
  error: {
@@ -277,14 +99,6 @@ function fetcherImpl(args) {
277
99
  };
278
100
  }
279
101
  else if (error instanceof Error) {
280
- if (logger.isError()) {
281
- const metadata = {
282
- method: args.method,
283
- url: redactUrl(url),
284
- errorMessage: error.message,
285
- };
286
- logger.error("HTTP request failed with error", metadata);
287
- }
288
102
  return {
289
103
  ok: false,
290
104
  error: {
@@ -294,14 +108,6 @@ function fetcherImpl(args) {
294
108
  rawResponse: RawResponse_js_1.unknownRawResponse,
295
109
  };
296
110
  }
297
- if (logger.isError()) {
298
- const metadata = {
299
- method: args.method,
300
- url: redactUrl(url),
301
- error: (0, json_js_1.toJson)(error),
302
- };
303
- logger.error("HTTP request failed with unknown error", metadata);
304
- }
305
111
  return {
306
112
  ok: false,
307
113
  error: {
@@ -0,0 +1,4 @@
1
+ export type ResponseWithBody = Response & {
2
+ body: ReadableStream<Uint8Array>;
3
+ };
4
+ export declare function isResponseWithBody(response: Response): response is ResponseWithBody;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isResponseWithBody = isResponseWithBody;
4
+ function isResponseWithBody(response) {
5
+ return response.body != null;
6
+ }
@@ -1,7 +1,7 @@
1
1
  export declare namespace GetRequestBody {
2
2
  interface Args {
3
3
  body: unknown;
4
- type: "json" | "file" | "bytes" | "form" | "other";
4
+ type: "json" | "file" | "bytes" | "other";
5
5
  }
6
6
  }
7
7
  export declare function getRequestBody({ body, type }: GetRequestBody.Args): Promise<BodyInit | undefined>;
@@ -11,12 +11,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getRequestBody = getRequestBody;
13
13
  const json_js_1 = require("../json.js");
14
- const qs_js_1 = require("../url/qs.js");
15
14
  function getRequestBody(_a) {
16
15
  return __awaiter(this, arguments, void 0, function* ({ body, type }) {
17
- if (type === "form") {
18
- return (0, qs_js_1.toQueryString)(body, { arrayFormat: "repeat", encode: true });
19
- }
20
16
  if (type.includes("json")) {
21
17
  return (0, json_js_1.toJson)(body);
22
18
  }
@@ -12,8 +12,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getResponseBody = getResponseBody;
13
13
  const json_js_1 = require("../json.js");
14
14
  const BinaryResponse_js_1 = require("./BinaryResponse.js");
15
+ const ResponseWithBody_js_1 = require("./ResponseWithBody.js");
15
16
  function getResponseBody(response, responseType) {
16
17
  return __awaiter(this, void 0, void 0, function* () {
18
+ if (!(0, ResponseWithBody_js_1.isResponseWithBody)(response)) {
19
+ return undefined;
20
+ }
17
21
  switch (responseType) {
18
22
  case "binary-response":
19
23
  return (0, BinaryResponse_js_1.getBinaryResponse)(response);
@@ -22,26 +26,8 @@ function getResponseBody(response, responseType) {
22
26
  case "arrayBuffer":
23
27
  return yield response.arrayBuffer();
24
28
  case "sse":
25
- if (response.body == null) {
26
- return {
27
- ok: false,
28
- error: {
29
- reason: "body-is-null",
30
- statusCode: response.status,
31
- },
32
- };
33
- }
34
29
  return response.body;
35
30
  case "streaming":
36
- if (response.body == null) {
37
- return {
38
- ok: false,
39
- error: {
40
- reason: "body-is-null",
41
- statusCode: response.status,
42
- },
43
- };
44
- }
45
31
  return response.body;
46
32
  case "text":
47
33
  return yield response.text();
@@ -1 +1 @@
1
- export declare const makeRequest: (fetchFn: (url: string, init: RequestInit) => Promise<Response>, url: string, method: string, headers: Headers | Record<string, string>, requestBody: BodyInit | undefined, timeoutMs?: number, abortSignal?: AbortSignal, withCredentials?: boolean, duplex?: "half") => Promise<Response>;
1
+ export declare const makeRequest: (fetchFn: (url: string, init: RequestInit) => Promise<Response>, url: string, method: string, headers: Record<string, string>, requestBody: BodyInit | undefined, timeoutMs?: number, abortSignal?: AbortSignal, withCredentials?: boolean, duplex?: "half") => Promise<Response>;
@@ -13,12 +13,14 @@ exports.makeRequest = void 0;
13
13
  const signals_js_1 = require("./signals.js");
14
14
  const makeRequest = (fetchFn, url, method, headers, requestBody, timeoutMs, abortSignal, withCredentials, duplex) => __awaiter(void 0, void 0, void 0, function* () {
15
15
  const signals = [];
16
+ // Add timeout signal
16
17
  let timeoutAbortId;
17
18
  if (timeoutMs != null) {
18
19
  const { signal, abortId } = (0, signals_js_1.getTimeoutSignal)(timeoutMs);
19
20
  timeoutAbortId = abortId;
20
21
  signals.push(signal);
21
22
  }
23
+ // Add arbitrary signal
22
24
  if (abortSignal != null) {
23
25
  signals.push(abortSignal);
24
26
  }
@@ -15,20 +15,25 @@ const MAX_RETRY_DELAY = 60000; // in milliseconds
15
15
  const DEFAULT_MAX_RETRIES = 2;
16
16
  const JITTER_FACTOR = 0.2; // 20% random jitter
17
17
  function addPositiveJitter(delay) {
18
+ // Generate a random value between 0 and +JITTER_FACTOR
18
19
  const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR;
19
20
  return delay * jitterMultiplier;
20
21
  }
21
22
  function addSymmetricJitter(delay) {
23
+ // Generate a random value in a JITTER_FACTOR-sized percentage range around delay
22
24
  const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR;
23
25
  return delay * jitterMultiplier;
24
26
  }
25
27
  function getRetryDelayFromHeaders(response, retryAttempt) {
28
+ // Check for Retry-After header first (RFC 7231), with no jitter
26
29
  const retryAfter = response.headers.get("Retry-After");
27
30
  if (retryAfter) {
31
+ // Parse as number of seconds...
28
32
  const retryAfterSeconds = parseInt(retryAfter, 10);
29
33
  if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) {
30
34
  return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY);
31
35
  }
36
+ // ...or as an HTTP date; both are valid
32
37
  const retryAfterDate = new Date(retryAfter);
33
38
  if (!Number.isNaN(retryAfterDate.getTime())) {
34
39
  const delay = retryAfterDate.getTime() - Date.now();
@@ -37,16 +42,19 @@ function getRetryDelayFromHeaders(response, retryAttempt) {
37
42
  }
38
43
  }
39
44
  }
45
+ // Then check for industry-standard X-RateLimit-Reset header, with positive jitter
40
46
  const rateLimitReset = response.headers.get("X-RateLimit-Reset");
41
47
  if (rateLimitReset) {
42
48
  const resetTime = parseInt(rateLimitReset, 10);
43
49
  if (!Number.isNaN(resetTime)) {
50
+ // Assume Unix timestamp in epoch seconds
44
51
  const delay = resetTime * 1000 - Date.now();
45
52
  if (delay > 0) {
46
53
  return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY));
47
54
  }
48
55
  }
49
56
  }
57
+ // Fall back to exponential backoff, with symmetric jitter
50
58
  return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * Math.pow(2, retryAttempt), MAX_RETRY_DELAY));
51
59
  }
52
60
  function requestWithRetries(requestFn_1) {
@@ -54,6 +62,7 @@ function requestWithRetries(requestFn_1) {
54
62
  let response = yield requestFn();
55
63
  for (let i = 0; i < maxRetries; ++i) {
56
64
  if ([408, 429].includes(response.status) || response.status >= 500) {
65
+ // Get delay with appropriate jitter applied
57
66
  const delay = getRetryDelayFromHeaders(response, i);
58
67
  yield new Promise((resolve) => setTimeout(resolve, delay));
59
68
  response = yield requestFn();
@@ -1,5 +1,11 @@
1
1
  export declare function getTimeoutSignal(timeoutMs: number): {
2
2
  signal: AbortSignal;
3
- abortId: ReturnType<typeof setTimeout>;
3
+ abortId: NodeJS.Timeout;
4
4
  };
5
+ /**
6
+ * Returns an abort signal that is getting aborted when
7
+ * at least one of the specified abort signals is aborted.
8
+ *
9
+ * Requires at least node.js 18.
10
+ */
5
11
  export declare function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal;
@@ -8,14 +8,26 @@ function getTimeoutSignal(timeoutMs) {
8
8
  const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs);
9
9
  return { signal: controller.signal, abortId };
10
10
  }
11
+ /**
12
+ * Returns an abort signal that is getting aborted when
13
+ * at least one of the specified abort signals is aborted.
14
+ *
15
+ * Requires at least node.js 18.
16
+ */
11
17
  function anySignal(...args) {
18
+ // Allowing signals to be passed either as array
19
+ // of signals or as multiple arguments.
12
20
  const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args);
13
21
  const controller = new AbortController();
14
22
  for (const signal of signals) {
15
23
  if (signal.aborted) {
24
+ // Exiting early if one of the signals
25
+ // is already aborted.
16
26
  controller.abort(signal === null || signal === void 0 ? void 0 : signal.reason);
17
27
  break;
18
28
  }
29
+ // Listening for signals and removing the listeners
30
+ // when at least one symbol is aborted.
19
31
  signal.addEventListener("abort", () => controller.abort(signal === null || signal === void 0 ? void 0 : signal.reason), {
20
32
  signal: controller.signal,
21
33
  });
@@ -1,2 +1,2 @@
1
- export declare function mergeHeaders(...headersArray: (Record<string, unknown> | null | undefined)[]): Record<string, unknown>;
2
- export declare function mergeOnlyDefinedHeaders(...headersArray: (Record<string, unknown> | null | undefined)[]): Record<string, unknown>;
1
+ export declare function mergeHeaders<THeaderValue>(...headersArray: (Record<string, THeaderValue> | null | undefined)[]): Record<string, string | THeaderValue>;
2
+ export declare function mergeOnlyDefinedHeaders<THeaderValue>(...headersArray: (Record<string, THeaderValue> | null | undefined)[]): Record<string, THeaderValue>;
@@ -7,12 +7,11 @@ function mergeHeaders(...headersArray) {
7
7
  for (const [key, value] of headersArray
8
8
  .filter((headers) => headers != null)
9
9
  .flatMap((headers) => Object.entries(headers))) {
10
- const insensitiveKey = key.toLowerCase();
11
10
  if (value != null) {
12
- result[insensitiveKey] = value;
11
+ result[key] = value;
13
12
  }
14
- else if (insensitiveKey in result) {
15
- delete result[insensitiveKey];
13
+ else if (key in result) {
14
+ delete result[key];
16
15
  }
17
16
  }
18
17
  return result;
@@ -22,9 +21,8 @@ function mergeOnlyDefinedHeaders(...headersArray) {
22
21
  for (const [key, value] of headersArray
23
22
  .filter((headers) => headers != null)
24
23
  .flatMap((headers) => Object.entries(headers))) {
25
- const insensitiveKey = key.toLowerCase();
26
24
  if (value != null) {
27
- result[insensitiveKey] = value;
25
+ result[key] = value;
28
26
  }
29
27
  }
30
28
  return result;
@@ -1,6 +1,5 @@
1
1
  export * from "./auth/index.js";
2
2
  export * from "./base64.js";
3
3
  export * from "./fetcher/index.js";
4
- export * as logging from "./logging/index.js";
5
4
  export * from "./runtime/index.js";
6
5
  export * as url from "./url/index.js";
@@ -36,10 +36,9 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.url = exports.logging = void 0;
39
+ exports.url = void 0;
40
40
  __exportStar(require("./auth/index.js"), exports);
41
41
  __exportStar(require("./base64.js"), exports);
42
42
  __exportStar(require("./fetcher/index.js"), exports);
43
- exports.logging = __importStar(require("./logging/index.js"));
44
43
  __exportStar(require("./runtime/index.js"), exports);
45
44
  exports.url = __importStar(require("./url/index.js"));
@@ -71,17 +71,6 @@ function evaluateRuntime() {
71
71
  version: Bun.version,
72
72
  };
73
73
  }
74
- /**
75
- * A constant that indicates whether the environment the code is running is in React-Native.
76
- * This check should come before Node.js detection since React Native may have a process polyfill.
77
- * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js
78
- */
79
- const isReactNative = typeof navigator !== "undefined" && (navigator === null || navigator === void 0 ? void 0 : navigator.product) === "ReactNative";
80
- if (isReactNative) {
81
- return {
82
- type: "react-native",
83
- };
84
- }
85
74
  /**
86
75
  * A constant that indicates whether the environment the code is running is Node.JS.
87
76
  */
@@ -97,6 +86,16 @@ function evaluateRuntime() {
97
86
  parsedVersion: Number(process.versions.node.split(".")[0]),
98
87
  };
99
88
  }
89
+ /**
90
+ * A constant that indicates whether the environment the code is running is in React-Native.
91
+ * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js
92
+ */
93
+ const isReactNative = typeof navigator !== "undefined" && (navigator === null || navigator === void 0 ? void 0 : navigator.product) === "ReactNative";
94
+ if (isReactNative) {
95
+ return {
96
+ type: "react-native",
97
+ };
98
+ }
100
99
  return {
101
100
  type: "unknown",
102
101
  };
@@ -14,6 +14,7 @@ function join(base, ...segments) {
14
14
  url = new URL(base);
15
15
  }
16
16
  catch (_a) {
17
+ // Fallback to path joining if URL is malformed
17
18
  return joinPath(base, ...segments);
18
19
  }
19
20
  const lastSegment = segments[segments.length - 1];
@@ -6,11 +6,7 @@ const json_js_1 = require("../core/json.js");
6
6
  class PaidError extends Error {
7
7
  constructor({ message, statusCode, body, rawResponse, }) {
8
8
  super(buildMessage({ message, statusCode, body }));
9
- Object.setPrototypeOf(this, new.target.prototype);
10
- if (Error.captureStackTrace) {
11
- Error.captureStackTrace(this, this.constructor);
12
- }
13
- this.name = this.constructor.name;
9
+ Object.setPrototypeOf(this, PaidError.prototype);
14
10
  this.statusCode = statusCode;
15
11
  this.body = body;
16
12
  this.rawResponse = rawResponse;
@@ -5,11 +5,7 @@ exports.PaidTimeoutError = void 0;
5
5
  class PaidTimeoutError extends Error {
6
6
  constructor(message) {
7
7
  super(message);
8
- Object.setPrototypeOf(this, new.target.prototype);
9
- if (Error.captureStackTrace) {
10
- Error.captureStackTrace(this, this.constructor);
11
- }
12
- this.name = this.constructor.name;
8
+ Object.setPrototypeOf(this, PaidTimeoutError.prototype);
13
9
  }
14
10
  }
15
11
  exports.PaidTimeoutError = PaidTimeoutError;
@@ -3,4 +3,3 @@ export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js";
3
3
  export { PaidClient } from "./Client.js";
4
4
  export { PaidEnvironment } from "./environments.js";
5
5
  export { PaidError, PaidTimeoutError } from "./errors/index.js";
6
- export * from "./exports.js";
package/dist/cjs/index.js CHANGED
@@ -32,9 +32,6 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
36
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
- };
38
35
  Object.defineProperty(exports, "__esModule", { value: true });
39
36
  exports.PaidTimeoutError = exports.PaidError = exports.PaidEnvironment = exports.PaidClient = exports.Paid = void 0;
40
37
  exports.Paid = __importStar(require("./api/index.js"));
@@ -45,4 +42,3 @@ Object.defineProperty(exports, "PaidEnvironment", { enumerable: true, get: funct
45
42
  var index_js_1 = require("./errors/index.js");
46
43
  Object.defineProperty(exports, "PaidError", { enumerable: true, get: function () { return index_js_1.PaidError; } });
47
44
  Object.defineProperty(exports, "PaidTimeoutError", { enumerable: true, get: function () { return index_js_1.PaidTimeoutError; } });
48
- __exportStar(require("./exports.js"), exports);
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "1.0.0";
1
+ export declare const SDK_VERSION = "1.0.1-alpha0";
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SDK_VERSION = void 0;
4
- exports.SDK_VERSION = "1.0.0";
4
+ exports.SDK_VERSION = "1.0.1-alpha0";