@crawlee/memory-storage 4.0.0-beta.65 → 4.0.0-beta.67
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.
- package/consts.d.ts +0 -12
- package/consts.d.ts.map +1 -1
- package/consts.js +0 -13
- package/consts.js.map +1 -1
- package/memory-storage.d.ts +16 -36
- package/memory-storage.d.ts.map +1 -1
- package/memory-storage.js +59 -239
- package/memory-storage.js.map +1 -1
- package/package.json +3 -6
- package/resource-clients/common/base-client.d.ts +0 -3
- package/resource-clients/common/base-client.d.ts.map +1 -1
- package/resource-clients/common/base-client.js +0 -6
- package/resource-clients/common/base-client.js.map +1 -1
- package/resource-clients/dataset.d.ts +9 -11
- package/resource-clients/dataset.d.ts.map +1 -1
- package/resource-clients/dataset.js +8 -42
- package/resource-clients/dataset.js.map +1 -1
- package/resource-clients/key-value-store.d.ts +18 -15
- package/resource-clients/key-value-store.d.ts.map +1 -1
- package/resource-clients/key-value-store.js +31 -47
- package/resource-clients/key-value-store.js.map +1 -1
- package/resource-clients/request-queue.d.ts +50 -20
- package/resource-clients/request-queue.d.ts.map +1 -1
- package/resource-clients/request-queue.js +251 -281
- package/resource-clients/request-queue.js.map +1 -1
- package/utils.d.ts +0 -14
- package/utils.d.ts.map +1 -1
- package/utils.js.map +1 -1
- package/background-handler/fs-utils.d.ts +0 -6
- package/background-handler/fs-utils.d.ts.map +0 -1
- package/background-handler/fs-utils.js +0 -63
- package/background-handler/fs-utils.js.map +0 -1
- package/background-handler/index.d.ts +0 -13
- package/background-handler/index.d.ts.map +0 -1
- package/background-handler/index.js +0 -29
- package/background-handler/index.js.map +0 -1
- package/cache-helpers.d.ts +0 -9
- package/cache-helpers.d.ts.map +0 -1
- package/cache-helpers.js +0 -319
- package/cache-helpers.js.map +0 -1
- package/fs/common.d.ts +0 -6
- package/fs/common.d.ts.map +0 -1
- package/fs/common.js +0 -2
- package/fs/common.js.map +0 -1
- package/fs/dataset/fs.d.ts +0 -11
- package/fs/dataset/fs.d.ts.map +0 -1
- package/fs/dataset/fs.js +0 -37
- package/fs/dataset/fs.js.map +0 -1
- package/fs/dataset/index.d.ts +0 -10
- package/fs/dataset/index.d.ts.map +0 -1
- package/fs/dataset/index.js +0 -9
- package/fs/dataset/index.js.map +0 -1
- package/fs/dataset/memory.d.ts +0 -8
- package/fs/dataset/memory.d.ts.map +0 -1
- package/fs/dataset/memory.js +0 -13
- package/fs/dataset/memory.js.map +0 -1
- package/fs/key-value-store/fs.d.ts +0 -17
- package/fs/key-value-store/fs.d.ts.map +0 -1
- package/fs/key-value-store/fs.js +0 -83
- package/fs/key-value-store/fs.js.map +0 -1
- package/fs/key-value-store/index.d.ts +0 -11
- package/fs/key-value-store/index.d.ts.map +0 -1
- package/fs/key-value-store/index.js +0 -9
- package/fs/key-value-store/index.js.map +0 -1
- package/fs/key-value-store/memory.d.ts +0 -9
- package/fs/key-value-store/memory.d.ts.map +0 -1
- package/fs/key-value-store/memory.js +0 -13
- package/fs/key-value-store/memory.js.map +0 -1
- package/fs/request-queue/fs.d.ts +0 -21
- package/fs/request-queue/fs.d.ts.map +0 -1
- package/fs/request-queue/fs.js +0 -72
- package/fs/request-queue/fs.js.map +0 -1
- package/fs/request-queue/index.d.ts +0 -9
- package/fs/request-queue/index.d.ts.map +0 -1
- package/fs/request-queue/index.js +0 -9
- package/fs/request-queue/index.js.map +0 -1
- package/fs/request-queue/memory.d.ts +0 -10
- package/fs/request-queue/memory.d.ts.map +0 -1
- package/fs/request-queue/memory.js +0 -15
- package/fs/request-queue/memory.js.map +0 -1
|
@@ -1,31 +1,29 @@
|
|
|
1
1
|
import type * as storage from '@crawlee/types';
|
|
2
2
|
import type { Dictionary } from '@crawlee/types';
|
|
3
|
-
import type {
|
|
3
|
+
import type { MemoryStorageClient } from '../index.js';
|
|
4
4
|
import { BaseClient } from './common/base-client.js';
|
|
5
5
|
export interface DatasetClientOptions {
|
|
6
6
|
id?: string;
|
|
7
7
|
name?: string;
|
|
8
8
|
/**
|
|
9
|
-
* The
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* The key used for cache lookup. When provided, takes precedence over `name` and `id`.
|
|
10
|
+
* This allows alias-opened storages to have a cache key that differs from their
|
|
11
|
+
* metadata `name` (which is `undefined` for unnamed storages).
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
client: MemoryStorage;
|
|
13
|
+
cacheKey?: string;
|
|
14
|
+
client: MemoryStorageClient;
|
|
16
15
|
}
|
|
17
16
|
export declare class DatasetClient<Data extends Dictionary = Dictionary> extends BaseClient implements storage.DatasetClient<Data> {
|
|
18
17
|
name?: string;
|
|
19
18
|
/**
|
|
20
|
-
* The key used for
|
|
21
|
-
*
|
|
19
|
+
* The key used for cache lookup. For named storages, this equals the name. For alias (unnamed)
|
|
20
|
+
* storages, this is the alias string. Falls back to id.
|
|
22
21
|
*/
|
|
23
|
-
|
|
22
|
+
cacheKey: string;
|
|
24
23
|
createdAt: Date;
|
|
25
24
|
accessedAt: Date;
|
|
26
25
|
modifiedAt: Date;
|
|
27
26
|
itemCount: number;
|
|
28
|
-
datasetDirectory: string;
|
|
29
27
|
private readonly datasetEntries;
|
|
30
28
|
private readonly client;
|
|
31
29
|
constructor(options: DatasetClientOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/resource-clients/dataset.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/resource-clients/dataset.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAcrD,MAAM,WAAW,oBAAoB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;CAC/B;AAED,qBAAa,aAAa,CAAC,IAAI,SAAS,UAAU,GAAG,UAAU,CAC3D,SAAQ,UACR,YAAW,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC;IAEtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,OAAc;IACvB,UAAU,OAAc;IACxB,UAAU,OAAc;IACxB,SAAS,SAAK;IAEd,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,OAAO,EAAE,oBAAoB;IAOnC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;IAK3C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,OAAO,CAAC,OAAO,GAAE,OAAO,CAAC,wBAA6B,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAgB/E,WAAW;IA2BnB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C,aAAa,IAAI,OAAO,CAAC,WAAW;IAWpC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,gBAAgB;CAO3B"}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
/* eslint-disable import/no-duplicates */
|
|
2
1
|
import { randomUUID } from 'node:crypto';
|
|
3
|
-
import { rm } from 'node:fs/promises';
|
|
4
|
-
import { resolve } from 'node:path';
|
|
5
2
|
import { s } from '@sapphire/shapeshift';
|
|
6
|
-
import { scheduleBackgroundTask } from '../background-handler/index.js';
|
|
7
|
-
import { createDatasetStorageImplementation } from '../fs/dataset/index.js';
|
|
8
3
|
import { BaseClient } from './common/base-client.js';
|
|
9
4
|
/**
|
|
10
5
|
* This is what API returns in the x-apify-pagination-limit
|
|
@@ -12,29 +7,27 @@ import { BaseClient } from './common/base-client.js';
|
|
|
12
7
|
*/
|
|
13
8
|
const LIST_ITEMS_LIMIT = 999_999_999_999;
|
|
14
9
|
/**
|
|
15
|
-
* Number of characters of the dataset item
|
|
16
|
-
* E.g.: 000000019
|
|
10
|
+
* Number of characters of the dataset item entry names.
|
|
11
|
+
* E.g.: 000000019 - 9 digits
|
|
17
12
|
*/
|
|
18
13
|
const LOCAL_ENTRY_NAME_DIGITS = 9;
|
|
19
14
|
export class DatasetClient extends BaseClient {
|
|
20
15
|
name;
|
|
21
16
|
/**
|
|
22
|
-
* The key used for
|
|
23
|
-
*
|
|
17
|
+
* The key used for cache lookup. For named storages, this equals the name. For alias (unnamed)
|
|
18
|
+
* storages, this is the alias string. Falls back to id.
|
|
24
19
|
*/
|
|
25
|
-
|
|
20
|
+
cacheKey;
|
|
26
21
|
createdAt = new Date();
|
|
27
22
|
accessedAt = new Date();
|
|
28
23
|
modifiedAt = new Date();
|
|
29
24
|
itemCount = 0;
|
|
30
|
-
datasetDirectory;
|
|
31
25
|
datasetEntries = new Map();
|
|
32
26
|
client;
|
|
33
27
|
constructor(options) {
|
|
34
28
|
super(options.id ?? randomUUID());
|
|
35
29
|
this.name = options.name;
|
|
36
|
-
this.
|
|
37
|
-
this.datasetDirectory = resolve(options.baseStorageDirectory, this.directoryName);
|
|
30
|
+
this.cacheKey = options.cacheKey ?? this.name ?? this.id;
|
|
38
31
|
this.client = options.client;
|
|
39
32
|
}
|
|
40
33
|
async getMetadata() {
|
|
@@ -47,22 +40,11 @@ export class DatasetClient extends BaseClient {
|
|
|
47
40
|
const [oldClient] = this.client.datasetClientCache.splice(storeIndex, 1);
|
|
48
41
|
oldClient.itemCount = 0;
|
|
49
42
|
oldClient.datasetEntries.clear();
|
|
50
|
-
await rm(oldClient.datasetDirectory, { recursive: true, force: true });
|
|
51
43
|
}
|
|
52
44
|
}
|
|
53
45
|
async purge() {
|
|
54
46
|
this.itemCount = 0;
|
|
55
47
|
this.datasetEntries.clear();
|
|
56
|
-
// Remove item files from disk but keep the directory
|
|
57
|
-
if (this.client.persistStorage) {
|
|
58
|
-
const { readdir } = await import('node:fs/promises');
|
|
59
|
-
const entries = await readdir(this.datasetDirectory).catch(() => []);
|
|
60
|
-
for (const entry of entries) {
|
|
61
|
-
if (entry !== '__metadata__.json') {
|
|
62
|
-
await rm(resolve(this.datasetDirectory, entry), { force: true });
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
48
|
this.updateTimestamps(true);
|
|
67
49
|
}
|
|
68
50
|
getData(options = {}) {
|
|
@@ -85,7 +67,7 @@ export class DatasetClient extends BaseClient {
|
|
|
85
67
|
const items = [];
|
|
86
68
|
for (let idx = start; idx < end; idx++) {
|
|
87
69
|
const entryNumber = this.generateLocalEntryName(idx);
|
|
88
|
-
items.push(
|
|
70
|
+
items.push(this.datasetEntries.get(entryNumber));
|
|
89
71
|
}
|
|
90
72
|
this.updateTimestamps(false);
|
|
91
73
|
return {
|
|
@@ -100,13 +82,7 @@ export class DatasetClient extends BaseClient {
|
|
|
100
82
|
async pushData(items) {
|
|
101
83
|
for (const entry of items) {
|
|
102
84
|
const idx = this.generateLocalEntryName(++this.itemCount);
|
|
103
|
-
|
|
104
|
-
entityId: idx,
|
|
105
|
-
persistStorage: this.client.persistStorage,
|
|
106
|
-
storeDirectory: this.datasetDirectory,
|
|
107
|
-
});
|
|
108
|
-
await storageEntry.update(entry);
|
|
109
|
-
this.datasetEntries.set(idx, storageEntry);
|
|
85
|
+
this.datasetEntries.set(idx, entry);
|
|
110
86
|
}
|
|
111
87
|
this.updateTimestamps(true);
|
|
112
88
|
}
|
|
@@ -133,16 +109,6 @@ export class DatasetClient extends BaseClient {
|
|
|
133
109
|
if (hasBeenModified) {
|
|
134
110
|
this.modifiedAt = new Date();
|
|
135
111
|
}
|
|
136
|
-
const data = this.toDatasetInfo();
|
|
137
|
-
scheduleBackgroundTask({
|
|
138
|
-
action: 'update-metadata',
|
|
139
|
-
data,
|
|
140
|
-
entityType: 'datasets',
|
|
141
|
-
entityDirectory: this.datasetDirectory,
|
|
142
|
-
id: this.name ?? this.id,
|
|
143
|
-
writeMetadata: this.client.writeMetadata,
|
|
144
|
-
persistStorage: this.client.persistStorage,
|
|
145
|
-
}, this.client.logger);
|
|
146
112
|
}
|
|
147
113
|
}
|
|
148
114
|
//# sourceMappingURL=dataset.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/resource-clients/dataset.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/resource-clients/dataset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +1,50 @@
|
|
|
1
1
|
import type * as storage from '@crawlee/types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MemoryStorageClient } from '../index.js';
|
|
3
3
|
import { BaseClient } from './common/base-client.js';
|
|
4
4
|
export interface KeyValueStoreClientOptions {
|
|
5
5
|
name?: string;
|
|
6
6
|
id?: string;
|
|
7
7
|
/**
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* The key used for cache lookup. When provided, takes precedence over `name` and `id`.
|
|
9
|
+
* This allows alias-opened storages to have a cache key that differs from their
|
|
10
|
+
* metadata `name` (which is `undefined` for unnamed storages).
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
client: MemoryStorage;
|
|
12
|
+
cacheKey?: string;
|
|
13
|
+
client: MemoryStorageClient;
|
|
15
14
|
}
|
|
16
15
|
export interface InternalKeyRecord {
|
|
17
16
|
key: string;
|
|
18
17
|
value: Buffer | string;
|
|
19
18
|
contentType?: string;
|
|
20
19
|
extension: string;
|
|
21
|
-
filePath?: string;
|
|
22
20
|
}
|
|
23
21
|
export declare class KeyValueStoreClient extends BaseClient implements storage.KeyValueStoreClient {
|
|
24
22
|
name?: string;
|
|
25
23
|
/**
|
|
26
|
-
* The key used for
|
|
27
|
-
*
|
|
24
|
+
* The key used for cache lookup. For named storages, this equals the name. For alias (unnamed)
|
|
25
|
+
* storages, this is the alias string. Falls back to id.
|
|
28
26
|
*/
|
|
29
|
-
|
|
27
|
+
cacheKey: string;
|
|
30
28
|
createdAt: Date;
|
|
31
29
|
accessedAt: Date;
|
|
32
30
|
modifiedAt: Date;
|
|
33
|
-
keyValueStoreDirectory: string;
|
|
34
31
|
private readonly keyValueEntries;
|
|
35
32
|
private readonly client;
|
|
36
33
|
constructor(options: KeyValueStoreClientOptions);
|
|
37
34
|
getMetadata(): Promise<storage.KeyValueStoreInfo>;
|
|
38
35
|
drop(): Promise<void>;
|
|
39
36
|
purge(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Purges every record except the run's input. Used by {@link MemoryStorageClient.purge} for the
|
|
39
|
+
* default key-value store, mirroring `FileSystemStorageClient`, which preserves `INPUT` (and its
|
|
40
|
+
* extension variants) when purging the default store. The in-memory key has no extension, so we
|
|
41
|
+
* preserve the bare `INPUT` key only.
|
|
42
|
+
*/
|
|
43
|
+
purgeExceptInput(): Promise<void>;
|
|
40
44
|
listKeys(options?: storage.KeyValueStoreListKeysOptions): Promise<storage.KeyValueStoreItemData[]>;
|
|
41
45
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* Returns `undefined` if the record does not exist or has no associated file path (i.e., it is not stored as a file).
|
|
46
|
+
* In-memory records are not file-backed, so there is no public file URL to return.
|
|
47
|
+
* Always resolves to `undefined`.
|
|
45
48
|
* @param key The key of the record to generate the public URL for.
|
|
46
49
|
*/
|
|
47
50
|
getPublicUrl(key: string): Promise<string | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-value-store.d.ts","sourceRoot":"","sources":["../../src/resource-clients/key-value-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"key-value-store.d.ts","sourceRoot":"","sources":["../../src/resource-clients/key-value-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAI/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAWrD,MAAM,WAAW,0BAA0B;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,mBAAoB,SAAQ,UAAW,YAAW,OAAO,CAAC,mBAAmB;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,OAAc;IACvB,UAAU,OAAc;IACxB,UAAU,OAAc;IAExB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,OAAO,EAAE,0BAA0B;IAOzC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAKjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;;OAKG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,QAAQ,CAAC,OAAO,GAAE,OAAO,CAAC,4BAAiC,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA4C5G;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAM5D;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM3C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAuBvE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8D5D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,mBAAmB,IAAI,OAAO,CAAC,iBAAiB;IAWhD,OAAO,CAAC,gBAAgB;CAO3B"}
|
|
@@ -1,32 +1,31 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { rm } from 'node:fs/promises';
|
|
3
|
-
import { resolve } from 'node:path';
|
|
4
2
|
import { s } from '@sapphire/shapeshift';
|
|
5
|
-
import { scheduleBackgroundTask } from '../background-handler/index.js';
|
|
6
3
|
import { maybeParseBody } from '../body-parser.js';
|
|
7
|
-
import { createKeyValueStorageImplementation } from '../fs/key-value-store/index.js';
|
|
8
4
|
import { isBuffer, isStream } from '../utils.js';
|
|
9
5
|
import { BaseClient } from './common/base-client.js';
|
|
10
6
|
import mime from 'mime-types';
|
|
11
7
|
const DEFAULT_LOCAL_FILE_EXTENSION = 'bin';
|
|
8
|
+
/**
|
|
9
|
+
* Key under which a run's input is stored in the default key-value store. Matches Crawlee's default
|
|
10
|
+
* `inputKey` (`CRAWLEE_INPUT_KEY`) and the `INPUT` files `FileSystemStorageClient` preserves on purge.
|
|
11
|
+
*/
|
|
12
|
+
const KEY_VALUE_STORE_INPUT_KEY = 'INPUT';
|
|
12
13
|
export class KeyValueStoreClient extends BaseClient {
|
|
13
14
|
name;
|
|
14
15
|
/**
|
|
15
|
-
* The key used for
|
|
16
|
-
*
|
|
16
|
+
* The key used for cache lookup. For named storages, this equals the name. For alias (unnamed)
|
|
17
|
+
* storages, this is the alias string. Falls back to id.
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
+
cacheKey;
|
|
19
20
|
createdAt = new Date();
|
|
20
21
|
accessedAt = new Date();
|
|
21
22
|
modifiedAt = new Date();
|
|
22
|
-
keyValueStoreDirectory;
|
|
23
23
|
keyValueEntries = new Map();
|
|
24
24
|
client;
|
|
25
25
|
constructor(options) {
|
|
26
26
|
super(options.id ?? randomUUID());
|
|
27
27
|
this.name = options.name;
|
|
28
|
-
this.
|
|
29
|
-
this.keyValueStoreDirectory = resolve(options.baseStorageDirectory, this.directoryName);
|
|
28
|
+
this.cacheKey = options.cacheKey ?? this.name ?? this.id;
|
|
30
29
|
this.client = options.client;
|
|
31
30
|
}
|
|
32
31
|
async getMetadata() {
|
|
@@ -38,15 +37,23 @@ export class KeyValueStoreClient extends BaseClient {
|
|
|
38
37
|
if (storeIndex !== -1) {
|
|
39
38
|
const [oldClient] = this.client.keyValueStoreCache.splice(storeIndex, 1);
|
|
40
39
|
oldClient.keyValueEntries.clear();
|
|
41
|
-
await rm(oldClient.keyValueStoreDirectory, { recursive: true, force: true });
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
async purge() {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
this.keyValueEntries.clear();
|
|
44
|
+
this.updateTimestamps(true);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Purges every record except the run's input. Used by {@link MemoryStorageClient.purge} for the
|
|
48
|
+
* default key-value store, mirroring `FileSystemStorageClient`, which preserves `INPUT` (and its
|
|
49
|
+
* extension variants) when purging the default store. The in-memory key has no extension, so we
|
|
50
|
+
* preserve the bare `INPUT` key only.
|
|
51
|
+
*/
|
|
52
|
+
async purgeExceptInput() {
|
|
53
|
+
for (const key of this.keyValueEntries.keys()) {
|
|
54
|
+
if (key !== KEY_VALUE_STORE_INPUT_KEY) {
|
|
55
|
+
this.keyValueEntries.delete(key);
|
|
56
|
+
}
|
|
50
57
|
}
|
|
51
58
|
this.updateTimestamps(true);
|
|
52
59
|
}
|
|
@@ -59,8 +66,7 @@ export class KeyValueStoreClient extends BaseClient {
|
|
|
59
66
|
})
|
|
60
67
|
.parse(options);
|
|
61
68
|
const items = [];
|
|
62
|
-
for (const
|
|
63
|
-
const record = await storageEntry.get();
|
|
69
|
+
for (const record of this.keyValueEntries.values()) {
|
|
64
70
|
const size = Buffer.byteLength(record.value);
|
|
65
71
|
items.push({
|
|
66
72
|
key: record.key,
|
|
@@ -85,15 +91,13 @@ export class KeyValueStoreClient extends BaseClient {
|
|
|
85
91
|
return filteredItems;
|
|
86
92
|
}
|
|
87
93
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* Returns `undefined` if the record does not exist or has no associated file path (i.e., it is not stored as a file).
|
|
94
|
+
* In-memory records are not file-backed, so there is no public file URL to return.
|
|
95
|
+
* Always resolves to `undefined`.
|
|
91
96
|
* @param key The key of the record to generate the public URL for.
|
|
92
97
|
*/
|
|
93
98
|
async getPublicUrl(key) {
|
|
94
99
|
s.string().parse(key);
|
|
95
|
-
|
|
96
|
-
return storageEntry?.filePath;
|
|
100
|
+
return undefined;
|
|
97
101
|
}
|
|
98
102
|
/**
|
|
99
103
|
* Tests whether a record with the given key exists in the key-value store without retrieving its value.
|
|
@@ -107,11 +111,10 @@ export class KeyValueStoreClient extends BaseClient {
|
|
|
107
111
|
}
|
|
108
112
|
async getValue(key) {
|
|
109
113
|
s.string().parse(key);
|
|
110
|
-
const
|
|
111
|
-
if (!
|
|
114
|
+
const entry = this.keyValueEntries.get(key);
|
|
115
|
+
if (!entry) {
|
|
112
116
|
return undefined;
|
|
113
117
|
}
|
|
114
|
-
const entry = await storageEntry.get();
|
|
115
118
|
const record = {
|
|
116
119
|
key: entry.key,
|
|
117
120
|
value: entry.value,
|
|
@@ -174,23 +177,14 @@ export class KeyValueStoreClient extends BaseClient {
|
|
|
174
177
|
value,
|
|
175
178
|
contentType,
|
|
176
179
|
};
|
|
177
|
-
|
|
178
|
-
persistStorage: this.client.persistStorage,
|
|
179
|
-
storeDirectory: this.keyValueStoreDirectory,
|
|
180
|
-
writeMetadata: this.client.writeMetadata,
|
|
181
|
-
logger: this.client.logger,
|
|
182
|
-
});
|
|
183
|
-
await entry.update(_record);
|
|
184
|
-
this.keyValueEntries.set(key, entry);
|
|
180
|
+
this.keyValueEntries.set(key, _record);
|
|
185
181
|
this.updateTimestamps(true);
|
|
186
182
|
}
|
|
187
183
|
async deleteValue(key) {
|
|
188
184
|
s.string().parse(key);
|
|
189
|
-
|
|
190
|
-
if (entry) {
|
|
185
|
+
if (this.keyValueEntries.has(key)) {
|
|
191
186
|
this.keyValueEntries.delete(key);
|
|
192
187
|
this.updateTimestamps(true);
|
|
193
|
-
await entry.delete();
|
|
194
188
|
}
|
|
195
189
|
}
|
|
196
190
|
toKeyValueStoreInfo() {
|
|
@@ -208,16 +202,6 @@ export class KeyValueStoreClient extends BaseClient {
|
|
|
208
202
|
if (hasBeenModified) {
|
|
209
203
|
this.modifiedAt = new Date();
|
|
210
204
|
}
|
|
211
|
-
const data = this.toKeyValueStoreInfo();
|
|
212
|
-
scheduleBackgroundTask({
|
|
213
|
-
action: 'update-metadata',
|
|
214
|
-
data,
|
|
215
|
-
entityType: 'keyValueStores',
|
|
216
|
-
entityDirectory: this.keyValueStoreDirectory,
|
|
217
|
-
id: this.name ?? this.id,
|
|
218
|
-
writeMetadata: this.client.writeMetadata,
|
|
219
|
-
persistStorage: this.client.persistStorage,
|
|
220
|
-
}, this.client.logger);
|
|
221
205
|
}
|
|
222
206
|
}
|
|
223
207
|
//# sourceMappingURL=key-value-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-value-store.js","sourceRoot":"","sources":["../../src/resource-clients/key-value-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"key-value-store.js","sourceRoot":"","sources":["../../src/resource-clients/key-value-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import type * as storage from '@crawlee/types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MemoryStorageClient } from '../index.js';
|
|
3
3
|
import { BaseClient } from './common/base-client.js';
|
|
4
4
|
export interface RequestQueueClientOptions {
|
|
5
5
|
name?: string;
|
|
6
6
|
id?: string;
|
|
7
7
|
/**
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* The key used for cache lookup. When provided, takes precedence over `name` and `id`.
|
|
9
|
+
* This allows alias-opened storages to have a cache key that differs from their
|
|
10
|
+
* metadata `name` (which is `undefined` for unnamed storages).
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
client: MemoryStorage;
|
|
12
|
+
cacheKey?: string;
|
|
13
|
+
client: MemoryStorageClient;
|
|
15
14
|
}
|
|
16
15
|
export interface InternalRequest {
|
|
17
16
|
id: string;
|
|
@@ -25,18 +24,34 @@ export interface InternalRequest {
|
|
|
25
24
|
export declare class RequestQueueClient extends BaseClient implements storage.RequestQueueClient {
|
|
26
25
|
name?: string;
|
|
27
26
|
/**
|
|
28
|
-
* The key used for
|
|
29
|
-
*
|
|
27
|
+
* The key used for cache lookup. For named storages, this equals the name. For alias (unnamed)
|
|
28
|
+
* storages, this is the alias string. Falls back to id.
|
|
30
29
|
*/
|
|
31
|
-
|
|
30
|
+
cacheKey: string;
|
|
32
31
|
createdAt: Date;
|
|
33
32
|
accessedAt: Date;
|
|
34
33
|
modifiedAt: Date;
|
|
35
34
|
handledRequestCount: number;
|
|
36
35
|
pendingRequestCount: number;
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Serializes every operation that reads-then-writes this client's shared queue state — the
|
|
38
|
+
* `requests` map, the `forefrontRequestIds` array, the `inProgressRequestIds` set and the request
|
|
39
|
+
* counts. Those mutations span `await` points, so without this mutex a concurrent operation could
|
|
40
|
+
* interleave and corrupt them (e.g. a head scan pruning `forefrontRequestIds` while
|
|
41
|
+
* `addBatchOfRequests` pushes to it). Held by every mutating method as well as by `isEmpty`/
|
|
42
|
+
* `isFinished`, whose head scan also prunes `forefrontRequestIds`.
|
|
43
|
+
*/
|
|
44
|
+
private readonly queueStateMutex;
|
|
39
45
|
private forefrontRequestIds;
|
|
46
|
+
/**
|
|
47
|
+
* IDs of requests currently fetched but not yet handled or reclaimed. A request in this set is
|
|
48
|
+
* "in progress" and will not be handed out again by {@link fetchNextRequest}.
|
|
49
|
+
*
|
|
50
|
+
* Unlike the file-system / platform clients, the in-memory queue lives entirely within a single
|
|
51
|
+
* process and is never shared with another consumer, so there is no need for an expiring,
|
|
52
|
+
* cross-process-visible lock — tracking in-progress requests in this set is enough.
|
|
53
|
+
*/
|
|
54
|
+
private readonly inProgressRequestIds;
|
|
40
55
|
private readonly requests;
|
|
41
56
|
private readonly client;
|
|
42
57
|
constructor(options: RequestQueueClientOptions);
|
|
@@ -44,14 +59,29 @@ export declare class RequestQueueClient extends BaseClient implements storage.Re
|
|
|
44
59
|
drop(): Promise<void>;
|
|
45
60
|
purge(): Promise<void>;
|
|
46
61
|
private requestKeyIterator;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Scans the queue and returns the pending head — requests that are neither handled nor currently
|
|
64
|
+
* in progress — ordered by `orderNo`, deduplicated.
|
|
65
|
+
*
|
|
66
|
+
* When `detectInProgressRequests` is set, the result also carries an `hasInProgressRequests` flag
|
|
67
|
+
* telling whether any unhandled-but-in-progress request was skipped along the way. It lets
|
|
68
|
+
* {@link isFinished} distinguish "no work left at all" from "work remains, but it is currently being
|
|
69
|
+
* processed". Without it, a consumer with concurrency could consider the queue finished and shut the
|
|
70
|
+
* crawler down while it is still handling the last requests.
|
|
71
|
+
*
|
|
72
|
+
* Computing the flag is expensive: because an in-progress request may sit anywhere in the queue, it
|
|
73
|
+
* forces a scan of every pending entry even when only `limit` items are wanted. Callers that only
|
|
74
|
+
* need the head (e.g. {@link fetchNextRequest}, {@link isEmpty}) leave it off so the scan can stop as
|
|
75
|
+
* soon as the page is filled, keeping those calls O(head) instead of O(N).
|
|
76
|
+
*/
|
|
77
|
+
private listPendingHead;
|
|
78
|
+
fetchNextRequest(): Promise<storage.RequestOptions | null>;
|
|
79
|
+
addBatchOfRequests(requests: storage.RequestSchema[], options?: storage.RequestOptions): Promise<storage.BatchAddRequestsResult>;
|
|
80
|
+
getRequest(uniqueKey: string): Promise<storage.RequestOptions | undefined>;
|
|
81
|
+
markRequestAsHandled(request: storage.UpdateRequestSchema): Promise<storage.QueueOperationInfo | null>;
|
|
82
|
+
reclaimRequest(request: storage.UpdateRequestSchema, options?: storage.RequestOptions): Promise<storage.QueueOperationInfo | null>;
|
|
83
|
+
isEmpty(): Promise<boolean>;
|
|
84
|
+
isFinished(): Promise<boolean>;
|
|
55
85
|
toRequestQueueInfo(): storage.RequestQueueInfo;
|
|
56
86
|
private updateTimestamps;
|
|
57
87
|
private _jsonToRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-queue.d.ts","sourceRoot":"","sources":["../../src/resource-clients/request-queue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request-queue.d.ts","sourceRoot":"","sources":["../../src/resource-clients/request-queue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAqBrD,MAAM,WAAW,yBAAyB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAmB,SAAQ,UAAW,YAAW,OAAO,CAAC,kBAAkB;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,OAAc;IACvB,UAAU,OAAc;IACxB,UAAU,OAAc;IACxB,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IACpD,OAAO,CAAC,mBAAmB,CAAgB;IAE3C;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAE1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,OAAO,EAAE,yBAAyB;IAOxC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAKhD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B,OAAO,CAAE,kBAAkB;IAU3B;;;;;;;;;;;;;;OAcG;YACW,eAAe;IAuDvB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwB1D,kBAAkB,CACpB,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,EACjC,OAAO,GAAE,OAAO,CAAC,cAAmB,GACrC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC;IA6DpC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAQ1E,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAiDtG,cAAc,CAChB,OAAO,EAAE,OAAO,CAAC,mBAAmB,EACpC,OAAO,GAAE,OAAO,CAAC,cAAmB,GACrC,OAAO,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAgDvC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAqB3B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBpC,kBAAkB,IAAI,OAAO,CAAC,gBAAgB;IAgB9C,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,iBAAiB;CAO5B"}
|