apify-client 3.0.0-beta.9 → 3.0.0-beta.90

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 (122) hide show
  1. package/README.md +16 -2
  2. package/dist/apify_api_error.d.ts +13 -27
  3. package/dist/apify_api_error.js +33 -23
  4. package/dist/apify_client.d.ts +125 -10
  5. package/dist/apify_client.js +133 -48
  6. package/dist/apify_client_error.d.ts +10 -0
  7. package/dist/apify_client_error.js +10 -0
  8. package/dist/base/api_client.d.ts +7 -7
  9. package/dist/base/api_client.js +36 -36
  10. package/dist/base/resource_client.d.ts +21 -8
  11. package/dist/base/resource_client.js +70 -36
  12. package/dist/base/resource_collection_client.d.ts +12 -4
  13. package/dist/base/resource_collection_client.js +34 -11
  14. package/dist/body_parser.d.ts +3 -4
  15. package/dist/body_parser.js +19 -26
  16. package/dist/bundle.js +27 -22
  17. package/dist/bundle.js.map +1 -1
  18. package/dist/generated/api.d.ts +3040 -971
  19. package/dist/generated/schemas.d.ts +2369 -934
  20. package/dist/generated/schemas.js +570 -229
  21. package/dist/http_clients/axios.d.ts +61 -0
  22. package/dist/http_clients/axios.js +119 -0
  23. package/dist/http_clients/base.d.ts +386 -0
  24. package/dist/http_clients/base.js +650 -0
  25. package/dist/http_clients/index.d.ts +4 -0
  26. package/dist/http_clients/index.js +2 -0
  27. package/dist/http_compressors/base.d.ts +40 -0
  28. package/dist/http_compressors/base.js +9 -0
  29. package/dist/http_compressors/brotli.d.ts +33 -0
  30. package/dist/http_compressors/brotli.js +39 -0
  31. package/dist/http_compressors/gzip.d.ts +33 -0
  32. package/dist/http_compressors/gzip.js +39 -0
  33. package/dist/http_compressors/index.d.ts +6 -0
  34. package/dist/http_compressors/index.js +2 -0
  35. package/dist/http_compressors/resolve.d.ts +23 -0
  36. package/dist/http_compressors/resolve.js +27 -0
  37. package/dist/index.d.ts +6 -1
  38. package/dist/index.js +5 -1
  39. package/dist/invalid_response_body_error.d.ts +14 -0
  40. package/dist/invalid_response_body_error.js +18 -0
  41. package/dist/models.d.ts +166 -243
  42. package/dist/models.js +6 -4
  43. package/dist/resource_clients/actor.d.ts +104 -34
  44. package/dist/resource_clients/actor.js +130 -56
  45. package/dist/resource_clients/actor_collection.d.ts +18 -12
  46. package/dist/resource_clients/actor_collection.js +11 -3
  47. package/dist/resource_clients/actor_env_var.d.ts +11 -4
  48. package/dist/resource_clients/actor_env_var.js +16 -6
  49. package/dist/resource_clients/actor_env_var_collection.d.ts +9 -4
  50. package/dist/resource_clients/actor_env_var_collection.js +11 -4
  51. package/dist/resource_clients/actor_server.d.ts +141 -0
  52. package/dist/resource_clients/actor_server.js +195 -0
  53. package/dist/resource_clients/actor_version.d.ts +20 -5
  54. package/dist/resource_clients/actor_version.js +19 -9
  55. package/dist/resource_clients/actor_version_collection.d.ts +11 -4
  56. package/dist/resource_clients/actor_version_collection.js +13 -4
  57. package/dist/resource_clients/build.d.ts +20 -7
  58. package/dist/resource_clients/build.js +35 -15
  59. package/dist/resource_clients/build_collection.d.ts +7 -5
  60. package/dist/resource_clients/build_collection.js +4 -1
  61. package/dist/resource_clients/dataset.d.ts +83 -37
  62. package/dist/resource_clients/dataset.js +107 -121
  63. package/dist/resource_clients/dataset_collection.d.ts +10 -6
  64. package/dist/resource_clients/dataset_collection.js +13 -2
  65. package/dist/resource_clients/key_value_store.d.ts +108 -26
  66. package/dist/resource_clients/key_value_store.js +134 -52
  67. package/dist/resource_clients/key_value_store_collection.d.ts +10 -6
  68. package/dist/resource_clients/key_value_store_collection.js +13 -2
  69. package/dist/resource_clients/log.d.ts +40 -21
  70. package/dist/resource_clients/log.js +144 -66
  71. package/dist/resource_clients/request_queue.d.ts +76 -31
  72. package/dist/resource_clients/request_queue.js +178 -93
  73. package/dist/resource_clients/request_queue_collection.d.ts +9 -5
  74. package/dist/resource_clients/request_queue_collection.js +9 -3
  75. package/dist/resource_clients/run.d.ts +126 -28
  76. package/dist/resource_clients/run.js +193 -49
  77. package/dist/resource_clients/run_collection.d.ts +5 -3
  78. package/dist/resource_clients/run_collection.js +4 -1
  79. package/dist/resource_clients/schedule.d.ts +16 -7
  80. package/dist/resource_clients/schedule.js +30 -22
  81. package/dist/resource_clients/schedule_collection.d.ts +6 -2
  82. package/dist/resource_clients/schedule_collection.js +9 -3
  83. package/dist/resource_clients/store_collection.d.ts +6 -4
  84. package/dist/resource_clients/store_collection.js +4 -1
  85. package/dist/resource_clients/task.d.ts +36 -13
  86. package/dist/resource_clients/task.js +79 -46
  87. package/dist/resource_clients/task_collection.d.ts +9 -5
  88. package/dist/resource_clients/task_collection.js +9 -3
  89. package/dist/resource_clients/user.d.ts +19 -10
  90. package/dist/resource_clients/user.js +42 -38
  91. package/dist/resource_clients/webhook.d.ts +17 -8
  92. package/dist/resource_clients/webhook.js +30 -22
  93. package/dist/resource_clients/webhook_collection.d.ts +8 -4
  94. package/dist/resource_clients/webhook_collection.js +9 -3
  95. package/dist/resource_clients/webhook_dispatch.d.ts +4 -1
  96. package/dist/resource_clients/webhook_dispatch.js +7 -2
  97. package/dist/resource_clients/webhook_dispatch_collection.d.ts +3 -1
  98. package/dist/resource_clients/webhook_dispatch_collection.js +4 -1
  99. package/dist/response_validation_error.d.ts +2 -1
  100. package/dist/response_validation_error.js +2 -1
  101. package/dist/runtime/node.d.ts +6 -0
  102. package/dist/runtime/node.js +80 -0
  103. package/dist/runtime/types.d.ts +60 -0
  104. package/dist/runtime/types.js +1 -0
  105. package/dist/runtime/web.d.ts +5 -0
  106. package/dist/runtime/web.js +21 -0
  107. package/dist/schemas.d.ts +368 -4
  108. package/dist/schemas.js +26 -4
  109. package/dist/statistics.d.ts +1 -6
  110. package/dist/statistics.js +2 -2
  111. package/dist/timeouts.d.ts +84 -0
  112. package/dist/timeouts.js +37 -0
  113. package/dist/timezones.d.ts +1 -1
  114. package/dist/utils.d.ts +89 -59
  115. package/dist/utils.js +216 -158
  116. package/dist/wait_for_resources.d.ts +8 -0
  117. package/dist/wait_for_resources.js +39 -0
  118. package/package.json +37 -34
  119. package/dist/http_client.d.ts +0 -88
  120. package/dist/http_client.js +0 -255
  121. package/dist/interceptors.d.ts +0 -19
  122. package/dist/interceptors.js +0 -105
@@ -1,8 +1,24 @@
1
1
  import { z } from 'zod';
2
2
  import { createStorageContentSignatureAsync } from '@apify/utilities';
3
- import { DEFAULT_TIMEOUT_MILLIS, MEDIUM_TIMEOUT_MILLIS, ResourceClient, SMALL_TIMEOUT_MILLIS, } from '../base/resource_client.js';
3
+ import { ResourceClient } from '../base/resource_client.js';
4
4
  import * as schemas from '../schemas.js';
5
- import { anyObjectSchema, applyQueryParamsToUrl, cast, catchNotFoundOrThrow, isNonArrayObject, paginationOptionsShape, parseArgument, parseResponse, } from '../utils.js';
5
+ import { timeoutOptionsSchema, timeoutOptionsShape } from '../timeouts.js';
6
+ import { runtime } from '#runtime';
7
+ import { anyObjectSchema, applyQueryParamsToUrl, cast, isNonArrayObject, paginationOptionsShape, parseArgument, parseResponse, } from '../utils.js';
8
+ /**
9
+ * Supported formats for downloading dataset items.
10
+ */
11
+ export var DownloadItemsFormat;
12
+ (function (DownloadItemsFormat) {
13
+ DownloadItemsFormat["JSON"] = "json";
14
+ DownloadItemsFormat["JSONL"] = "jsonl";
15
+ DownloadItemsFormat["XML"] = "xml";
16
+ DownloadItemsFormat["HTML"] = "html";
17
+ DownloadItemsFormat["CSV"] = "csv";
18
+ DownloadItemsFormat["XLSX"] = "xlsx";
19
+ DownloadItemsFormat["RSS"] = "rss";
20
+ })(DownloadItemsFormat || (DownloadItemsFormat = {}));
21
+ const itemFormatSchema = z.enum(DownloadItemsFormat);
6
22
  // A predicate, not a `z.object()` arm, which would walk and copy every key of every pushed item.
7
23
  const itemSchema = z.custom(isNonArrayObject, 'Expected an object');
8
24
  const listItemsOptionsSchema = z.strictObject({
@@ -14,9 +30,10 @@ const listItemsOptionsSchema = z.strictObject({
14
30
  ...paginationOptionsShape,
15
31
  skipEmpty: z.boolean().optional(),
16
32
  skipHidden: z.boolean().optional(),
17
- unwind: z.union([z.string(), z.array(z.string())]).optional(),
33
+ unwind: z.array(z.string()).optional(),
18
34
  view: z.string().optional(),
19
35
  signature: z.string().optional(),
36
+ ...timeoutOptionsShape,
20
37
  });
21
38
  // Spells out `limit` / `offset` instead of spreading `paginationOptionsShape`: a download is one
22
39
  // request, so `chunkSize` has nothing to size. The options type omits it to match.
@@ -34,28 +51,33 @@ const downloadItemsOptionsSchema = z.strictObject({
34
51
  skipEmpty: z.boolean().optional(),
35
52
  skipHeaderRow: z.boolean().optional(),
36
53
  skipHidden: z.boolean().optional(),
37
- unwind: z.union([z.string(), z.array(z.string())]).optional(),
54
+ unwind: z.array(z.string()).optional(),
38
55
  view: z.string().optional(),
39
56
  xmlRoot: z.string().optional(),
40
57
  xmlRow: z.string().optional(),
41
58
  signature: z.string().optional(),
59
+ stream: z.boolean().optional(),
60
+ ...timeoutOptionsShape,
42
61
  });
43
- const pushItemsSchema = z.union([itemSchema, z.string(), z.array(z.union([itemSchema, z.string()]))]);
44
- // Every option becomes a query parameter of the generated URL, so `chunkSize` (client-side only) and
45
- // `signature` (which this method produces) are left out. The options type omits both to match.
62
+ const pushItemsSchema = z.union([itemSchema, z.string(), z.array(itemSchema)]);
63
+ // Apart from `timeoutSecs`, `signal` and `expiresInSecs`, every option becomes a query parameter of the generated
64
+ // URL, so `chunkSize` (client-side only) and `signature` (which this method produces) are left out. The options type
65
+ // omits both to match.
46
66
  const createItemsPublicUrlOptionsSchema = z.strictObject({
47
67
  clean: z.boolean().optional(),
48
68
  desc: z.boolean().optional(),
49
69
  flatten: z.array(z.string()).optional(),
50
70
  fields: z.array(z.string()).optional(),
71
+ format: itemFormatSchema.optional(),
51
72
  omit: z.array(z.string()).optional(),
52
73
  limit: z.number().min(0).optional(),
53
74
  offset: z.number().min(0).optional(),
54
75
  skipEmpty: z.boolean().optional(),
55
76
  skipHidden: z.boolean().optional(),
56
- unwind: z.union([z.string(), z.array(z.string())]).optional(),
77
+ unwind: z.array(z.string()).optional(),
57
78
  view: z.string().optional(),
58
- expiresInSecs: z.number().optional(),
79
+ expiresInSecs: z.number().positive().optional(),
80
+ ...timeoutOptionsShape,
59
81
  });
60
82
  /**
61
83
  * Client for managing a specific Dataset.
@@ -99,30 +121,39 @@ export class DatasetClient extends ResourceClient {
99
121
  /**
100
122
  * Gets the dataset object from the Apify API.
101
123
  *
124
+ * @param options - Request options
125
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'short'`.
102
126
  * @returns The Dataset object, or `undefined` if it does not exist
103
127
  * @see https://docs.apify.com/api/v2/dataset-get
104
128
  */
105
- async get() {
106
- return this._get(schemas.Dataset(), {}, SMALL_TIMEOUT_MILLIS);
129
+ async get(options = {}) {
130
+ const { timeoutSecs = 'short', signal } = parseArgument(options, timeoutOptionsSchema, 'TimeoutOptions');
131
+ return this.getResource(schemas.DatasetResource(), {}, timeoutSecs, signal);
107
132
  }
108
133
  /**
109
134
  * Updates the dataset with specified fields.
110
135
  *
111
136
  * @param newFields - Fields to update in the dataset
137
+ * @param options - Request options
138
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'short'`.
112
139
  * @returns The updated Dataset object
113
140
  * @see https://docs.apify.com/api/v2/dataset-put
114
141
  */
115
- async update(newFields) {
142
+ async update(newFields, options = {}) {
116
143
  parseArgument(newFields, anyObjectSchema);
117
- return this._update(schemas.Dataset(), newFields, SMALL_TIMEOUT_MILLIS);
144
+ const { timeoutSecs = 'short', signal } = parseArgument(options, timeoutOptionsSchema, 'TimeoutOptions');
145
+ return this.updateResource(schemas.DatasetResource(), newFields, timeoutSecs, signal);
118
146
  }
119
147
  /**
120
148
  * Deletes the dataset.
121
149
  *
150
+ * @param options - Request options
151
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'short'`.
122
152
  * @see https://docs.apify.com/api/v2/dataset-delete
123
153
  */
124
- async delete() {
125
- return this._delete(SMALL_TIMEOUT_MILLIS);
154
+ async delete(options = {}) {
155
+ const { timeoutSecs = 'short', signal } = parseArgument(options, timeoutOptionsSchema, 'TimeoutOptions');
156
+ return this.deleteResource(timeoutSecs, signal);
126
157
  }
127
158
  /**
128
159
  * Lists items in the dataset.
@@ -142,8 +173,9 @@ export class DatasetClient extends ResourceClient {
142
173
  * @param options.skipEmpty - If `true`, skips empty items. Default is `false`.
143
174
  * @param options.skipHidden - If `true`, skips hidden fields (fields starting with `#`). Default is `false`.
144
175
  * @param options.flatten - Array of field names to flatten. Nested objects are converted to dot notation (e.g., `obj.field`).
145
- * @param options.unwind - Field name or array of field names to unwind. Each array value creates a separate item.
176
+ * @param options.unwind - Array of field names to unwind. Each array value creates a separate item.
146
177
  * @param options.view - Name of a predefined view to use for field selection.
178
+ * @param options.timeoutSecs - Timeout for each API request. Default is `'long'`.
147
179
  * @returns A paginated list with `items`, `total` count, `offset`, `count`, and `limit`
148
180
  * @see https://docs.apify.com/api/v2/dataset-items-get
149
181
  *
@@ -169,83 +201,51 @@ export class DatasetClient extends ResourceClient {
169
201
  * ```
170
202
  */
171
203
  listItems(options = {}) {
172
- const parsed = parseArgument(options, listItemsOptionsSchema, 'DatasetClientListItemOptions');
204
+ const { timeoutSecs = 'long', signal, ...listOptions } = parseArgument(options, listItemsOptionsSchema, 'DatasetClientListItemOptions');
173
205
  const fetchItems = async (datasetListOptions = {}) => {
174
206
  const response = await this.httpClient.call({
175
- url: this._url('items'),
207
+ url: this.buildUrl('items'),
176
208
  method: 'GET',
177
- params: this._params(datasetListOptions),
178
- timeout: DEFAULT_TIMEOUT_MILLIS,
209
+ params: this.buildParams(datasetListOptions),
210
+ timeoutSecs,
211
+ signal,
179
212
  });
180
- return this._createPaginationList(response, datasetListOptions.desc ?? false);
213
+ return this.#createPaginationList(response, datasetListOptions.desc ?? false);
181
214
  };
182
- return this._listPaginatedFromCallback(fetchItems, parsed);
215
+ return this.listPaginatedFromCallback(fetchItems, listOptions);
183
216
  }
184
- /**
185
- * Downloads dataset items in a specific format.
186
- *
187
- * Unlike {@link listItems} which returns a {@link PaginatedList} with an array of individual
188
- * dataset items, this method returns the items serialized to the provided format
189
- * (JSON, CSV, Excel, etc.) as a Buffer. Useful for exporting data for further processing.
190
- *
191
- * @param format - Output format: `'json'`, `'jsonl'`, `'csv'`, `'xlsx'`, `'xml'`, `'rss'`, or `'html'`
192
- * @param options - Download and formatting options (extends all options from {@link listItems})
193
- * @param options.attachment - If `true`, the response will have `Content-Disposition: attachment` header.
194
- * @param options.bom - If `true`, adds UTF-8 BOM to the beginning of the file (useful for Excel compatibility).
195
- * @param options.delimiter - CSV delimiter character. Default is `,` (comma).
196
- * @param options.skipHeaderRow - If `true`, CSV export will not include the header row with field names.
197
- * @param options.xmlRoot - Name of the root XML element. Default is `'items'`.
198
- * @param options.xmlRow - Name of the XML element for each item. Default is `'item'`.
199
- * @param options.fields - Array of field names to include in the export.
200
- * @param options.omit - Array of field names to exclude from the export.
201
- * @returns Buffer containing the serialized data in the specified format
202
- * @see https://docs.apify.com/api/v2/dataset-items-get
203
- *
204
- * @example
205
- * ```javascript
206
- * // Download as CSV with BOM for Excel compatibility
207
- * const csvBuffer = await client.dataset('my-dataset').downloadItems('csv', { bom: true });
208
- * require('fs').writeFileSync('output.csv', csvBuffer);
209
- *
210
- * // Download as Excel with custom options
211
- * const xlsxBuffer = await client.dataset('my-dataset').downloadItems('xlsx', {
212
- * fields: ['url', 'title', 'price'],
213
- * skipEmpty: true,
214
- * limit: 1000
215
- * });
216
- *
217
- * // Download as XML with custom element names
218
- * const xmlBuffer = await client.dataset('my-dataset').downloadItems('xml', {
219
- * xmlRoot: 'products',
220
- * xmlRow: 'product'
221
- * });
222
- * ```
223
- */
224
217
  async downloadItems(format, options = {}) {
225
218
  parseArgument(format, itemFormatSchema);
226
- const parsed = parseArgument(options, downloadItemsOptionsSchema, 'DatasetClientDownloadItemsOptions');
219
+ const { timeoutSecs = 'long', signal, stream, ...query } = parseArgument(options, downloadItemsOptionsSchema, 'DatasetClientDownloadItemsOptions');
220
+ if (stream && !runtime.isNode) {
221
+ throw new Error('The stream option can only be used in Node.js environment.');
222
+ }
227
223
  const { data } = await this.httpClient.call({
228
- url: this._url('items'),
224
+ url: this.buildUrl('items'),
229
225
  method: 'GET',
230
- params: this._params({
226
+ params: this.buildParams({
231
227
  format,
232
- ...parsed,
228
+ ...query,
233
229
  }),
234
- forceBuffer: true,
235
- timeout: DEFAULT_TIMEOUT_MILLIS,
230
+ responseType: stream ? 'stream' : 'buffer',
231
+ timeoutSecs,
232
+ signal,
236
233
  });
237
234
  return cast(data);
238
235
  }
239
236
  /**
240
237
  * Stores one or more items into the dataset.
241
238
  *
242
- * Items can be objects, strings, or arrays thereof. Each item will be stored as a separate
243
- * record in the dataset. Objects are automatically serialized to JSON. If you provide an array,
244
- * all items will be stored in order. This method is idempotent - calling it multiple times
245
- * with the same data will not create duplicates, but will append items each time.
239
+ * Each item will be stored as a separate record in the dataset. Objects are automatically
240
+ * serialized to JSON. If you provide an array, all items will be stored in order. This method
241
+ * is idempotent - calling it multiple times with the same data will not create duplicates, but
242
+ * will append items each time.
246
243
  *
247
- * @param items - A single item (object or string) or an array of items to store.
248
- * Objects are automatically stringified to JSON. Strings are stored as-is.
244
+ * @param items - A single item, an array of items, or a string that is the JSON serialization of
245
+ * either - the API only accepts an object or an array of objects, so a plain string
246
+ * is not a valid item on its own.
247
+ * @param options - Request options
248
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'medium'`.
249
249
  * @see https://docs.apify.com/api/v2/dataset-items-post
250
250
  *
251
251
  * @example
@@ -263,23 +263,22 @@ export class DatasetClient extends ResourceClient {
263
263
  * { url: 'https://test.com', title: 'Test' },
264
264
  * { url: 'https://demo.com', title: 'Demo' }
265
265
  * ]);
266
- *
267
- * // Store string items
268
- * await client.dataset('my-dataset').pushItems(['item1', 'item2', 'item3']);
269
266
  * ```
270
267
  */
271
- async pushItems(items) {
268
+ async pushItems(items, options = {}) {
272
269
  parseArgument(items, pushItemsSchema);
270
+ const { timeoutSecs = 'medium', signal } = parseArgument(options, timeoutOptionsSchema, 'TimeoutOptions');
273
271
  await this.httpClient.call({
274
- url: this._url('items'),
272
+ url: this.buildUrl('items'),
275
273
  method: 'POST',
276
274
  headers: {
277
275
  'content-type': 'application/json; charset=utf-8',
278
276
  },
279
277
  data: items,
280
- params: this._params(),
281
- doNotRetryTimeouts: true, // see timeout handling in http-client
282
- timeout: MEDIUM_TIMEOUT_MILLIS,
278
+ params: this.buildParams(),
279
+ doNotRetryTimeouts: true,
280
+ timeoutSecs,
281
+ signal,
283
282
  });
284
283
  }
285
284
  /**
@@ -288,25 +287,22 @@ export class DatasetClient extends ResourceClient {
288
287
  * Returns statistics for each field in the dataset, including information about
289
288
  * data types, null counts, and value ranges.
290
289
  *
291
- * @returns Dataset statistics, or `undefined` if not available
290
+ * @param options - Request options
291
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'short'`.
292
+ * @returns Dataset statistics
292
293
  * @see https://docs.apify.com/api/v2/dataset-statistics-get
293
294
  * @since Added in 2.11.2
294
295
  */
295
- async getStatistics() {
296
- const requestOpts = {
297
- url: this._url('statistics'),
296
+ async getStatistics(options = {}) {
297
+ const { timeoutSecs = 'short', signal } = parseArgument(options, timeoutOptionsSchema, 'TimeoutOptions');
298
+ const response = await this.httpClient.call({
299
+ url: this.buildUrl('statistics'),
298
300
  method: 'GET',
299
- params: this._params(),
300
- timeout: SMALL_TIMEOUT_MILLIS,
301
- };
302
- try {
303
- const response = await this.httpClient.call(requestOpts);
304
- return parseResponse(response, schemas.DatasetStatistics());
305
- }
306
- catch (err) {
307
- catchNotFoundOrThrow(err);
308
- }
309
- return undefined;
301
+ params: this.buildParams(),
302
+ timeoutSecs,
303
+ signal,
304
+ });
305
+ return parseResponse(response, schemas.DatasetStatistics());
310
306
  }
311
307
  /**
312
308
  * Generates a public URL for accessing dataset items.
@@ -316,10 +312,13 @@ export class DatasetClient extends ResourceClient {
316
312
  * This is useful for sharing dataset results with external services or users.
317
313
  *
318
314
  * @param options - URL generation options (extends all options from {@link listItems})
319
- * @param options.expiresInSecs - Number of seconds until the signed URL expires. If omitted, the URL never expires.
315
+ * @param options.expiresInSecs - Number of seconds until the signed URL expires. Must be positive. If omitted, the URL
316
+ * never expires.
320
317
  * @param options.fields - Array of field names to include in the response.
318
+ * @param options.format - Format of the items served by the URL. Defaults to `json`.
321
319
  * @param options.limit - Maximum number of items to return.
322
320
  * @param options.offset - Number of items to skip.
321
+ * @param options.timeoutSecs - Timeout for the API request that fetches the dataset. Default is `'long'`.
323
322
  * @returns A public URL string for accessing the dataset items
324
323
  *
325
324
  * @example
@@ -341,10 +340,9 @@ export class DatasetClient extends ResourceClient {
341
340
  * @since Added in 2.13.0
342
341
  */
343
342
  async createItemsPublicUrl(options = {}) {
344
- const parsed = parseArgument(options, createItemsPublicUrlOptionsSchema, 'DatasetClientCreateItemsUrlOptions');
345
- const dataset = await this.get();
346
- const { expiresInSecs, ...queryOptions } = parsed;
347
- let createdItemsPublicUrl = new URL(this._publicUrl('items'));
343
+ const { timeoutSecs = 'long', signal, expiresInSecs, ...queryOptions } = parseArgument(options, createItemsPublicUrlOptionsSchema, 'DatasetClientCreateItemsUrlOptions');
344
+ const dataset = await this.get({ timeoutSecs, signal });
345
+ let createdItemsPublicUrl = new URL(this.buildPublicUrl('items'));
348
346
  if (dataset?.urlSigningSecretKey) {
349
347
  const signature = await createStorageContentSignatureAsync({
350
348
  resourceId: dataset.id,
@@ -356,31 +354,19 @@ export class DatasetClient extends ResourceClient {
356
354
  createdItemsPublicUrl = applyQueryParamsToUrl(createdItemsPublicUrl, queryOptions);
357
355
  return createdItemsPublicUrl.toString();
358
356
  }
359
- _createPaginationList(response, userProvidedDesc) {
357
+ #createPaginationList(response, userProvidedDesc) {
358
+ const descHeader = response.headers['x-apify-pagination-desc'];
360
359
  return {
361
360
  items: response.data,
362
361
  total: Number(response.headers['x-apify-pagination-total']),
363
362
  offset: Number(response.headers['x-apify-pagination-offset']),
364
- count: response.data.length, // because x-apify-pagination-count returns invalid values when hidden/empty items are skipped
363
+ // `x-apify-pagination-count` reports the rows scanned, which filters and `unwind` can leave above or below
364
+ // the items returned. It is derived from the dataset's item count, which lags a fresh push, so it can also
365
+ // fall below the items returned on an unfiltered page.
366
+ count: Math.max(Number(response.headers['x-apify-pagination-count'] ?? 0), response.data.length),
365
367
  limit: Number(response.headers['x-apify-pagination-limit']), // API returns 999999999999 when no limit is used
366
368
  // TODO: Replace this once https://github.com/apify/apify-core/issues/3503 is solved
367
- desc: JSON.parse(response.headers['x-apify-pagination-desc'] ?? userProvidedDesc),
369
+ desc: typeof descHeader === 'string' ? JSON.parse(descHeader) : userProvidedDesc,
368
370
  };
369
371
  }
370
372
  }
371
- /**
372
- * Supported formats for downloading dataset items.
373
- */
374
- export var DownloadItemsFormat;
375
- (function (DownloadItemsFormat) {
376
- DownloadItemsFormat["JSON"] = "json";
377
- DownloadItemsFormat["JSONL"] = "jsonl";
378
- DownloadItemsFormat["XML"] = "xml";
379
- DownloadItemsFormat["HTML"] = "html";
380
- DownloadItemsFormat["CSV"] = "csv";
381
- DownloadItemsFormat["XLSX"] = "xlsx";
382
- DownloadItemsFormat["RSS"] = "rss";
383
- })(DownloadItemsFormat || (DownloadItemsFormat = {}));
384
- const validItemFormats = [...new Set(Object.values(DownloadItemsFormat).map((item) => item.toLowerCase()))];
385
- // Declared below `validItemFormats` because it references it at module load time.
386
- const itemFormatSchema = z.enum(validItemFormats);
@@ -1,8 +1,9 @@
1
1
  import { STORAGE_OWNERSHIP_FILTER } from '@apify/consts';
2
2
  import type { ApiClientSubResourceOptions } from '../base/api_client.js';
3
3
  import { ResourceCollectionClient } from '../base/resource_collection_client.js';
4
+ import type { TimeoutOptions } from '../timeouts.js';
4
5
  import type { PaginatedList, PaginationOptions } from '../utils.js';
5
- import type { Dataset } from './dataset.js';
6
+ import type { DatasetResource } from './dataset.js';
6
7
  /**
7
8
  * Client for managing the collection of datasets in your account.
8
9
  *
@@ -45,21 +46,24 @@ export declare class DatasetCollectionClient extends ResourceCollectionClient {
45
46
  * ```
46
47
  *
47
48
  * @param options - Pagination options.
49
+ * @param options.timeoutSecs - Timeout for each API request. Default is `'medium'`.
48
50
  * @returns A paginated iterator of Datasets.
49
51
  * @see https://docs.apify.com/api/v2/datasets-get
50
52
  */
51
- list(options?: DatasetCollectionClientListOptions): Promise<DatasetCollectionClientListResult> & AsyncIterable<Dataset>;
53
+ list(options?: DatasetCollectionClientListOptions): Promise<DatasetCollectionClientListResult> & AsyncIterable<DatasetResource>;
52
54
  /**
53
55
  * Gets or creates a dataset with the specified name.
54
56
  *
55
57
  * @param name - Name of the dataset. If not provided, a default dataset is used.
56
58
  * @param options - Additional options like schema.
59
+ * @param options.schema - Schema of the dataset.
60
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'short'`.
57
61
  * @returns The dataset object.
58
62
  * @see https://docs.apify.com/api/v2/datasets-post
59
63
  */
60
- getOrCreate(name?: string, options?: DatasetCollectionClientGetOrCreateOptions): Promise<Dataset>;
64
+ getOrCreate(name?: string, options?: DatasetCollectionClientGetOrCreateOptions): Promise<DatasetResource>;
61
65
  }
62
- export interface DatasetCollectionClientListOptions extends PaginationOptions {
66
+ export interface DatasetCollectionClientListOptions extends PaginationOptions, TimeoutOptions {
63
67
  unnamed?: boolean;
64
68
  desc?: boolean;
65
69
  /**
@@ -71,9 +75,9 @@ export interface DatasetCollectionClientListOptions extends PaginationOptions {
71
75
  /**
72
76
  * @since Added in 2.3.0
73
77
  */
74
- export interface DatasetCollectionClientGetOrCreateOptions {
78
+ export interface DatasetCollectionClientGetOrCreateOptions extends TimeoutOptions {
75
79
  schema?: Record<string, unknown>;
76
80
  }
77
- export type DatasetCollectionClientListResult = PaginatedList<Dataset> & {
81
+ export type DatasetCollectionClientListResult = PaginatedList<DatasetResource> & {
78
82
  unnamed: boolean;
79
83
  };
@@ -2,12 +2,14 @@ import { z } from 'zod';
2
2
  import { STORAGE_OWNERSHIP_FILTER } from '@apify/consts';
3
3
  import { ResourceCollectionClient } from '../base/resource_collection_client.js';
4
4
  import * as schemas from '../schemas.js';
5
+ import { optionalSignalSchema, optionalTimeoutSchema, timeoutOptionsShape } from '../timeouts.js';
5
6
  import { anyObjectSchema, paginationOptionsShape, parseArgument } from '../utils.js';
6
7
  const listOptionsSchema = z.strictObject({
7
8
  unnamed: z.boolean().optional(),
8
9
  ...paginationOptionsShape,
9
10
  desc: z.boolean().optional(),
10
11
  ownership: z.enum(STORAGE_OWNERSHIP_FILTER).optional(),
12
+ ...timeoutOptionsShape,
11
13
  });
12
14
  const nameSchema = z.string().optional();
13
15
  const schemaSchema = anyObjectSchema.optional();
@@ -58,24 +60,33 @@ export class DatasetCollectionClient extends ResourceCollectionClient {
58
60
  * ```
59
61
  *
60
62
  * @param options - Pagination options.
63
+ * @param options.timeoutSecs - Timeout for each API request. Default is `'medium'`.
61
64
  * @returns A paginated iterator of Datasets.
62
65
  * @see https://docs.apify.com/api/v2/datasets-get
63
66
  */
64
67
  list(options = {}) {
65
68
  const parsed = parseArgument(options, listOptionsSchema, 'DatasetCollectionClientListOptions');
66
- return this._listPaginated(schemas.ListOfDatasets(), parsed);
69
+ return this.listResourcesPaginated(schemas.ListOfDatasets(), parsed, 'medium');
67
70
  }
68
71
  /**
69
72
  * Gets or creates a dataset with the specified name.
70
73
  *
71
74
  * @param name - Name of the dataset. If not provided, a default dataset is used.
72
75
  * @param options - Additional options like schema.
76
+ * @param options.schema - Schema of the dataset.
77
+ * @param options.timeoutSecs - Timeout for the API request. Default is `'short'`.
73
78
  * @returns The dataset object.
74
79
  * @see https://docs.apify.com/api/v2/datasets-post
75
80
  */
76
81
  async getOrCreate(name, options) {
77
82
  parseArgument(name, nameSchema);
78
83
  parseArgument(options?.schema, schemaSchema); // TODO: Add schema validation
79
- return this._getOrCreate(schemas.Dataset(), name, options);
84
+ parseArgument(options?.timeoutSecs, optionalTimeoutSchema);
85
+ parseArgument(options?.signal, optionalSignalSchema);
86
+ // `timeoutSecs` and `signal` are not part of the resource, so the body carries only the rest, and stays
87
+ // absent when there is nothing else to send.
88
+ const { timeoutSecs = 'short', signal, ...resource } = options ?? {};
89
+ const hasResource = Object.keys(resource).length > 0;
90
+ return this.getOrCreateResource(schemas.DatasetResource(), name, hasResource ? resource : undefined, timeoutSecs, signal);
80
91
  }
81
92
  }