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

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