@crawlee/memory-storage 4.0.0-beta.6 → 4.0.0-beta.60

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 (53) hide show
  1. package/README.md +9 -5
  2. package/background-handler/fs-utils.d.ts +2 -1
  3. package/background-handler/fs-utils.d.ts.map +1 -1
  4. package/background-handler/fs-utils.js +2 -4
  5. package/background-handler/fs-utils.js.map +1 -1
  6. package/background-handler/index.d.ts +2 -1
  7. package/background-handler/index.d.ts.map +1 -1
  8. package/background-handler/index.js +4 -4
  9. package/background-handler/index.js.map +1 -1
  10. package/cache-helpers.d.ts.map +1 -1
  11. package/cache-helpers.js +9 -9
  12. package/cache-helpers.js.map +1 -1
  13. package/fs/key-value-store/fs.d.ts +1 -0
  14. package/fs/key-value-store/fs.d.ts.map +1 -1
  15. package/fs/key-value-store/fs.js +7 -3
  16. package/fs/key-value-store/fs.js.map +1 -1
  17. package/fs/key-value-store/index.d.ts +2 -0
  18. package/fs/key-value-store/index.d.ts.map +1 -1
  19. package/fs/key-value-store/index.js.map +1 -1
  20. package/memory-storage.d.ts +21 -10
  21. package/memory-storage.d.ts.map +1 -1
  22. package/memory-storage.js +127 -39
  23. package/memory-storage.js.map +1 -1
  24. package/package.json +5 -5
  25. package/resource-clients/dataset.d.ts +5 -3
  26. package/resource-clients/dataset.d.ts.map +1 -1
  27. package/resource-clients/dataset.js +48 -47
  28. package/resource-clients/dataset.js.map +1 -1
  29. package/resource-clients/key-value-store.d.ts +14 -2
  30. package/resource-clients/key-value-store.d.ts.map +1 -1
  31. package/resource-clients/key-value-store.js +161 -74
  32. package/resource-clients/key-value-store.js.map +1 -1
  33. package/resource-clients/request-queue.d.ts +1 -2
  34. package/resource-clients/request-queue.d.ts.map +1 -1
  35. package/resource-clients/request-queue.js +61 -98
  36. package/resource-clients/request-queue.js.map +1 -1
  37. package/utils.d.ts +50 -2
  38. package/utils.d.ts.map +1 -1
  39. package/utils.js +141 -2
  40. package/utils.js.map +1 -1
  41. package/resource-clients/dataset-collection.d.ts +0 -14
  42. package/resource-clients/dataset-collection.d.ts.map +0 -1
  43. package/resource-clients/dataset-collection.js +0 -49
  44. package/resource-clients/dataset-collection.js.map +0 -1
  45. package/resource-clients/key-value-store-collection.d.ts +0 -14
  46. package/resource-clients/key-value-store-collection.d.ts.map +0 -1
  47. package/resource-clients/key-value-store-collection.js +0 -53
  48. package/resource-clients/key-value-store-collection.js.map +0 -1
  49. package/resource-clients/request-queue-collection.d.ts +0 -14
  50. package/resource-clients/request-queue-collection.d.ts.map +0 -1
  51. package/resource-clients/request-queue-collection.js +0 -53
  52. package/resource-clients/request-queue-collection.js.map +0 -1
  53. package/tsconfig.build.tsbuildinfo +0 -1
package/utils.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { s } from '@sapphire/shapeshift';
3
- import defaultLog from '@apify/log';
4
3
  import { REQUEST_ID_LENGTH } from './consts.js';
5
4
  /**
6
5
  * Removes all properties with a null value
@@ -39,5 +38,145 @@ export function isStream(value) {
39
38
  value &&
40
39
  ['on', 'pipe'].every((key) => key in value && typeof value[key] === 'function'));
41
40
  }
42
- export const memoryStorageLog = defaultLog.child({ prefix: 'MemoryStorage' });
41
+ /**
42
+ * Creates a hybrid Promise + AsyncIterable for offset-based pagination (Dataset.listItems).
43
+ *
44
+ * The returned object can be:
45
+ * - Awaited directly to get the first page (backward compatible)
46
+ * - Used with `for await...of` to iterate through all items
47
+ */
48
+ export function createPaginatedList(getPage, options = {}) {
49
+ const offset = options.offset ?? 0;
50
+ // Immediately fetch the first page (Infinity is used when no limit, gets clamped by Math.min downstream)
51
+ const firstPagePromise = getPage(offset, options.limit ?? Infinity);
52
+ async function* asyncGenerator() {
53
+ let currentPage = await firstPagePromise;
54
+ yield* currentPage.items;
55
+ const limit = Math.min(options.limit ?? currentPage.total, currentPage.total);
56
+ let currentOffset = offset + currentPage.items.length;
57
+ let remainingItems = Math.min(currentPage.total - offset, limit) - currentPage.items.length;
58
+ while (currentPage.items.length > 0 && // Continue only if at least some items were returned in the last page.
59
+ remainingItems > 0) {
60
+ currentPage = await getPage(currentOffset, remainingItems);
61
+ yield* currentPage.items;
62
+ currentOffset += currentPage.items.length;
63
+ remainingItems -= currentPage.items.length;
64
+ }
65
+ }
66
+ return Object.defineProperty(firstPagePromise, Symbol.asyncIterator, {
67
+ value: asyncGenerator,
68
+ });
69
+ }
70
+ /**
71
+ * Creates a hybrid Promise + AsyncIterable for cursor-based pagination (KeyValueStore.listKeys).
72
+ *
73
+ * The returned object can be:
74
+ * - Awaited directly to get the first page (backward compatible)
75
+ * - Used with `for await...of` to iterate through all keys
76
+ */
77
+ export function createKeyList(getPage, options = {}) {
78
+ // Immediately fetch the first page
79
+ const firstPagePromise = getPage(options.exclusiveStartKey);
80
+ async function* asyncGenerator() {
81
+ let currentPage = await firstPagePromise;
82
+ yield* currentPage.items;
83
+ let remainingItems = options.limit ? options.limit - currentPage.items.length : undefined;
84
+ while (currentPage.items.length > 0 &&
85
+ currentPage.nextExclusiveStartKey !== undefined &&
86
+ (remainingItems === undefined || remainingItems > 0)) {
87
+ currentPage = await getPage(currentPage.nextExclusiveStartKey);
88
+ yield* currentPage.items;
89
+ if (remainingItems !== undefined) {
90
+ remainingItems -= currentPage.items.length;
91
+ }
92
+ }
93
+ }
94
+ return Object.defineProperty(firstPagePromise, Symbol.asyncIterator, {
95
+ value: asyncGenerator,
96
+ });
97
+ }
98
+ /**
99
+ * Creates a hybrid Promise + AsyncIterable that yields only key strings (KeyValueStore.keys).
100
+ *
101
+ * The returned object can be:
102
+ * - Awaited directly to get the first page (backward compatible)
103
+ * - Used with `for await...of` to iterate through all key strings
104
+ */
105
+ export function createKeyStringList(getPage, options = {}) {
106
+ // Immediately fetch the first page
107
+ const firstPagePromise = getPage(options.exclusiveStartKey);
108
+ async function* asyncGenerator() {
109
+ let currentPage = await firstPagePromise;
110
+ for (const item of currentPage.items) {
111
+ yield item.key;
112
+ }
113
+ let remainingItems = options.limit ? options.limit - currentPage.items.length : undefined;
114
+ while (currentPage.items.length > 0 &&
115
+ currentPage.nextExclusiveStartKey !== undefined &&
116
+ (remainingItems === undefined || remainingItems > 0)) {
117
+ currentPage = await getPage(currentPage.nextExclusiveStartKey);
118
+ for (const item of currentPage.items) {
119
+ yield item.key;
120
+ }
121
+ if (remainingItems !== undefined) {
122
+ remainingItems -= currentPage.items.length;
123
+ }
124
+ }
125
+ }
126
+ return Object.defineProperty(firstPagePromise, Symbol.asyncIterator, {
127
+ value: asyncGenerator,
128
+ });
129
+ }
130
+ /**
131
+ * Creates a hybrid Promise + AsyncIterable for offset-based pagination with index-value entries (Dataset.listEntries).
132
+ *
133
+ * The returned object can be:
134
+ * - Awaited directly to get the first page with [index, item] tuples (backward compatible)
135
+ * - Used with `for await...of` to iterate through all entries as [index, item] tuples
136
+ */
137
+ export function createPaginatedEntryList(getPage, options = {}) {
138
+ const offset = options.offset ?? 0;
139
+ // Immediately fetch the first page and transform items to entries
140
+ const firstPagePromise = getPage(offset, options.limit ?? Infinity).then((result) => ({
141
+ ...result,
142
+ items: result.items.map((item, i) => [offset + i, item]),
143
+ }));
144
+ async function* asyncGenerator() {
145
+ let currentIndex = offset;
146
+ for await (const item of createPaginatedList(getPage, options)) {
147
+ yield [currentIndex++, item];
148
+ }
149
+ }
150
+ return Object.defineProperty(firstPagePromise, Symbol.asyncIterator, {
151
+ value: asyncGenerator,
152
+ });
153
+ }
154
+ /**
155
+ * Creates an object that acts as both a lazy Promise and an AsyncIterable.
156
+ * - When awaited, it triggers `promiseFactory` (bulk fetch, cached after first call).
157
+ * - When iterated with `for await...of`, it uses `iteratorFactory` (streaming, no bulk fetch).
158
+ */
159
+ export function createLazyIterablePromise(promiseFactory, iteratorFactory) {
160
+ let cached = null;
161
+ function getOrCreate() {
162
+ if (!cached) {
163
+ cached = promiseFactory();
164
+ }
165
+ return cached;
166
+ }
167
+ const result = {
168
+ then(onfulfilled, onrejected) {
169
+ return getOrCreate().then(onfulfilled, onrejected);
170
+ },
171
+ catch(onrejected) {
172
+ return getOrCreate().catch(onrejected);
173
+ },
174
+ finally(onfinally) {
175
+ return getOrCreate().finally(onfinally);
176
+ },
177
+ [Symbol.asyncIterator]: iteratorFactory,
178
+ [Symbol.toStringTag]: 'Promise',
179
+ };
180
+ return result;
181
+ }
43
182
  //# sourceMappingURL=utils.js.map
package/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAEzC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAI,MAAS;IAC7C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,CAAC,cAAc,CAAC,MAAiC,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC3B,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,QAAQ,CAAC;SAChB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAE/B,OAAO,GAAG,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACnC,IAAI,CAAC;QACD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEpF,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAU;IAC/B,OAAO,CACH,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK;QACL,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,CAClF,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type * as storage from '@crawlee/types';
2
- import type { MemoryStorage } from '../index.js';
3
- export interface DatasetCollectionClientOptions {
4
- baseStorageDirectory: string;
5
- client: MemoryStorage;
6
- }
7
- export declare class DatasetCollectionClient implements storage.DatasetCollectionClient {
8
- private readonly datasetsDirectory;
9
- private readonly client;
10
- constructor({ baseStorageDirectory, client }: DatasetCollectionClientOptions);
11
- list(): ReturnType<storage.DatasetCollectionClient['list']>;
12
- getOrCreate(name?: string): Promise<storage.DatasetInfo>;
13
- }
14
- //# sourceMappingURL=dataset-collection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataset-collection.d.ts","sourceRoot":"","sources":["../../src/resource-clients/dataset-collection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAK/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,8BAA8B;IAC3C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,uBAAwB,YAAW,OAAO,CAAC,uBAAuB;IAC3E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,8BAA8B;IAKtE,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAa3D,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;CA6BjE"}
@@ -1,49 +0,0 @@
1
- import { resolve } from 'node:path';
2
- import { s } from '@sapphire/shapeshift';
3
- import { scheduleBackgroundTask } from '../background-handler/index.js';
4
- import { findOrCacheDatasetByPossibleId } from '../cache-helpers.js';
5
- import { DatasetClient } from './dataset.js';
6
- export class DatasetCollectionClient {
7
- datasetsDirectory;
8
- client;
9
- constructor({ baseStorageDirectory, client }) {
10
- this.datasetsDirectory = resolve(baseStorageDirectory);
11
- this.client = client;
12
- }
13
- async list() {
14
- return {
15
- total: this.client.datasetClientsHandled.length,
16
- count: this.client.datasetClientsHandled.length,
17
- offset: 0,
18
- limit: this.client.datasetClientsHandled.length,
19
- desc: false,
20
- items: this.client.datasetClientsHandled
21
- .map((store) => store.toDatasetInfo())
22
- .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()),
23
- };
24
- }
25
- async getOrCreate(name) {
26
- s.string().optional().parse(name);
27
- if (name) {
28
- const found = await findOrCacheDatasetByPossibleId(this.client, name);
29
- if (found) {
30
- return found.toDatasetInfo();
31
- }
32
- }
33
- const newStore = new DatasetClient({ name, baseStorageDirectory: this.datasetsDirectory, client: this.client });
34
- this.client.datasetClientsHandled.push(newStore);
35
- // Schedule the worker to write to the disk
36
- const datasetInfo = newStore.toDatasetInfo();
37
- scheduleBackgroundTask({
38
- action: 'update-metadata',
39
- entityType: 'datasets',
40
- entityDirectory: newStore.datasetDirectory,
41
- id: datasetInfo.name ?? datasetInfo.id,
42
- data: datasetInfo,
43
- writeMetadata: this.client.writeMetadata,
44
- persistStorage: this.client.persistStorage,
45
- });
46
- return datasetInfo;
47
- }
48
- }
49
- //# sourceMappingURL=dataset-collection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataset-collection.js","sourceRoot":"","sources":["../../src/resource-clients/dataset-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO7C,MAAM,OAAO,uBAAuB;IACf,iBAAiB,CAAS;IAC1B,MAAM,CAAgB;IAEvC,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAkC;QACxE,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;YAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;YAC/C,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;YAC/C,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;iBACnC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;iBACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SACrE,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAa;QAC3B,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAEtE,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC;YACjC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChH,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,2CAA2C;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAE7C,sBAAsB,CAAC;YACnB,MAAM,EAAE,iBAAiB;YACzB,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,QAAQ,CAAC,gBAAgB;YAC1C,EAAE,EAAE,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE;YACtC,IAAI,EAAE,WAAW;YACjB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YACxC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;SAC7C,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -1,14 +0,0 @@
1
- import type * as storage from '@crawlee/types';
2
- import type { MemoryStorage } from '../index.js';
3
- export interface KeyValueStoreCollectionClientOptions {
4
- baseStorageDirectory: string;
5
- client: MemoryStorage;
6
- }
7
- export declare class KeyValueStoreCollectionClient implements storage.KeyValueStoreCollectionClient {
8
- private readonly keyValueStoresDirectory;
9
- private readonly client;
10
- constructor({ baseStorageDirectory, client }: KeyValueStoreCollectionClientOptions);
11
- list(): ReturnType<storage.KeyValueStoreCollectionClient['list']>;
12
- getOrCreate(name?: string): Promise<storage.KeyValueStoreInfo>;
13
- }
14
- //# sourceMappingURL=key-value-store-collection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-value-store-collection.d.ts","sourceRoot":"","sources":["../../src/resource-clients/key-value-store-collection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAK/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,oCAAoC;IACjD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,6BAA8B,YAAW,OAAO,CAAC,6BAA6B;IACvF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,oCAAoC;IAK5E,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IAajE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;CAiCvE"}
@@ -1,53 +0,0 @@
1
- import { resolve } from 'node:path';
2
- import { s } from '@sapphire/shapeshift';
3
- import { scheduleBackgroundTask } from '../background-handler/index.js';
4
- import { findOrCacheKeyValueStoreByPossibleId } from '../cache-helpers.js';
5
- import { KeyValueStoreClient } from './key-value-store.js';
6
- export class KeyValueStoreCollectionClient {
7
- keyValueStoresDirectory;
8
- client;
9
- constructor({ baseStorageDirectory, client }) {
10
- this.keyValueStoresDirectory = resolve(baseStorageDirectory);
11
- this.client = client;
12
- }
13
- async list() {
14
- return {
15
- total: this.client.keyValueStoresHandled.length,
16
- count: this.client.keyValueStoresHandled.length,
17
- offset: 0,
18
- limit: this.client.keyValueStoresHandled.length,
19
- desc: false,
20
- items: this.client.keyValueStoresHandled
21
- .map((store) => store.toKeyValueStoreInfo())
22
- .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()),
23
- };
24
- }
25
- async getOrCreate(name) {
26
- s.string().optional().parse(name);
27
- if (name) {
28
- const found = await findOrCacheKeyValueStoreByPossibleId(this.client, name);
29
- if (found) {
30
- return found.toKeyValueStoreInfo();
31
- }
32
- }
33
- const newStore = new KeyValueStoreClient({
34
- name,
35
- baseStorageDirectory: this.keyValueStoresDirectory,
36
- client: this.client,
37
- });
38
- this.client.keyValueStoresHandled.push(newStore);
39
- // Schedule the worker to write to the disk
40
- const kvStoreInfo = newStore.toKeyValueStoreInfo();
41
- scheduleBackgroundTask({
42
- action: 'update-metadata',
43
- entityType: 'keyValueStores',
44
- entityDirectory: newStore.keyValueStoreDirectory,
45
- id: kvStoreInfo.name ?? kvStoreInfo.id,
46
- data: kvStoreInfo,
47
- writeMetadata: this.client.writeMetadata,
48
- persistStorage: this.client.persistStorage,
49
- });
50
- return kvStoreInfo;
51
- }
52
- }
53
- //# sourceMappingURL=key-value-store-collection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-value-store-collection.js","sourceRoot":"","sources":["../../src/resource-clients/key-value-store-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAO3D,MAAM,OAAO,6BAA6B;IACrB,uBAAuB,CAAS;IAChC,MAAM,CAAgB;IAEvC,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAwC;QAC9E,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;YAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;YAC/C,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;YAC/C,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB;iBACnC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;iBAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SACrE,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAa;QAC3B,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,oCAAoC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE5E,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACvC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC;YACrC,IAAI;YACJ,oBAAoB,EAAE,IAAI,CAAC,uBAAuB;YAClD,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,2CAA2C;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAEnD,sBAAsB,CAAC;YACnB,MAAM,EAAE,iBAAiB;YACzB,UAAU,EAAE,gBAAgB;YAC5B,eAAe,EAAE,QAAQ,CAAC,sBAAsB;YAChD,EAAE,EAAE,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE;YACtC,IAAI,EAAE,WAAW;YACjB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YACxC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;SAC7C,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -1,14 +0,0 @@
1
- import type * as storage from '@crawlee/types';
2
- import type { MemoryStorage } from '../index.js';
3
- export interface RequestQueueCollectionClientOptions {
4
- baseStorageDirectory: string;
5
- client: MemoryStorage;
6
- }
7
- export declare class RequestQueueCollectionClient implements storage.RequestQueueCollectionClient {
8
- private readonly requestQueuesDirectory;
9
- private readonly client;
10
- constructor({ baseStorageDirectory, client }: RequestQueueCollectionClientOptions);
11
- list(): ReturnType<storage.RequestQueueCollectionClient['list']>;
12
- getOrCreate(name?: string): Promise<storage.RequestQueueInfo>;
13
- }
14
- //# sourceMappingURL=request-queue-collection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-queue-collection.d.ts","sourceRoot":"","sources":["../../src/resource-clients/request-queue-collection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAK/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,mCAAmC;IAChD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,4BAA6B,YAAW,OAAO,CAAC,4BAA4B;IACrF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,mCAAmC;IAK3E,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAahE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;CAiCtE"}
@@ -1,53 +0,0 @@
1
- import { resolve } from 'node:path';
2
- import { s } from '@sapphire/shapeshift';
3
- import { scheduleBackgroundTask } from '../background-handler/index.js';
4
- import { findRequestQueueByPossibleId } from '../cache-helpers.js';
5
- import { RequestQueueClient } from './request-queue.js';
6
- export class RequestQueueCollectionClient {
7
- requestQueuesDirectory;
8
- client;
9
- constructor({ baseStorageDirectory, client }) {
10
- this.requestQueuesDirectory = resolve(baseStorageDirectory);
11
- this.client = client;
12
- }
13
- async list() {
14
- return {
15
- total: this.client.requestQueuesHandled.length,
16
- count: this.client.requestQueuesHandled.length,
17
- offset: 0,
18
- limit: this.client.requestQueuesHandled.length,
19
- desc: false,
20
- items: this.client.requestQueuesHandled
21
- .map((store) => store.toRequestQueueInfo())
22
- .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()),
23
- };
24
- }
25
- async getOrCreate(name) {
26
- s.string().optional().parse(name);
27
- if (name) {
28
- const found = await findRequestQueueByPossibleId(this.client, name);
29
- if (found) {
30
- return found.toRequestQueueInfo();
31
- }
32
- }
33
- const newStore = new RequestQueueClient({
34
- name,
35
- baseStorageDirectory: this.requestQueuesDirectory,
36
- client: this.client,
37
- });
38
- this.client.requestQueuesHandled.push(newStore);
39
- // Schedule the worker to write to the disk
40
- const queueInfo = newStore.toRequestQueueInfo();
41
- scheduleBackgroundTask({
42
- action: 'update-metadata',
43
- entityType: 'requestQueues',
44
- entityDirectory: newStore.requestQueueDirectory,
45
- id: queueInfo.name ?? queueInfo.id,
46
- data: queueInfo,
47
- writeMetadata: this.client.writeMetadata,
48
- persistStorage: this.client.persistStorage,
49
- });
50
- return queueInfo;
51
- }
52
- }
53
- //# sourceMappingURL=request-queue-collection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-queue-collection.js","sourceRoot":"","sources":["../../src/resource-clients/request-queue-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAOxD,MAAM,OAAO,4BAA4B;IACpB,sBAAsB,CAAS;IAC/B,MAAM,CAAgB;IAEvC,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAuC;QAC7E,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM;YAC9C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM;YAC9C,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM;YAC9C,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB;iBAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;iBAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SACrE,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAa;QAC3B,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAEpE,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,KAAK,CAAC,kBAAkB,EAAE,CAAC;YACtC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC;YACpC,IAAI;YACJ,oBAAoB,EAAE,IAAI,CAAC,sBAAsB;YACjD,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhD,2CAA2C;QAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAEhD,sBAAsB,CAAC;YACnB,MAAM,EAAE,iBAAiB;YACzB,UAAU,EAAE,eAAe;YAC3B,eAAe,EAAE,QAAQ,CAAC,qBAAqB;YAC/C,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE;YAClC,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YACxC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;SAC7C,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}