@crawlee/core 4.0.0-beta.6 → 4.0.0-beta.61
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/README.md +9 -5
- package/autoscaling/autoscaled_pool.d.ts +3 -5
- package/autoscaling/autoscaled_pool.d.ts.map +1 -1
- package/autoscaling/autoscaled_pool.js +3 -9
- package/autoscaling/autoscaled_pool.js.map +1 -1
- package/autoscaling/snapshotter.d.ts +3 -13
- package/autoscaling/snapshotter.d.ts.map +1 -1
- package/autoscaling/snapshotter.js +18 -29
- package/autoscaling/snapshotter.js.map +1 -1
- package/autoscaling/system_status.d.ts +0 -3
- package/autoscaling/system_status.d.ts.map +1 -1
- package/autoscaling/system_status.js +2 -3
- package/autoscaling/system_status.js.map +1 -1
- package/configuration.d.ts +85 -227
- package/configuration.d.ts.map +1 -1
- package/configuration.js +159 -223
- package/configuration.js.map +1 -1
- package/cookie_utils.d.ts +4 -2
- package/cookie_utils.d.ts.map +1 -1
- package/cookie_utils.js +18 -12
- package/cookie_utils.js.map +1 -1
- package/crawlers/context_pipeline.d.ts +71 -0
- package/crawlers/context_pipeline.d.ts.map +1 -0
- package/crawlers/context_pipeline.js +123 -0
- package/crawlers/context_pipeline.js.map +1 -0
- package/crawlers/crawler_commons.d.ts +19 -28
- package/crawlers/crawler_commons.d.ts.map +1 -1
- package/crawlers/crawler_commons.js +12 -20
- package/crawlers/crawler_commons.js.map +1 -1
- package/crawlers/crawler_utils.d.ts +2 -2
- package/crawlers/crawler_utils.d.ts.map +1 -1
- package/crawlers/crawler_utils.js +1 -1
- package/crawlers/crawler_utils.js.map +1 -1
- package/crawlers/error_snapshotter.d.ts +3 -2
- package/crawlers/error_snapshotter.d.ts.map +1 -1
- package/crawlers/error_snapshotter.js +2 -2
- package/crawlers/error_snapshotter.js.map +1 -1
- package/crawlers/error_tracker.d.ts +2 -1
- package/crawlers/error_tracker.d.ts.map +1 -1
- package/crawlers/error_tracker.js.map +1 -1
- package/crawlers/index.d.ts +1 -1
- package/crawlers/index.d.ts.map +1 -1
- package/crawlers/index.js +1 -1
- package/crawlers/index.js.map +1 -1
- package/crawlers/internals/types.d.ts +8 -0
- package/crawlers/internals/types.d.ts.map +1 -0
- package/crawlers/internals/types.js +2 -0
- package/crawlers/internals/types.js.map +1 -0
- package/crawlers/statistics.d.ts +15 -15
- package/crawlers/statistics.d.ts.map +1 -1
- package/crawlers/statistics.js +21 -24
- package/crawlers/statistics.js.map +1 -1
- package/enqueue_links/enqueue_links.d.ts +32 -18
- package/enqueue_links/enqueue_links.d.ts.map +1 -1
- package/enqueue_links/enqueue_links.js +45 -24
- package/enqueue_links/enqueue_links.js.map +1 -1
- package/enqueue_links/shared.d.ts +25 -8
- package/enqueue_links/shared.d.ts.map +1 -1
- package/enqueue_links/shared.js +69 -37
- package/enqueue_links/shared.js.map +1 -1
- package/errors.d.ts +33 -3
- package/errors.d.ts.map +1 -1
- package/errors.js +48 -4
- package/errors.js.map +1 -1
- package/events/event_manager.d.ts +8 -5
- package/events/event_manager.d.ts.map +1 -1
- package/events/event_manager.js +7 -9
- package/events/event_manager.js.map +1 -1
- package/events/local_event_manager.d.ts +14 -4
- package/events/local_event_manager.d.ts.map +1 -1
- package/events/local_event_manager.js +33 -39
- package/events/local_event_manager.js.map +1 -1
- package/index.d.ts +3 -2
- package/index.d.ts.map +1 -1
- package/index.js +2 -1
- package/index.js.map +1 -1
- package/log.d.ts +82 -2
- package/log.d.ts.map +1 -1
- package/log.js +102 -0
- package/log.js.map +1 -1
- package/package.json +9 -10
- package/proxy_configuration.d.ts +14 -148
- package/proxy_configuration.d.ts.map +1 -1
- package/proxy_configuration.js +19 -167
- package/proxy_configuration.js.map +1 -1
- package/recoverable_state.d.ts +121 -0
- package/recoverable_state.d.ts.map +1 -0
- package/recoverable_state.js +142 -0
- package/recoverable_state.js.map +1 -0
- package/request.d.ts +74 -10
- package/request.d.ts.map +1 -1
- package/request.js +85 -23
- package/request.js.map +1 -1
- package/router.d.ts.map +1 -1
- package/router.js.map +1 -1
- package/serialization.js +1 -1
- package/serialization.js.map +1 -1
- package/service_locator.d.ts +157 -0
- package/service_locator.d.ts.map +1 -0
- package/service_locator.js +234 -0
- package/service_locator.js.map +1 -0
- package/session_pool/index.d.ts +0 -1
- package/session_pool/index.d.ts.map +1 -1
- package/session_pool/index.js +0 -1
- package/session_pool/index.js.map +1 -1
- package/session_pool/session.d.ts +26 -72
- package/session_pool/session.d.ts.map +1 -1
- package/session_pool/session.js +36 -98
- package/session_pool/session.js.map +1 -1
- package/session_pool/session_pool.d.ts +65 -71
- package/session_pool/session_pool.d.ts.map +1 -1
- package/session_pool/session_pool.js +101 -100
- package/session_pool/session_pool.js.map +1 -1
- package/storages/dataset.d.ts +90 -46
- package/storages/dataset.d.ts.map +1 -1
- package/storages/dataset.js +149 -121
- package/storages/dataset.js.map +1 -1
- package/storages/index.d.ts +3 -1
- package/storages/index.d.ts.map +1 -1
- package/storages/index.js +3 -1
- package/storages/index.js.map +1 -1
- package/storages/key_value_store.d.ts +104 -22
- package/storages/key_value_store.d.ts.map +1 -1
- package/storages/key_value_store.js +166 -51
- package/storages/key_value_store.js.map +1 -1
- package/storages/request_list.d.ts +9 -9
- package/storages/request_list.d.ts.map +1 -1
- package/storages/request_list.js +13 -8
- package/storages/request_list.js.map +1 -1
- package/storages/request_list_adapter.d.ts +58 -0
- package/storages/request_list_adapter.d.ts.map +1 -0
- package/storages/request_list_adapter.js +81 -0
- package/storages/request_list_adapter.js.map +1 -0
- package/storages/request_manager_tandem.d.ts +68 -0
- package/storages/request_manager_tandem.d.ts.map +1 -0
- package/storages/request_manager_tandem.js +124 -0
- package/storages/request_manager_tandem.js.map +1 -0
- package/storages/request_provider.d.ts +87 -22
- package/storages/request_provider.d.ts.map +1 -1
- package/storages/request_provider.js +127 -77
- package/storages/request_provider.js.map +1 -1
- package/storages/request_queue.d.ts +1 -3
- package/storages/request_queue.d.ts.map +1 -1
- package/storages/request_queue.js +2 -4
- package/storages/request_queue.js.map +1 -1
- package/storages/request_queue_v2.d.ts +3 -3
- package/storages/request_queue_v2.d.ts.map +1 -1
- package/storages/request_queue_v2.js +4 -5
- package/storages/request_queue_v2.js.map +1 -1
- package/storages/sitemap_request_list.d.ts +5 -5
- package/storages/sitemap_request_list.d.ts.map +1 -1
- package/storages/sitemap_request_list.js +10 -7
- package/storages/sitemap_request_list.js.map +1 -1
- package/storages/storage_instance_manager.d.ts +91 -0
- package/storages/storage_instance_manager.d.ts.map +1 -0
- package/storages/storage_instance_manager.js +236 -0
- package/storages/storage_instance_manager.js.map +1 -0
- package/storages/utils.d.ts +47 -1
- package/storages/utils.d.ts.map +1 -1
- package/storages/utils.js +57 -5
- package/storages/utils.js.map +1 -1
- package/typedefs.d.ts +1 -1
- package/typedefs.d.ts.map +1 -1
- package/validators.d.ts +4 -0
- package/validators.d.ts.map +1 -1
- package/validators.js +4 -0
- package/validators.js.map +1 -1
- package/crawlers/crawler_extension.d.ts +0 -12
- package/crawlers/crawler_extension.d.ts.map +0 -1
- package/crawlers/crawler_extension.js +0 -14
- package/crawlers/crawler_extension.js.map +0 -1
- package/http_clients/base-http-client.d.ts +0 -134
- package/http_clients/base-http-client.d.ts.map +0 -1
- package/http_clients/base-http-client.js +0 -33
- package/http_clients/base-http-client.js.map +0 -1
- package/http_clients/form-data-like.d.ts +0 -67
- package/http_clients/form-data-like.d.ts.map +0 -1
- package/http_clients/form-data-like.js +0 -5
- package/http_clients/form-data-like.js.map +0 -1
- package/http_clients/got-scraping-http-client.d.ts +0 -15
- package/http_clients/got-scraping-http-client.d.ts.map +0 -1
- package/http_clients/got-scraping-http-client.js +0 -69
- package/http_clients/got-scraping-http-client.js.map +0 -1
- package/http_clients/index.d.ts +0 -3
- package/http_clients/index.d.ts.map +0 -1
- package/http_clients/index.js +0 -3
- package/http_clients/index.js.map +0 -1
- package/session_pool/events.d.ts +0 -3
- package/session_pool/events.d.ts.map +0 -1
- package/session_pool/events.js +0 -3
- package/session_pool/events.js.map +0 -1
- package/storages/storage_manager.d.ts +0 -58
- package/storages/storage_manager.d.ts.map +0 -1
- package/storages/storage_manager.js +0 -105
- package/storages/storage_manager.js.map +0 -1
- package/tsconfig.build.tsbuildinfo +0 -1
|
@@ -1,31 +1,18 @@
|
|
|
1
|
-
import { EventEmitter } from 'node:events';
|
|
2
1
|
import { AsyncQueue } from '@sapphire/async-queue';
|
|
3
2
|
import ow from 'ow';
|
|
4
|
-
import {
|
|
5
|
-
import { log as defaultLog } from '../log.js';
|
|
3
|
+
import { serviceLocator } from '../service_locator.js';
|
|
6
4
|
import { KeyValueStore } from '../storages/key_value_store.js';
|
|
7
|
-
import {
|
|
5
|
+
import { MAX_POOL_SIZE, PERSIST_STATE_KEY } from './consts.js';
|
|
8
6
|
import { Session } from './session.js';
|
|
7
|
+
const SESSION_REUSE_STRATEGIES = ['random', 'round-robin', 'use-until-failure'];
|
|
9
8
|
/**
|
|
10
9
|
* Handles the rotation, creation and persistence of user-like sessions.
|
|
11
10
|
* Creates a pool of {@link Session} instances, that are randomly rotated.
|
|
12
11
|
* When some session is marked as blocked, it is removed and new one is created instead (the pool never returns an unusable session).
|
|
13
12
|
* Learn more in the {@doclink guides/session-management | Session management guide}.
|
|
14
13
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* Session pool is already integrated into crawlers, and it can significantly improve your scraper
|
|
18
|
-
* performance with just 2 lines of code.
|
|
19
|
-
*
|
|
20
|
-
* **Example usage:**
|
|
21
|
-
*
|
|
22
|
-
* ```javascript
|
|
23
|
-
* const crawler = new CheerioCrawler({
|
|
24
|
-
* useSessionPool: true,
|
|
25
|
-
* persistCookiesPerSession: true,
|
|
26
|
-
* // ...
|
|
27
|
-
* })
|
|
28
|
-
* ```
|
|
14
|
+
* Session pool is already integrated into crawlers and is always active.
|
|
15
|
+
* All public methods are lazy-initialized — the pool initializes itself on first use.
|
|
29
16
|
*
|
|
30
17
|
* You can configure the pool with many options. See the {@link SessionPoolOptions}.
|
|
31
18
|
* Session pool is by default persisted in default {@link KeyValueStore}.
|
|
@@ -35,7 +22,7 @@ import { Session } from './session.js';
|
|
|
35
22
|
* **Advanced usage:**
|
|
36
23
|
*
|
|
37
24
|
* ```javascript
|
|
38
|
-
* const sessionPool =
|
|
25
|
+
* const sessionPool = new SessionPool({
|
|
39
26
|
* maxPoolSize: 25,
|
|
40
27
|
* sessionOptions:{
|
|
41
28
|
* maxAgeSecs: 10,
|
|
@@ -71,8 +58,9 @@ import { Session } from './session.js';
|
|
|
71
58
|
*
|
|
72
59
|
* @category Scaling
|
|
73
60
|
*/
|
|
74
|
-
export class SessionPool
|
|
75
|
-
|
|
61
|
+
export class SessionPool {
|
|
62
|
+
static nextId = 0;
|
|
63
|
+
id;
|
|
76
64
|
log;
|
|
77
65
|
maxPoolSize;
|
|
78
66
|
createSessionFunction;
|
|
@@ -84,73 +72,76 @@ export class SessionPool extends EventEmitter {
|
|
|
84
72
|
persistStateKey;
|
|
85
73
|
_listener;
|
|
86
74
|
events;
|
|
87
|
-
blockedStatusCodes;
|
|
88
75
|
persistenceOptions;
|
|
89
|
-
|
|
76
|
+
sessionReuseStrategy;
|
|
77
|
+
initPromise;
|
|
90
78
|
queue = new AsyncQueue();
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
*/
|
|
94
|
-
constructor(options = {}, config = Configuration.getGlobalConfig()) {
|
|
95
|
-
super();
|
|
96
|
-
this.config = config;
|
|
79
|
+
roundRobinIndex = 0;
|
|
80
|
+
constructor(options = {}) {
|
|
97
81
|
ow(options, ow.object.exactShape({
|
|
82
|
+
id: ow.optional.any(ow.number, ow.string),
|
|
98
83
|
maxPoolSize: ow.optional.number,
|
|
99
84
|
persistStateKeyValueStoreId: ow.optional.string,
|
|
100
85
|
persistStateKey: ow.optional.string,
|
|
101
86
|
createSessionFunction: ow.optional.function,
|
|
102
87
|
sessionOptions: ow.optional.object,
|
|
103
|
-
blockedStatusCodes: ow.optional.array.ofType(ow.number),
|
|
104
88
|
log: ow.optional.object,
|
|
105
89
|
persistenceOptions: ow.optional.object,
|
|
90
|
+
sessionReuseStrategy: ow.optional.string.oneOf([...SESSION_REUSE_STRATEGIES]),
|
|
106
91
|
}));
|
|
107
|
-
const { maxPoolSize = MAX_POOL_SIZE, persistStateKeyValueStoreId, persistStateKey
|
|
92
|
+
const { id, maxPoolSize = MAX_POOL_SIZE, persistStateKeyValueStoreId, persistStateKey, createSessionFunction, sessionOptions = {}, log = serviceLocator.getLogger(), persistenceOptions = {
|
|
108
93
|
enable: true,
|
|
109
|
-
}, } = options;
|
|
110
|
-
this.
|
|
111
|
-
this.
|
|
112
|
-
this.events =
|
|
94
|
+
}, sessionReuseStrategy = 'random', } = options;
|
|
95
|
+
this.id = id != null ? String(id) : String(SessionPool.nextId++);
|
|
96
|
+
this.sessionReuseStrategy = sessionReuseStrategy;
|
|
97
|
+
this.events = serviceLocator.getEventManager();
|
|
113
98
|
this.log = log.child({ prefix: 'SessionPool' });
|
|
114
99
|
this.persistenceOptions = persistenceOptions;
|
|
115
100
|
// Pool Configuration
|
|
116
101
|
this.maxPoolSize = maxPoolSize;
|
|
117
102
|
this.createSessionFunction = createSessionFunction || this._defaultCreateSessionFunction;
|
|
118
|
-
// Session configuration
|
|
103
|
+
// Session configuration. The pool-scoped logger is merged into per-call sessionOptions inside
|
|
104
|
+
// `_invokeCreateSessionFunction`, so every Session inherits it without custom createSessionFunctions
|
|
105
|
+
// having to know about it.
|
|
119
106
|
this.sessionOptions = {
|
|
120
107
|
...sessionOptions,
|
|
121
|
-
// the log needs to propagate to createSessionFunction as in "new Session({ ...sessionPool.sessionOptions })"
|
|
122
|
-
// and can't go inside _defaultCreateSessionFunction
|
|
123
108
|
log: this.log,
|
|
124
109
|
};
|
|
125
110
|
// Session keyValueStore
|
|
126
111
|
this.persistStateKeyValueStoreId = persistStateKeyValueStoreId;
|
|
127
|
-
this.persistStateKey = persistStateKey
|
|
112
|
+
this.persistStateKey = persistStateKey ?? `${PERSIST_STATE_KEY}_${this.id}`;
|
|
128
113
|
}
|
|
129
114
|
/**
|
|
130
115
|
* Gets count of usable sessions in the pool.
|
|
131
116
|
*/
|
|
132
|
-
|
|
117
|
+
async usableSessionsCount() {
|
|
118
|
+
await this.ensureInitialized();
|
|
133
119
|
return this.sessions.filter((session) => session.isUsable()).length;
|
|
134
120
|
}
|
|
135
121
|
/**
|
|
136
122
|
* Gets count of retired sessions in the pool.
|
|
137
123
|
*/
|
|
138
|
-
|
|
124
|
+
async retiredSessionsCount() {
|
|
125
|
+
await this.ensureInitialized();
|
|
139
126
|
return this.sessions.filter((session) => !session.isUsable()).length;
|
|
140
127
|
}
|
|
141
128
|
/**
|
|
142
129
|
* Starts periodic state persistence and potentially loads SessionPool state from {@link KeyValueStore}.
|
|
143
|
-
*
|
|
130
|
+
* Called automatically on first use of any public method.
|
|
144
131
|
*/
|
|
145
|
-
async
|
|
146
|
-
if (this.
|
|
147
|
-
|
|
132
|
+
async ensureInitialized() {
|
|
133
|
+
if (!this.initPromise) {
|
|
134
|
+
this.initPromise = this.setupPool();
|
|
148
135
|
}
|
|
149
|
-
|
|
136
|
+
return this.initPromise;
|
|
137
|
+
}
|
|
138
|
+
async setupPool() {
|
|
150
139
|
if (!this.persistenceOptions.enable) {
|
|
151
|
-
this.isInitialized = true;
|
|
152
140
|
return;
|
|
153
141
|
}
|
|
142
|
+
this.keyValueStore = await KeyValueStore.open(this.persistStateKeyValueStoreId ? { id: this.persistStateKeyValueStoreId } : null, {
|
|
143
|
+
config: serviceLocator.getConfiguration(),
|
|
144
|
+
});
|
|
154
145
|
if (!this.persistStateKeyValueStoreId) {
|
|
155
146
|
this.log.debug(`No 'persistStateKeyValueStoreId' options specified, this session pool's data has been saved in the KeyValueStore with the id: ${this.keyValueStore.id}`);
|
|
156
147
|
}
|
|
@@ -158,7 +149,6 @@ export class SessionPool extends EventEmitter {
|
|
|
158
149
|
await this._maybeLoadSessionPool();
|
|
159
150
|
this._listener = this.persistState.bind(this);
|
|
160
151
|
this.events.on("persistState" /* EventType.PERSIST_STATE */, this._listener);
|
|
161
|
-
this.isInitialized = true;
|
|
162
152
|
}
|
|
163
153
|
/**
|
|
164
154
|
* Adds a new session to the session pool. The pool automatically creates sessions up to the maximum size of the pool,
|
|
@@ -167,7 +157,7 @@ export class SessionPool extends EventEmitter {
|
|
|
167
157
|
* @param [options] The configuration options for the session being added to the session pool.
|
|
168
158
|
*/
|
|
169
159
|
async addSession(options = {}) {
|
|
170
|
-
this.
|
|
160
|
+
await this.ensureInitialized();
|
|
171
161
|
const { id } = options;
|
|
172
162
|
if (id) {
|
|
173
163
|
const sessionExists = this.sessionMap.has(id);
|
|
@@ -178,10 +168,22 @@ export class SessionPool extends EventEmitter {
|
|
|
178
168
|
if (!this._hasSpaceForSession()) {
|
|
179
169
|
this._removeRetiredSessions();
|
|
180
170
|
}
|
|
181
|
-
const newSession = options instanceof Session ? options : await this.
|
|
171
|
+
const newSession = options instanceof Session ? options : await this._invokeCreateSessionFunction(options);
|
|
182
172
|
this.log.debug(`Adding new Session - ${newSession.id}`);
|
|
183
173
|
this._addSession(newSession);
|
|
184
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Adds a new session to the session pool. The pool automatically creates sessions up to the maximum size of the pool,
|
|
177
|
+
* but this allows you to add more sessions once the max pool size is reached.
|
|
178
|
+
* This also allows you to add session with overridden session options (e.g. with specific session id).
|
|
179
|
+
* @param [options] The configuration options for the session being added to the session pool.
|
|
180
|
+
*/
|
|
181
|
+
async newSession(sessionOptions) {
|
|
182
|
+
await this.ensureInitialized();
|
|
183
|
+
const newSession = await this._invokeCreateSessionFunction(sessionOptions);
|
|
184
|
+
this._addSession(newSession);
|
|
185
|
+
return newSession;
|
|
186
|
+
}
|
|
185
187
|
/**
|
|
186
188
|
* Gets session.
|
|
187
189
|
* If there is space for new session, it creates and returns new session.
|
|
@@ -190,21 +192,20 @@ export class SessionPool extends EventEmitter {
|
|
|
190
192
|
* @param [sessionId] If provided, it returns the usable session with this id, `undefined` otherwise.
|
|
191
193
|
*/
|
|
192
194
|
async getSession(sessionId) {
|
|
195
|
+
await this.ensureInitialized();
|
|
193
196
|
await this.queue.wait();
|
|
194
197
|
try {
|
|
195
|
-
this._throwIfNotInitialized();
|
|
196
198
|
if (sessionId) {
|
|
197
199
|
const session = this.sessionMap.get(sessionId);
|
|
198
|
-
if (session
|
|
200
|
+
if (session?.isUsable())
|
|
199
201
|
return session;
|
|
200
202
|
return undefined;
|
|
201
203
|
}
|
|
202
|
-
if (this._hasSpaceForSession()) {
|
|
203
|
-
return await this._createSession();
|
|
204
|
-
}
|
|
205
204
|
const pickedSession = this._pickSession();
|
|
206
|
-
if (pickedSession
|
|
205
|
+
if (pickedSession)
|
|
207
206
|
return pickedSession;
|
|
207
|
+
if (this._hasSpaceForSession()) {
|
|
208
|
+
return await this._createSession();
|
|
208
209
|
}
|
|
209
210
|
this._removeRetiredSessions();
|
|
210
211
|
return await this._createSession();
|
|
@@ -220,16 +221,18 @@ export class SessionPool extends EventEmitter {
|
|
|
220
221
|
if (!this.persistenceOptions.enable && !options?.enable) {
|
|
221
222
|
return;
|
|
222
223
|
}
|
|
224
|
+
await this.ensureInitialized();
|
|
223
225
|
await this.keyValueStore?.setValue(this.persistStateKey, null);
|
|
224
226
|
}
|
|
225
227
|
/**
|
|
226
228
|
* Returns an object representing the internal state of the `SessionPool` instance.
|
|
227
229
|
* Note that the object's fields can change in future releases.
|
|
228
230
|
*/
|
|
229
|
-
getState() {
|
|
231
|
+
async getState() {
|
|
232
|
+
await this.ensureInitialized();
|
|
230
233
|
return {
|
|
231
|
-
usableSessionsCount: this.usableSessionsCount,
|
|
232
|
-
retiredSessionsCount: this.retiredSessionsCount,
|
|
234
|
+
usableSessionsCount: await this.usableSessionsCount(),
|
|
235
|
+
retiredSessionsCount: await this.retiredSessionsCount(),
|
|
233
236
|
sessions: this.sessions.map((session) => session.getState()),
|
|
234
237
|
};
|
|
235
238
|
}
|
|
@@ -242,18 +245,13 @@ export class SessionPool extends EventEmitter {
|
|
|
242
245
|
if (!this.persistenceOptions.enable && !options?.enable) {
|
|
243
246
|
return;
|
|
244
247
|
}
|
|
248
|
+
await this.ensureInitialized();
|
|
245
249
|
this.log.debug('Persisting state', {
|
|
246
250
|
persistStateKeyValueStoreId: this.persistStateKeyValueStoreId,
|
|
247
251
|
persistStateKey: this.persistStateKey,
|
|
248
252
|
});
|
|
249
|
-
// use half the interval of `persistState` to avoid race conditions
|
|
250
|
-
const persistStateIntervalMillis = this.config.get('persistStateIntervalMillis');
|
|
251
|
-
const timeoutSecs = persistStateIntervalMillis / 2_000;
|
|
252
253
|
await this.keyValueStore
|
|
253
|
-
|
|
254
|
-
timeoutSecs,
|
|
255
|
-
doNotRetryTimeouts: true,
|
|
256
|
-
})
|
|
254
|
+
?.setValue(this.persistStateKey, await this.getState())
|
|
257
255
|
.catch((error) => this.log.warning(`Failed to persist the session pool stats to ${this.persistStateKey}`, { error }));
|
|
258
256
|
}
|
|
259
257
|
/**
|
|
@@ -261,16 +259,14 @@ export class SessionPool extends EventEmitter {
|
|
|
261
259
|
* This function should be called after you are done with using the `SessionPool` instance.
|
|
262
260
|
*/
|
|
263
261
|
async teardown() {
|
|
264
|
-
|
|
262
|
+
if (!this.initPromise)
|
|
263
|
+
return;
|
|
264
|
+
await this.ensureInitialized();
|
|
265
|
+
if (this._listener) {
|
|
266
|
+
this.events.off("persistState" /* EventType.PERSIST_STATE */, this._listener);
|
|
267
|
+
}
|
|
265
268
|
await this.persistState();
|
|
266
269
|
}
|
|
267
|
-
/**
|
|
268
|
-
* SessionPool should not work before initialization.
|
|
269
|
-
*/
|
|
270
|
-
_throwIfNotInitialized() {
|
|
271
|
-
if (!this.isInitialized)
|
|
272
|
-
throw new Error('SessionPool is not initialized.');
|
|
273
|
-
}
|
|
274
270
|
/**
|
|
275
271
|
* Removes retired `Session` instances from `SessionPool`.
|
|
276
272
|
*/
|
|
@@ -299,26 +295,29 @@ export class SessionPool extends EventEmitter {
|
|
|
299
295
|
}
|
|
300
296
|
/**
|
|
301
297
|
* Creates new session without any extra behavior.
|
|
302
|
-
* @param sessionPool
|
|
303
298
|
* @param [options]
|
|
304
299
|
* @param [options.sessionOptions] The configuration options for the session being created.
|
|
305
300
|
* @returns New session.
|
|
306
301
|
*/
|
|
307
|
-
_defaultCreateSessionFunction(
|
|
302
|
+
async _defaultCreateSessionFunction(options = {}) {
|
|
308
303
|
ow(options, ow.object.exactShape({ sessionOptions: ow.optional.object }));
|
|
309
304
|
const { sessionOptions = {} } = options;
|
|
310
|
-
return new Session(
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
305
|
+
return new Session(sessionOptions);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Invokes `createSessionFunction` with `sessionOptions` already merged from pool-wide defaults and
|
|
309
|
+
* the supplied per-call overrides, so custom implementations don't need to spread `pool.sessionOptions` themselves.
|
|
310
|
+
*/
|
|
311
|
+
async _invokeCreateSessionFunction(perCallOptions) {
|
|
312
|
+
const sessionOptions = { ...this.sessionOptions, ...perCallOptions };
|
|
313
|
+
return this.createSessionFunction({ sessionOptions });
|
|
315
314
|
}
|
|
316
315
|
/**
|
|
317
316
|
* Creates new session and adds it to the pool.
|
|
318
317
|
* @returns Newly created `Session` instance.
|
|
319
318
|
*/
|
|
320
319
|
async _createSession() {
|
|
321
|
-
const newSession = await this.
|
|
320
|
+
const newSession = await this._invokeCreateSessionFunction();
|
|
322
321
|
this._addSession(newSession);
|
|
323
322
|
this.log.debug(`Created new Session - ${newSession.id}`);
|
|
324
323
|
return newSession;
|
|
@@ -330,18 +329,32 @@ export class SessionPool extends EventEmitter {
|
|
|
330
329
|
return this.sessions.length < this.maxPoolSize;
|
|
331
330
|
}
|
|
332
331
|
/**
|
|
333
|
-
* Picks
|
|
334
|
-
*
|
|
332
|
+
* Picks a session from the `SessionPool` according to the configured `sessionReuseStrategy`.
|
|
333
|
+
* Returns `undefined` when no session should be reused and a new one should be created instead.
|
|
335
334
|
*/
|
|
336
335
|
_pickSession() {
|
|
337
|
-
|
|
336
|
+
if (this.sessionReuseStrategy !== 'use-until-failure' && this._hasSpaceForSession())
|
|
337
|
+
return undefined;
|
|
338
|
+
if (this.sessionReuseStrategy === 'use-until-failure') {
|
|
339
|
+
return this.sessions.find((session) => session.isUsable());
|
|
340
|
+
}
|
|
341
|
+
let picked;
|
|
342
|
+
if (this.sessionReuseStrategy === 'round-robin') {
|
|
343
|
+
const index = this.roundRobinIndex % this.sessions.length;
|
|
344
|
+
this.roundRobinIndex = index + 1;
|
|
345
|
+
picked = this.sessions[index];
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
picked = this.sessions[this._getRandomIndex()];
|
|
349
|
+
}
|
|
350
|
+
return picked.isUsable() ? picked : undefined;
|
|
338
351
|
}
|
|
339
352
|
/**
|
|
340
353
|
* Potentially loads `SessionPool`.
|
|
341
354
|
* If the state was persisted it loads the `SessionPool` from the persisted state.
|
|
342
355
|
*/
|
|
343
356
|
async _maybeLoadSessionPool() {
|
|
344
|
-
const loadedSessionPool = await this.keyValueStore
|
|
357
|
+
const loadedSessionPool = await this.keyValueStore?.getValue(this.persistStateKey);
|
|
345
358
|
if (!loadedSessionPool)
|
|
346
359
|
return;
|
|
347
360
|
// Invalidate old sessions and load active sessions only
|
|
@@ -350,26 +363,14 @@ export class SessionPool extends EventEmitter {
|
|
|
350
363
|
persistStateKey: this.persistStateKey,
|
|
351
364
|
});
|
|
352
365
|
for (const sessionObject of loadedSessionPool.sessions) {
|
|
353
|
-
sessionObject.sessionPool = this;
|
|
354
366
|
sessionObject.createdAt = new Date(sessionObject.createdAt);
|
|
355
367
|
sessionObject.expiresAt = new Date(sessionObject.expiresAt);
|
|
356
|
-
const recreatedSession = await this.
|
|
368
|
+
const recreatedSession = await this._invokeCreateSessionFunction(sessionObject);
|
|
357
369
|
if (recreatedSession.isUsable()) {
|
|
358
370
|
this._addSession(recreatedSession);
|
|
359
371
|
}
|
|
360
372
|
}
|
|
361
|
-
this.log.debug(`${this.
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Opens a SessionPool and returns a promise resolving to an instance
|
|
365
|
-
* of the {@link SessionPool} class that is already initialized.
|
|
366
|
-
*
|
|
367
|
-
* For more details and code examples, see the {@link SessionPool} class.
|
|
368
|
-
*/
|
|
369
|
-
static async open(options, config) {
|
|
370
|
-
const sessionPool = new SessionPool(options, config);
|
|
371
|
-
await sessionPool.initialize();
|
|
372
|
-
return sessionPool;
|
|
373
|
+
this.log.debug(`${this.sessions.length} active sessions loaded from KeyValueStore`);
|
|
373
374
|
}
|
|
374
375
|
}
|
|
375
376
|
//# sourceMappingURL=session_pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session_pool.js","sourceRoot":"","sources":["../../src/session_pool/session_pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session_pool.js","sourceRoot":"","sources":["../../src/session_pool/session_pool.ts"],"names":[],"mappings":"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"}
|