@keetanetwork/anchor 0.0.60 → 0.0.62
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/lib/chaining.d.ts +29 -6
- package/lib/chaining.d.ts.map +1 -1
- package/lib/chaining.js +61 -24
- package/lib/chaining.js.map +1 -1
- package/lib/queue/drivers/queue_postgres.d.ts.map +1 -1
- package/lib/queue/drivers/queue_postgres.js +47 -43
- package/lib/queue/drivers/queue_postgres.js.map +1 -1
- package/lib/resolver.d.ts +9 -0
- package/lib/resolver.d.ts.map +1 -1
- package/lib/resolver.js +7 -1
- package/lib/resolver.js.map +1 -1
- package/lib/token-metadata.d.ts.map +1 -1
- package/lib/token-metadata.js +1 -1
- package/lib/token-metadata.js.map +1 -1
- package/npm-shrinkwrap.json +18 -18
- package/package.json +2 -2
- package/services/fx/client.d.ts +2 -1
- package/services/fx/client.d.ts.map +1 -1
- package/services/fx/client.js +5 -3
- package/services/fx/client.js.map +1 -1
- package/services/storage/clients/contacts.d.ts +5 -11
- package/services/storage/clients/contacts.d.ts.map +1 -1
- package/services/storage/clients/contacts.js +1 -1
- package/services/storage/clients/contacts.js.map +1 -1
|
@@ -67,7 +67,7 @@ export default class KeetaAnchorQueueStorageDriverPostgres {
|
|
|
67
67
|
// Version 1: Initial schema
|
|
68
68
|
if (currentVersion < 1) {
|
|
69
69
|
logger?.debug('Applying schema version 1: Initial tables and indexes');
|
|
70
|
-
await client.query('BEGIN');
|
|
70
|
+
await client.query('BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
|
71
71
|
try {
|
|
72
72
|
await client.query(`
|
|
73
73
|
CREATE TABLE IF NOT EXISTS ${this.tableNameEntries} (
|
|
@@ -108,15 +108,15 @@ export default class KeetaAnchorQueueStorageDriverPostgres {
|
|
|
108
108
|
// Version 2: Partition-aware composite indexes
|
|
109
109
|
if (currentVersion < 2) {
|
|
110
110
|
logger?.debug('Applying schema version 2: Partition-aware composite indexes');
|
|
111
|
-
// Create new partition-aware indexes (CONCURRENTLY must be outside transaction)
|
|
112
|
-
logger?.debug('Creating partition-aware indexes...');
|
|
113
|
-
await client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameEntries}_path_status ON ${this.tableNameEntries}(path, status)`);
|
|
114
|
-
await client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameEntries}_path_updated ON ${this.tableNameEntries}(path, updated)`);
|
|
115
|
-
await client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameEntries}_path_status_updated ON ${this.tableNameEntries}(path, status, updated)`);
|
|
116
|
-
await client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameIdempotentKeys}_path_idempotent_id ON ${this.tableNameIdempotentKeys}(path, idempotent_id)`);
|
|
117
111
|
// Now drop old indexes and record version
|
|
118
|
-
await client.query('BEGIN');
|
|
112
|
+
await client.query('BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
|
119
113
|
try {
|
|
114
|
+
// Create new partition-aware indexes
|
|
115
|
+
logger?.debug('Creating partition-aware indexes...');
|
|
116
|
+
await client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_path_status ON ${this.tableNameEntries}(path, status)`);
|
|
117
|
+
await client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_path_updated ON ${this.tableNameEntries}(path, updated)`);
|
|
118
|
+
await client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_path_status_updated ON ${this.tableNameEntries}(path, status, updated)`);
|
|
119
|
+
await client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameIdempotentKeys}_path_idempotent_id ON ${this.tableNameIdempotentKeys}(path, idempotent_id)`);
|
|
120
120
|
// Drop old indexes that are now redundant (these will fail gracefully if indexes don't exist)
|
|
121
121
|
logger?.debug('Dropping old single-column indexes...');
|
|
122
122
|
await client.query(`DROP INDEX IF EXISTS idx_${this.tableNameEntries}_status`);
|
|
@@ -181,21 +181,25 @@ export default class KeetaAnchorQueueStorageDriverPostgres {
|
|
|
181
181
|
}
|
|
182
182
|
catch (error) {
|
|
183
183
|
lastError = error;
|
|
184
|
+
let detectedRetryableError = false;
|
|
184
185
|
if (error instanceof Error) {
|
|
185
186
|
const errorCode = 'code' in error ? error.code : null;
|
|
186
187
|
if (errorCode === '40001' || errorCode === '40P01') {
|
|
187
|
-
logger?.debug('Serialization failure or deadlock detected');
|
|
188
188
|
// Track serialization retries for instrumentation
|
|
189
189
|
this.serializationRetryCount++;
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const backoffIntervalSize = Math.min(maxBackoff - minBackoff, (retry + 50) ** 2);
|
|
193
|
-
const backoff = Math.round((Math.random() * backoffIntervalSize)) + minBackoff;
|
|
194
|
-
this.methodLogger('runWithRetry')?.debug(`Retrying DB operation in ${backoff}ms (retry #${retry}) from`, new Error().stack);
|
|
195
|
-
await asleep(backoff);
|
|
196
|
-
continue;
|
|
190
|
+
detectedRetryableError = true;
|
|
191
|
+
logger?.debug('Detected retryable error with code', errorCode);
|
|
197
192
|
}
|
|
198
193
|
}
|
|
194
|
+
if (detectedRetryableError) {
|
|
195
|
+
const minBackoff = 100;
|
|
196
|
+
const maxBackoff = 30_000;
|
|
197
|
+
const backoffIntervalSize = Math.min(maxBackoff - minBackoff, (retry + 50) ** 2);
|
|
198
|
+
const backoff = Math.round((Math.random() * backoffIntervalSize)) + minBackoff;
|
|
199
|
+
this.methodLogger('runWithRetry')?.debug(`Retrying DB operation in ${backoff}ms (retry #${retry}) from`, new Error().stack);
|
|
200
|
+
await asleep(backoff);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
199
203
|
throw (error);
|
|
200
204
|
}
|
|
201
205
|
}
|
|
@@ -222,7 +226,7 @@ export default class KeetaAnchorQueueStorageDriverPostgres {
|
|
|
222
226
|
const client = await pool.connect();
|
|
223
227
|
try {
|
|
224
228
|
logger?.debug('Starting DB transaction');
|
|
225
|
-
await client.query('BEGIN TRANSACTION ISOLATION LEVEL
|
|
229
|
+
await client.query('BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
|
226
230
|
logger?.debug('DB transaction started');
|
|
227
231
|
if (debugForceIndexScan) {
|
|
228
232
|
await client.query('SET LOCAL enable_seqscan TO off');
|
|
@@ -253,28 +257,6 @@ export default class KeetaAnchorQueueStorageDriverPostgres {
|
|
|
253
257
|
async add(request, info) {
|
|
254
258
|
return (await this.dbTransaction('add', async (client, logger) => {
|
|
255
259
|
let entryID = ConvertStringToRequestID(info?.id);
|
|
256
|
-
if (entryID) {
|
|
257
|
-
const existingEntry = await client.query(`SELECT id FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2`, [entryID, this.pathStr]);
|
|
258
|
-
if (existingEntry.rows.length > 0) {
|
|
259
|
-
logger?.debug(`Request with id ${String(entryID)} already exists, ignoring`);
|
|
260
|
-
return (entryID);
|
|
261
|
-
}
|
|
262
|
-
await this.toctouDelay?.();
|
|
263
|
-
}
|
|
264
|
-
const idempotentIDs = info?.idempotentKeys;
|
|
265
|
-
if (idempotentIDs) {
|
|
266
|
-
const matchingIdempotentEntries = new Set();
|
|
267
|
-
for (const idempotentID of idempotentIDs) {
|
|
268
|
-
const idempotentEntryExists = await client.query(`SELECT idempotent_id FROM ${this.tableNameIdempotentKeys} WHERE idempotent_id = $1 AND path = $2`, [idempotentID, this.pathStr]);
|
|
269
|
-
if (idempotentEntryExists.rows.length > 0) {
|
|
270
|
-
matchingIdempotentEntries.add(idempotentID);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
if (matchingIdempotentEntries.size !== 0) {
|
|
274
|
-
throw (new Errors.IdempotentExistsError('One or more idempotent entries already exist in the queue', matchingIdempotentEntries));
|
|
275
|
-
}
|
|
276
|
-
await this.toctouDelay?.();
|
|
277
|
-
}
|
|
278
260
|
entryID ??= ConvertStringToRequestID(crypto.randomUUID());
|
|
279
261
|
logger?.debug(`Enqueuing request with id ${String(entryID)}`);
|
|
280
262
|
const currentTime = Date.now();
|
|
@@ -283,12 +265,34 @@ export default class KeetaAnchorQueueStorageDriverPostgres {
|
|
|
283
265
|
* The status to use for the new entry
|
|
284
266
|
*/
|
|
285
267
|
const status = info?.status ?? 'pending';
|
|
286
|
-
await client.query(`
|
|
287
|
-
|
|
268
|
+
const insertedEntry = await client.query(`
|
|
269
|
+
INSERT INTO ${this.tableNameEntries} (
|
|
270
|
+
id, path, request, output, last_error, status,
|
|
271
|
+
created, updated, worker, failures
|
|
272
|
+
) VALUES ($1, $2, $3, NULL, NULL, $4, $5, $6, NULL, 0)
|
|
273
|
+
ON CONFLICT (id, path) DO NOTHING
|
|
274
|
+
RETURNING id`, [entryID, this.pathStr, requestJSON, status, currentTime, currentTime]);
|
|
275
|
+
if (insertedEntry.rows.length === 0) {
|
|
276
|
+
logger?.debug(`Request with id ${String(entryID)} already exists, ignoring`);
|
|
277
|
+
return (entryID);
|
|
278
|
+
}
|
|
279
|
+
await this.toctouDelay?.();
|
|
280
|
+
const idempotentIDs = info?.idempotentKeys;
|
|
288
281
|
if (idempotentIDs && idempotentIDs.size > 0) {
|
|
289
|
-
|
|
290
|
-
|
|
282
|
+
const keys = Array.from(idempotentIDs);
|
|
283
|
+
const insertedKeys = await client.query(`
|
|
284
|
+
INSERT INTO ${this.tableNameIdempotentKeys}(entry_id, path, idempotent_id)
|
|
285
|
+
SELECT $1, $2, unnest($3::text[])
|
|
286
|
+
ON CONFLICT (idempotent_id, path) DO NOTHING
|
|
287
|
+
RETURNING idempotent_id`, [entryID, this.pathStr, keys]);
|
|
288
|
+
const foundKeySet = new Set(keys);
|
|
289
|
+
for (const row of insertedKeys.rows) {
|
|
290
|
+
foundKeySet.delete(ConvertStringToRequestID(row.idempotent_id));
|
|
291
|
+
}
|
|
292
|
+
if (insertedKeys.rows.length !== keys.length) {
|
|
293
|
+
throw (new Errors.IdempotentExistsError('One or more idempotent entries already exist in the queue', foundKeySet));
|
|
291
294
|
}
|
|
295
|
+
await this.toctouDelay?.();
|
|
292
296
|
}
|
|
293
297
|
return (entryID);
|
|
294
298
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue_postgres.js","sourceRoot":"","sources":["../../../../src/lib/queue/drivers/queue_postgres.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:ignore seqscan\n\nimport type {\n\tKeetaAnchorQueueStorageDriver,\n\tKeetaAnchorQueueStorageDriverConstructor,\n\tKeetaAnchorQueueRequest,\n\tKeetaAnchorQueueRequestID,\n\tKeetaAnchorQueueEntry,\n\tKeetaAnchorQueueEntryExtra,\n\tKeetaAnchorQueueEntryAncillaryData,\n\tKeetaAnchorQueueStatus,\n\tKeetaAnchorQueueFilter,\n\tKeetaAnchorQueueWorkerID\n} from '../index.ts';\nimport {\n\tMethodLogger,\n\tManageStatusUpdates,\n\tConvertStringToRequestID\n} from '../internal.js';\nimport { Errors } from '../common.js';\n\nimport { asleep } from '../../utils/asleep.js';\n\nimport type { Logger } from '../../log/index.ts';\nimport type { JSONSerializable } from '../../utils/json.js';\n\nimport type * as pg from 'pg';\n\ntype QueueEntryRow = {\n\tid: string;\n\trequest: string;\n\toutput: string | null;\n\tlast_error: string | null;\n\tstatus: KeetaAnchorQueueStatus;\n\tcreated: Date;\n\tupdated: Date;\n\tworker: number | null;\n\tfailures: number;\n};\n\ntype IdempotentRow = {\n\tidempotent_id: string;\n};\n\ntype KeetaAnchorQueueStorageDriverPostgresOptions = {\n\t/**\n\t * Function that returns a Postgres connection pool.\n\t */\n\tpool: () => Promise<pg.Pool>;\n\n\t/**\n\t * The prefix to use for the database tables. Defaults to 'queue',\n\t * resulting in table names 'queue_entries', 'queue_idempotent_keys',\n\t * and `queue_schema_version`.\n\t */\n\ttablePrefix?: string | undefined;\n};\n\nexport default class KeetaAnchorQueueStorageDriverPostgres<QueueRequest extends JSONSerializable = JSONSerializable, QueueResult extends JSONSerializable = JSONSerializable> implements KeetaAnchorQueueStorageDriver<QueueRequest, QueueResult> {\n\tprivate readonly logger: Logger | undefined;\n\tprivate poolInternal: (() => Promise<pg.Pool>) | null = null;\n\tprivate tablePrefix: string | undefined;\n\tprivate tableNameEntries: string;\n\tprivate tableNameSchemaVersion: string;\n\tprivate tableNameIdempotentKeys: string;\n\tprivate dbInitializationPromise: Promise<boolean> | null = null;\n\tprivate serializationRetryCount = 0;\n\tprivate debugForceIndexScan = false;\n\n\treadonly name = 'KeetaAnchorQueueStorageDriverPostgres';\n\treadonly id: string;\n\treadonly path: string[] = [];\n\tprivate readonly pathStr: string;\n\tprivate toctouDelay: (() => Promise<void>) | undefined = undefined;\n\n\tconstructor(options: NonNullable<ConstructorParameters<KeetaAnchorQueueStorageDriverConstructor<QueueRequest, QueueResult>>[0]> & KeetaAnchorQueueStorageDriverPostgresOptions) {\n\t\tthis.id = options?.id ?? crypto.randomUUID();\n\t\tthis.logger = options?.logger;\n\t\tthis.tablePrefix = options?.tablePrefix;\n\t\tthis.poolInternal = options.pool;\n\t\tthis.path = options.path ?? [];\n\t\tthis.pathStr = ['root', ...this.path].join('.');\n\t\tObject.freeze(this.path);\n\n\t\tthis.tableNameEntries = `${this.tablePrefix ?? 'queue'}_entries`;\n\t\tthis.tableNameIdempotentKeys = `${this.tablePrefix ?? 'queue'}_idempotent_keys`;\n\t\tthis.tableNameSchemaVersion = `${this.tablePrefix ?? 'queue'}_schema_version`;\n\n\t\tthis.methodLogger('new')?.debug('Initialized Postgres queue storage driver');\n\t}\n\n\tprivate async initializeDBConnection(pool: pg.Pool): Promise<pg.Pool> {\n\t\tconst logger = this.methodLogger('initializeDBConnection');\n\n\t\tif (this.dbInitializationPromise !== null) {\n\t\t\tlogger?.debug('DB schema initialization already in progress or completed, waiting for it to finish');\n\n\t\t\tawait this.dbInitializationPromise;\n\t\t\treturn(pool);\n\t\t}\n\n\t\tthis.dbInitializationPromise = (async () => {\n\t\t\tlogger?.debug('Initializing DB schema for queue storage driver on tables', [this.tableNameEntries, this.tableNameIdempotentKeys]);\n\n\t\t\tconst client = await pool.connect();\n\t\t\ttry {\n\t\t\t\t/*\n\t\t\t\t * Random lock key (32-bit integer), to ensure\n\t\t\t\t * that multiple instances of this driver\n\t\t\t\t * (potentially across different\n\t\t\t\t * instances/process) will run the migration\n\t\t\t\t * sequentially to avoid multiple concurrent\n\t\t\t\t * migrations from competing with each other\n\t\t\t\t * and causing delays\n\t\t\t\t */\n\t\t\t\tconst lockId = 0x24995E48;\n\t\t\t\tlogger?.debug('Acquiring advisory lock for schema migration');\n\t\t\t\tawait client.query('SELECT pg_advisory_lock($1)', [lockId]);\n\n\t\t\t\ttry {\n\t\t\t\t\t// Create schema version table if it doesn't exist\n\t\t\t\t\tawait client.query(`\n\t\t\t\t\t\tCREATE TABLE IF NOT EXISTS ${this.tableNameSchemaVersion} (\n\t\t\t\t\t\t\tversion INTEGER NOT NULL,\n\t\t\t\t\t\t\tapplied_at BIGINT NOT NULL,\n\t\t\t\t\t\t\tPRIMARY KEY (version)\n\t\t\t\t\t\t)`);\n\n\t\t\t\t\t// Check current schema version\n\t\t\t\t\tconst versionResult = await client.query<{ version: number }>(`SELECT MAX(version) as version FROM ${this.tableNameSchemaVersion}`);\n\t\t\t\t\tconst currentVersion = versionResult.rows[0]?.version ?? 0;\n\n\t\t\t\t\tlogger?.debug(`Current queue schema version: ${currentVersion}`);\n\n\t\t\t\t\t// Version 1: Initial schema\n\t\t\t\t\tif (currentVersion < 1) {\n\t\t\t\t\t\tlogger?.debug('Applying schema version 1: Initial tables and indexes');\n\n\t\t\t\t\t\tawait client.query('BEGIN');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait client.query(`\n\t\t\t\t\t\t\t\tCREATE TABLE IF NOT EXISTS ${this.tableNameEntries} (\n\t\t\t\t\t\t\t\t\tid TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tpath TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\trequest TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\toutput TEXT,\n\t\t\t\t\t\t\t\t\tlast_error TEXT,\n\t\t\t\t\t\t\t\t\tstatus TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tcreated BIGINT NOT NULL,\n\t\t\t\t\t\t\t\t\tupdated BIGINT NOT NULL,\n\t\t\t\t\t\t\t\t\tworker BIGINT,\n\t\t\t\t\t\t\t\t\tfailures INTEGER NOT NULL DEFAULT 0,\n\t\t\t\t\t\t\t\t\tPRIMARY KEY (id, path)\n\t\t\t\t\t\t\t\t)`);\n\n\t\t\t\t\t\t\tawait client.query(`\n\t\t\t\t\t\t\t\tCREATE TABLE IF NOT EXISTS ${this.tableNameIdempotentKeys} (\n\t\t\t\t\t\t\t\t\tentry_id TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tidempotent_id TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tpath TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tUNIQUE (idempotent_id, path),\n\t\t\t\t\t\t\t\t\tPRIMARY KEY (entry_id, idempotent_id, path),\n\t\t\t\t\t\t\t\t\tFOREIGN KEY (entry_id, path) REFERENCES ${this.tableNameEntries}(id, path)\n\t\t\t\t\t\t\t\t)`);\n\n\t\t\t\t\t\t\t// Old single-column indexes (for pre-version-2 schemas)\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_status ON ${this.tableNameEntries}(status)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_updated ON ${this.tableNameEntries}(updated)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameIdempotentKeys}_idempotent_id ON ${this.tableNameIdempotentKeys}(idempotent_id)`);\n\n\t\t\t\t\t\t\tawait client.query(`INSERT INTO ${this.tableNameSchemaVersion} (version, applied_at) VALUES (1, $1)`, [Date.now()]);\n\t\t\t\t\t\t\tawait client.query('COMMIT');\n\t\t\t\t\t\t\tlogger?.debug('Applied schema version 1');\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t\t\t\t\tthrow(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Version 2: Partition-aware composite indexes\n\t\t\t\t\tif (currentVersion < 2) {\n\t\t\t\t\t\tlogger?.debug('Applying schema version 2: Partition-aware composite indexes');\n\n\t\t\t\t\t\t// Create new partition-aware indexes (CONCURRENTLY must be outside transaction)\n\t\t\t\t\t\tlogger?.debug('Creating partition-aware indexes...');\n\t\t\t\t\t\tawait client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameEntries}_path_status ON ${this.tableNameEntries}(path, status)`);\n\t\t\t\t\t\tawait client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameEntries}_path_updated ON ${this.tableNameEntries}(path, updated)`);\n\t\t\t\t\t\tawait client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameEntries}_path_status_updated ON ${this.tableNameEntries}(path, status, updated)`);\n\t\t\t\t\t\tawait client.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_${this.tableNameIdempotentKeys}_path_idempotent_id ON ${this.tableNameIdempotentKeys}(path, idempotent_id)`);\n\n\t\t\t\t\t\t// Now drop old indexes and record version\n\t\t\t\t\t\tawait client.query('BEGIN');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Drop old indexes that are now redundant (these will fail gracefully if indexes don't exist)\n\t\t\t\t\t\t\tlogger?.debug('Dropping old single-column indexes...');\n\t\t\t\t\t\t\tawait client.query(`DROP INDEX IF EXISTS idx_${this.tableNameEntries}_status`);\n\t\t\t\t\t\t\tawait client.query(`DROP INDEX IF EXISTS idx_${this.tableNameEntries}_updated`);\n\t\t\t\t\t\t\tawait client.query(`DROP INDEX IF EXISTS idx_${this.tableNameIdempotentKeys}_idempotent_id`);\n\n\t\t\t\t\t\t\tawait client.query(`INSERT INTO ${this.tableNameSchemaVersion} (version, applied_at) VALUES (2, $1)`, [Date.now()]);\n\t\t\t\t\t\t\tawait client.query('COMMIT');\n\t\t\t\t\t\t\tlogger?.debug('Applied schema version 2');\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t\t\t\t\tthrow(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger?.debug('Schema is up to date');\n\t\t\t\t} finally {\n\t\t\t\t\t// Always release the advisory lock\n\t\t\t\t\t// Note: Advisory locks are session-based and auto-release on disconnect,\n\t\t\t\t\t// but we explicitly unlock for clarity and to avoid holding locks longer than needed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlogger?.debug('Releasing advisory lock');\n\t\t\t\t\t\tawait client.query('SELECT pg_advisory_unlock($1)', [lockId]);\n\t\t\t\t\t} catch (unlockError) {\n\t\t\t\t\t\t// Log but don't throw - the lock will be auto-released when connection closes\n\t\t\t\t\t\tlogger?.debug('Failed to explicitly release advisory lock (will auto-release on disconnect):', unlockError);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\n\t\t\tlogger?.debug('Completed DB schema initialization for queue storage driver');\n\n\t\t\treturn(true);\n\t\t})();\n\n\t\tawait this.dbInitializationPromise;\n\n\t\treturn(pool);\n\t}\n\n\tprivate methodLogger(method: string): Logger | undefined {\n\t\treturn(MethodLogger(this.logger, {\n\t\t\tclass: 'KeetaAnchorQueueStorageDriverPostgres',\n\t\t\tfile: 'src/lib/queue/drivers/queue_postgres.ts',\n\t\t\tmethod: method,\n\t\t\tinstanceID: this.id\n\t\t}));\n\t}\n\n\tprivate async runWithRetry<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst logger = this.methodLogger('runWithRetry');\n\n\t\tlet lastError: unknown;\n\t\tfor (let retry = 0; retry < 16; retry++) {\n\t\t\tif (this.poolInternal === null) {\n\t\t\t\tthis.methodLogger('runWithRetry')?.debug('Aborting DB operation retries because the instance was destroyed');\n\n\t\t\t\tif (lastError !== undefined) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/only-throw-error\n\t\t\t\t\tthrow(lastError);\n\t\t\t\t}\n\t\t\t\tthrow(new Error('Aborting because the instance was destroyed'));\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn(await fn());\n\t\t\t} catch (error: unknown) {\n\t\t\t\tlastError = error;\n\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst errorCode = 'code' in error ? error.code : null;\n\t\t\t\t\tif (errorCode === '40001' || errorCode === '40P01') {\n\t\t\t\t\t\tlogger?.debug('Serialization failure or deadlock detected');\n\n\t\t\t\t\t\t// Track serialization retries for instrumentation\n\t\t\t\t\t\tthis.serializationRetryCount++;\n\n\t\t\t\t\t\tconst minBackoff = 100;\n\t\t\t\t\t\tconst maxBackoff = 30_000;\n\t\t\t\t\t\tconst backoffIntervalSize = Math.min(maxBackoff - minBackoff, (retry + 50) ** 2);\n\t\t\t\t\t\tconst backoff = Math.round((Math.random() * backoffIntervalSize)) + minBackoff;\n\n\t\t\t\t\t\tthis.methodLogger('runWithRetry')?.debug(`Retrying DB operation in ${backoff}ms (retry #${retry}) from`, new Error().stack);\n\t\t\t\t\t\tawait asleep(backoff);\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthrow(error);\n\t\t\t}\n\t\t}\n\t\tthrow(lastError);\n\t}\n\n\tprivate async newDBConnection(): Promise<pg.Pool> {\n\t\tif (this.poolInternal === null) {\n\t\t\tthrow(new Error('Database connection is not available'));\n\t\t}\n\n\t\treturn(await this.runWithRetry(async () => {\n\t\t\tif (this.poolInternal === null) {\n\t\t\t\tthrow(new Error('Database connection is not available'));\n\t\t\t}\n\n\t\t\tthis.methodLogger('newDBConnection')?.debug('Getting DB pool');\n\t\t\tconst pool = await this.poolInternal();\n\n\t\t\treturn(await this.initializeDBConnection(pool));\n\t\t}));\n\t}\n\n\tprivate async dbTransaction<T>(className: string, fn: (client: pg.PoolClient, logger: Logger | undefined) => Promise<T>): Promise<T> {\n\t\tconst pool = await this.newDBConnection();\n\t\tconst logger = this.methodLogger(className);\n\n\t\tconst debugForceIndexScan = this.debugForceIndexScan;\n\n\t\tconst result = await this.runWithRetry(async function() {\n\t\t\tconst client = await pool.connect();\n\n\t\t\ttry {\n\t\t\t\tlogger?.debug('Starting DB transaction');\n\t\t\t\tawait client.query('BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE');\n\t\t\t\tlogger?.debug('DB transaction started');\n\n\t\t\t\tif (debugForceIndexScan) {\n\t\t\t\t\tawait client.query('SET LOCAL enable_seqscan TO off');\n\t\t\t\t}\n\n\t\t\t\tconst retval = await fn(client, logger);\n\n\t\t\t\tlogger?.debug('Committing DB transaction');\n\t\t\t\tawait client.query('COMMIT');\n\t\t\t\tlogger?.debug('DB transaction committed');\n\n\t\t\t\treturn(retval);\n\t\t\t} catch (error: unknown) {\n\t\t\t\ttry {\n\t\t\t\t\tlogger?.debug('Rolling back DB transaction due to error:', error);\n\t\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t\t\tlogger?.debug('DB transaction rolled back');\n\t\t\t\t} catch {\n\t\t\t\t\tlogger?.debug('Error rolling back DB transaction !!');\n\t\t\t\t}\n\t\t\t\tthrow(error);\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t});\n\n\t\treturn(result);\n\t}\n\n\tasync add(request: KeetaAnchorQueueRequest<QueueRequest>, info?: KeetaAnchorQueueEntryExtra): Promise<KeetaAnchorQueueRequestID> {\n\t\treturn(await this.dbTransaction('add', async (client, logger): Promise<KeetaAnchorQueueRequestID> => {\n\t\t\tlet entryID = ConvertStringToRequestID(info?.id);\n\t\t\tif (entryID) {\n\t\t\t\tconst existingEntry = await client.query<{ id: string }>(`SELECT id FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2`, [entryID, this.pathStr]);\n\t\t\t\tif (existingEntry.rows.length > 0) {\n\t\t\t\t\tlogger?.debug(`Request with id ${String(entryID)} already exists, ignoring`);\n\t\t\t\t\treturn(entryID);\n\t\t\t\t}\n\n\t\t\t\tawait this.toctouDelay?.();\n\t\t\t}\n\n\t\t\tconst idempotentIDs = info?.idempotentKeys;\n\t\t\tif (idempotentIDs) {\n\t\t\t\tconst matchingIdempotentEntries = new Set<KeetaAnchorQueueRequestID>();\n\t\t\t\tfor (const idempotentID of idempotentIDs) {\n\t\t\t\t\tconst idempotentEntryExists = await client.query<IdempotentRow>(\n\t\t\t\t\t\t`SELECT idempotent_id FROM ${this.tableNameIdempotentKeys} WHERE idempotent_id = $1 AND path = $2`,\n\t\t\t\t\t\t[idempotentID, this.pathStr]\n\t\t\t\t\t);\n\t\t\t\t\tif (idempotentEntryExists.rows.length > 0) {\n\t\t\t\t\t\tmatchingIdempotentEntries.add(idempotentID);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (matchingIdempotentEntries.size !== 0) {\n\t\t\t\t\tthrow(new Errors.IdempotentExistsError('One or more idempotent entries already exist in the queue', matchingIdempotentEntries));\n\t\t\t\t}\n\n\t\t\t\tawait this.toctouDelay?.();\n\t\t\t}\n\n\t\t\tentryID ??= ConvertStringToRequestID(crypto.randomUUID());\n\n\t\t\tlogger?.debug(`Enqueuing request with id ${String(entryID)}`);\n\n\t\t\tconst currentTime = Date.now();\n\t\t\tconst requestJSON = JSON.stringify(request);\n\n\t\t\t/**\n\t\t\t * The status to use for the new entry\n\t\t\t */\n\t\t\tconst status = info?.status ?? 'pending';\n\n\t\t\tawait client.query(\n\t\t\t\t`INSERT INTO ${this.tableNameEntries} (id, path, request, output, last_error, status, created, updated, worker, failures)\n\t\t\t\t VALUES ($1, $2, $3, NULL, NULL, $4, $5, $6, NULL, 0)`,\n\t\t\t\t[entryID, this.pathStr, requestJSON, status, currentTime, currentTime]\n\t\t\t);\n\n\t\t\tif (idempotentIDs && idempotentIDs.size > 0) {\n\t\t\t\tfor (const idempotentID of idempotentIDs) {\n\t\t\t\t\tawait client.query(`INSERT INTO ${this.tableNameIdempotentKeys} (entry_id, path, idempotent_id) VALUES ($1, $2, $3)`, [entryID, this.pathStr, idempotentID]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(entryID);\n\t\t}));\n\t}\n\n\tasync setStatus(id: KeetaAnchorQueueRequestID, status: KeetaAnchorQueueStatus, ancillary?: KeetaAnchorQueueEntryAncillaryData<QueueResult>): Promise<void> {\n\t\tconst { oldStatus } = ancillary ?? {};\n\n\t\treturn(await this.dbTransaction('setStatus', async (client, logger): Promise<void> => {\n\t\t\tconst existingEntry = await client.query<{ status: KeetaAnchorQueueStatus; failures: number; last_error: string | null; output: string | null }>(`SELECT status, failures, last_error, output FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2 FOR UPDATE`, [id, this.pathStr]);\n\t\t\tif (existingEntry.rows.length === 0) {\n\t\t\t\tthrow(new Error(`Request with ID ${String(id)} not found`));\n\t\t\t}\n\n\t\t\tawait this.toctouDelay?.();\n\n\t\t\tconst currentEntry = existingEntry.rows[0];\n\t\t\tif (!currentEntry) {\n\t\t\t\tthrow(new Error(`Request with ID ${String(id)} not found`));\n\t\t\t}\n\n\t\t\tconst newEntry = ManageStatusUpdates<QueueResult>(id, currentEntry, status, ancillary, logger);\n\t\t\tconst currentTime = newEntry.updated.getTime();\n\t\t\tconst workerValue = newEntry.worker;\n\t\t\tconst newFailures = newEntry.failures ?? currentEntry.failures;\n\t\t\tconst newLastError = newEntry.lastError !== undefined ? newEntry.lastError : currentEntry.last_error;\n\t\t\tconst newOutput = newEntry.output !== undefined ? JSON.stringify(newEntry.output) : currentEntry.output;\n\n\t\t\tlet updateQuery: string;\n\t\t\tlet updateParams: (KeetaAnchorQueueRequestID | string | number | null)[];\n\n\t\t\tif (oldStatus) {\n\t\t\t\tupdateQuery = `UPDATE ${this.tableNameEntries}\n\t\t\t\t SET status = $1, updated = $2, worker = $3, failures = $4, last_error = $5, output = $6\n\t\t\t\t WHERE id = $7 AND path = $8 AND status = $9`;\n\t\t\t\tupdateParams = [status, currentTime, workerValue, newFailures, newLastError, newOutput, id, this.pathStr, oldStatus];\n\t\t\t} else {\n\t\t\t\tupdateQuery = `UPDATE ${this.tableNameEntries}\n\t\t\t\t SET status = $1, updated = $2, worker = $3, failures = $4, last_error = $5, output = $6\n\t\t\t\t WHERE id = $7 AND path = $8`;\n\t\t\t\tupdateParams = [status, currentTime, workerValue, newFailures, newLastError, newOutput, id, this.pathStr];\n\t\t\t}\n\n\t\t\tconst result = await client.query(updateQuery, updateParams);\n\n\t\t\tawait this.toctouDelay?.();\n\n\t\t\tif (oldStatus && result.rowCount === 0) {\n\t\t\t\tconst currentEntry = await client.query<{ status: KeetaAnchorQueueStatus }>(`SELECT status FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2`, [id, this.pathStr]);\n\t\t\t\tconst currentStatus = currentEntry.rows[0]?.status;\n\t\t\t\tif (currentEntry.rows.length > 0) {\n\t\t\t\t\tif (currentStatus === undefined) {\n\t\t\t\t\t\tthrow(new Error(`internal error: could not retrieve current status for request with ID ${String(id)}`));\n\t\t\t\t\t}\n\t\t\t\t\tthrow(new Errors.IncorrectStateAssertedError(id, oldStatus, currentStatus));\n\t\t\t\t} else {\n\t\t\t\t\tthrow(new Error(`Request with ID ${String(id)} not found`));\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t}\n\n\tasync get(id: KeetaAnchorQueueRequestID): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult> | null> {\n\t\treturn(await this.dbTransaction('get', async (client): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult> | null> => {\n\t\t\tconst row = await client.query<QueueEntryRow>(\n\t\t\t\t`SELECT id, request, output, last_error, status, created, updated, worker, failures\n\t\t\t\t FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2`,\n\t\t\t\t[id, this.pathStr]\n\t\t\t);\n\n\t\t\tif (row.rows.length === 0) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst entry = row.rows[0];\n\t\t\tif (!entry) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst idempotentRows = await client.query<IdempotentRow>(\n\t\t\t\t`SELECT idempotent_id FROM ${this.tableNameIdempotentKeys} WHERE entry_id = $1 AND path = $2`,\n\t\t\t\t[id, this.pathStr]\n\t\t\t);\n\n\t\t\tconst idempotentKeys = idempotentRows.rows.length > 0\n\t\t\t\t? new Set(idempotentRows.rows.map(function(idempotentRow: IdempotentRow) {\n\t\t\t\t\treturn(ConvertStringToRequestID(idempotentRow.idempotent_id));\n\t\t\t\t}))\n\t\t\t\t: undefined;\n\n\t\t\treturn({\n\t\t\t\tid: ConvertStringToRequestID(entry.id),\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\trequest: JSON.parse(entry.request) as QueueRequest,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\toutput: entry.output ? JSON.parse(entry.output) as QueueResult : null,\n\t\t\t\tlastError: entry.last_error,\n\t\t\t\tstatus: entry.status,\n\t\t\t\tcreated: new Date(Number(entry.created)),\n\t\t\t\tupdated: new Date(Number(entry.updated)),\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tworker: entry.worker as unknown as KeetaAnchorQueueWorkerID | null,\n\t\t\t\tfailures: entry.failures,\n\t\t\t\tidempotentKeys: idempotentKeys\n\t\t\t});\n\t\t}));\n\t}\n\n\tasync query(filter?: KeetaAnchorQueueFilter): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult>[]> {\n\t\treturn(await this.dbTransaction('query', async (client, logger): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult>[]> => {\n\t\t\tlogger?.debug(`Querying queue with id ${this.id} with filter:`, filter);\n\n\t\t\tconst conditions: string[] = [];\n\t\t\tconst params: (string | number)[] = [];\n\t\t\tlet paramIndex = 1;\n\n\t\t\tconditions.push(`path = $${paramIndex++}`);\n\t\t\tparams.push(this.pathStr);\n\n\t\t\tif (filter?.status) {\n\t\t\t\tconditions.push(`status = $${paramIndex++}`);\n\t\t\t\tparams.push(filter.status);\n\t\t\t}\n\n\t\t\tif (filter?.updatedBefore) {\n\t\t\t\tconditions.push(`updated < $${paramIndex++}`);\n\t\t\t\tparams.push(filter.updatedBefore.getTime());\n\t\t\t}\n\n\t\t\tlet query = `SELECT id, request, output, last_error, status, created, updated, worker, failures FROM ${this.tableNameEntries}`;\n\n\t\t\tif (conditions.length > 0) {\n\t\t\t\tquery += ' WHERE ' + conditions.join(' AND ');\n\t\t\t}\n\n\t\t\t// Use random ordering to prevent multiple workers from contending for the same rows\n\t\t\t// This spreads the load when multiple workers query simultaneously\n\t\t\tquery += ' ORDER BY RANDOM()';\n\n\t\t\tif (filter?.limit !== undefined) {\n\t\t\t\tquery += ` LIMIT $${paramIndex++}`;\n\t\t\t\tparams.push(filter.limit);\n\t\t\t}\n\n\t\t\tconst rows = await client.query<QueueEntryRow>(query, params);\n\n\t\t\tconst entries: KeetaAnchorQueueEntry<QueueRequest, QueueResult>[] = [];\n\n\t\t\tfor (const row of rows.rows) {\n\t\t\t\tconst idempotentRows = await client.query<IdempotentRow>(\n\t\t\t\t\t`SELECT idempotent_id FROM ${this.tableNameIdempotentKeys} WHERE entry_id = $1 AND path = $2`,\n\t\t\t\t\t[row.id, this.pathStr]\n\t\t\t\t);\n\n\t\t\t\tconst idempotentKeys = idempotentRows.rows.length > 0\n\t\t\t\t\t? new Set(idempotentRows.rows.map(function(idempotentRow: IdempotentRow) {\n\t\t\t\t\t\treturn(ConvertStringToRequestID(idempotentRow.idempotent_id));\n\t\t\t\t\t}))\n\t\t\t\t\t: undefined;\n\n\t\t\t\tentries.push({\n\t\t\t\t\tid: ConvertStringToRequestID(row.id),\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\trequest: JSON.parse(row.request) as QueueRequest,\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\toutput: row.output ? JSON.parse(row.output) as QueueResult : null,\n\t\t\t\t\tlastError: row.last_error,\n\t\t\t\t\tstatus: row.status,\n\t\t\t\t\tcreated: new Date(Number(row.created)),\n\t\t\t\t\tupdated: new Date(Number(row.updated)),\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tworker: row.worker as unknown as KeetaAnchorQueueWorkerID | null,\n\t\t\t\t\tfailures: row.failures,\n\t\t\t\t\tidempotentKeys: idempotentKeys\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger?.debug(`Queried queue with id ${this.id} with filter:`, filter, '-- found', entries.length, 'entries');\n\n\t\t\treturn(entries);\n\t\t}));\n\t}\n\n\tasync partition(path: string) : Promise<KeetaAnchorQueueStorageDriver<QueueRequest, QueueResult>> {\n\t\tthis.methodLogger('partition')?.debug(`Creating partitioned queue storage driver for path: ${path}`);\n\n\t\tif (this.poolInternal === null) {\n\t\t\tthrow(new Error('Asked to partition but the instance has been destroyed'));\n\t\t}\n\n\t\tconst retval = new KeetaAnchorQueueStorageDriverPostgres<QueueRequest, QueueResult>({\n\t\t\tid: `${this.id}::${path}`,\n\t\t\tlogger: this.logger,\n\t\t\tpool: this.poolInternal,\n\t\t\tpath: [...this.path, path],\n\t\t\ttablePrefix: this.tablePrefix\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tthis.methodLogger('destroy')?.debug('Destroying instance');\n\n\t\tthis.poolInternal = null;\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\treturn(await this.destroy());\n\t}\n\n\t/** @internal */\n\t_Testing(key: string): {\n\t\tsetToctouDelay(delay: number): void;\n\t\tunsetToctouDelay(): void;\n\t\tgetSerializationRetryCount(): number;\n\t\tresetSerializationRetryCount(): void;\n\t\tenableDebugForceIndexScan(): void;\n\t\tdisableDebugForceIndexScan(): void;\n\t} {\n\t\tif (key !== 'bc81abf8-e43b-490b-b486-744fb49a5082') {\n\t\t\tthrow(new Error('This is a testing only method'));\n\t\t}\n\n\t\treturn({\n\t\t\tsetToctouDelay: (delay: number): void => {\n\t\t\t\tthis.toctouDelay = async (): Promise<void> => {\n\t\t\t\t\treturn(await asleep(delay));\n\t\t\t\t};\n\t\t\t},\n\t\t\tunsetToctouDelay: (): void => {\n\t\t\t\tthis.toctouDelay = undefined;\n\t\t\t},\n\t\t\tgetSerializationRetryCount: (): number => {\n\t\t\t\treturn(this.serializationRetryCount);\n\t\t\t},\n\t\t\tresetSerializationRetryCount: (): void => {\n\t\t\t\tthis.serializationRetryCount = 0;\n\t\t\t},\n\t\t\tenableDebugForceIndexScan: (): void => {\n\t\t\t\tthis.debugForceIndexScan = true;\n\t\t\t},\n\t\t\tdisableDebugForceIndexScan: (): void => {\n\t\t\t\tthis.debugForceIndexScan = false;\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"queue_postgres.js","sourceRoot":"","sources":["../../../../src/lib/queue/drivers/queue_postgres.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:ignore seqscan\n\nimport type {\n\tKeetaAnchorQueueStorageDriver,\n\tKeetaAnchorQueueStorageDriverConstructor,\n\tKeetaAnchorQueueRequest,\n\tKeetaAnchorQueueRequestID,\n\tKeetaAnchorQueueEntry,\n\tKeetaAnchorQueueEntryExtra,\n\tKeetaAnchorQueueEntryAncillaryData,\n\tKeetaAnchorQueueStatus,\n\tKeetaAnchorQueueFilter,\n\tKeetaAnchorQueueWorkerID\n} from '../index.ts';\nimport {\n\tMethodLogger,\n\tManageStatusUpdates,\n\tConvertStringToRequestID\n} from '../internal.js';\nimport { Errors } from '../common.js';\n\nimport { asleep } from '../../utils/asleep.js';\n\nimport type { Logger } from '../../log/index.ts';\nimport type { JSONSerializable } from '../../utils/json.js';\n\nimport type * as pg from 'pg';\n\ntype QueueEntryRow = {\n\tid: string;\n\trequest: string;\n\toutput: string | null;\n\tlast_error: string | null;\n\tstatus: KeetaAnchorQueueStatus;\n\tcreated: Date;\n\tupdated: Date;\n\tworker: number | null;\n\tfailures: number;\n};\n\ntype IdempotentRow = {\n\tidempotent_id: string;\n};\n\ntype KeetaAnchorQueueStorageDriverPostgresOptions = {\n\t/**\n\t * Function that returns a Postgres connection pool.\n\t */\n\tpool: () => Promise<pg.Pool>;\n\n\t/**\n\t * The prefix to use for the database tables. Defaults to 'queue',\n\t * resulting in table names 'queue_entries', 'queue_idempotent_keys',\n\t * and `queue_schema_version`.\n\t */\n\ttablePrefix?: string | undefined;\n};\n\nexport default class KeetaAnchorQueueStorageDriverPostgres<QueueRequest extends JSONSerializable = JSONSerializable, QueueResult extends JSONSerializable = JSONSerializable> implements KeetaAnchorQueueStorageDriver<QueueRequest, QueueResult> {\n\tprivate readonly logger: Logger | undefined;\n\tprivate poolInternal: (() => Promise<pg.Pool>) | null = null;\n\tprivate tablePrefix: string | undefined;\n\tprivate tableNameEntries: string;\n\tprivate tableNameSchemaVersion: string;\n\tprivate tableNameIdempotentKeys: string;\n\tprivate dbInitializationPromise: Promise<boolean> | null = null;\n\tprivate serializationRetryCount = 0;\n\tprivate debugForceIndexScan = false;\n\n\treadonly name = 'KeetaAnchorQueueStorageDriverPostgres';\n\treadonly id: string;\n\treadonly path: string[] = [];\n\tprivate readonly pathStr: string;\n\tprivate toctouDelay: (() => Promise<void>) | undefined = undefined;\n\n\tconstructor(options: NonNullable<ConstructorParameters<KeetaAnchorQueueStorageDriverConstructor<QueueRequest, QueueResult>>[0]> & KeetaAnchorQueueStorageDriverPostgresOptions) {\n\t\tthis.id = options?.id ?? crypto.randomUUID();\n\t\tthis.logger = options?.logger;\n\t\tthis.tablePrefix = options?.tablePrefix;\n\t\tthis.poolInternal = options.pool;\n\t\tthis.path = options.path ?? [];\n\t\tthis.pathStr = ['root', ...this.path].join('.');\n\t\tObject.freeze(this.path);\n\n\t\tthis.tableNameEntries = `${this.tablePrefix ?? 'queue'}_entries`;\n\t\tthis.tableNameIdempotentKeys = `${this.tablePrefix ?? 'queue'}_idempotent_keys`;\n\t\tthis.tableNameSchemaVersion = `${this.tablePrefix ?? 'queue'}_schema_version`;\n\n\t\tthis.methodLogger('new')?.debug('Initialized Postgres queue storage driver');\n\t}\n\n\tprivate async initializeDBConnection(pool: pg.Pool): Promise<pg.Pool> {\n\t\tconst logger = this.methodLogger('initializeDBConnection');\n\n\t\tif (this.dbInitializationPromise !== null) {\n\t\t\tlogger?.debug('DB schema initialization already in progress or completed, waiting for it to finish');\n\n\t\t\tawait this.dbInitializationPromise;\n\t\t\treturn(pool);\n\t\t}\n\n\t\tthis.dbInitializationPromise = (async () => {\n\t\t\tlogger?.debug('Initializing DB schema for queue storage driver on tables', [this.tableNameEntries, this.tableNameIdempotentKeys]);\n\n\t\t\tconst client = await pool.connect();\n\t\t\ttry {\n\t\t\t\t/*\n\t\t\t\t * Random lock key (32-bit integer), to ensure\n\t\t\t\t * that multiple instances of this driver\n\t\t\t\t * (potentially across different\n\t\t\t\t * instances/process) will run the migration\n\t\t\t\t * sequentially to avoid multiple concurrent\n\t\t\t\t * migrations from competing with each other\n\t\t\t\t * and causing delays\n\t\t\t\t */\n\t\t\t\tconst lockId = 0x24995E48;\n\t\t\t\tlogger?.debug('Acquiring advisory lock for schema migration');\n\t\t\t\tawait client.query('SELECT pg_advisory_lock($1)', [lockId]);\n\n\t\t\t\ttry {\n\t\t\t\t\t// Create schema version table if it doesn't exist\n\t\t\t\t\tawait client.query(`\n\t\t\t\t\t\tCREATE TABLE IF NOT EXISTS ${this.tableNameSchemaVersion} (\n\t\t\t\t\t\t\tversion INTEGER NOT NULL,\n\t\t\t\t\t\t\tapplied_at BIGINT NOT NULL,\n\t\t\t\t\t\t\tPRIMARY KEY (version)\n\t\t\t\t\t\t)`);\n\n\t\t\t\t\t// Check current schema version\n\t\t\t\t\tconst versionResult = await client.query<{ version: number }>(`SELECT MAX(version) as version FROM ${this.tableNameSchemaVersion}`);\n\t\t\t\t\tconst currentVersion = versionResult.rows[0]?.version ?? 0;\n\n\t\t\t\t\tlogger?.debug(`Current queue schema version: ${currentVersion}`);\n\n\t\t\t\t\t// Version 1: Initial schema\n\t\t\t\t\tif (currentVersion < 1) {\n\t\t\t\t\t\tlogger?.debug('Applying schema version 1: Initial tables and indexes');\n\n\t\t\t\t\t\tawait client.query('BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait client.query(`\n\t\t\t\t\t\t\t\tCREATE TABLE IF NOT EXISTS ${this.tableNameEntries} (\n\t\t\t\t\t\t\t\t\tid TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tpath TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\trequest TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\toutput TEXT,\n\t\t\t\t\t\t\t\t\tlast_error TEXT,\n\t\t\t\t\t\t\t\t\tstatus TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tcreated BIGINT NOT NULL,\n\t\t\t\t\t\t\t\t\tupdated BIGINT NOT NULL,\n\t\t\t\t\t\t\t\t\tworker BIGINT,\n\t\t\t\t\t\t\t\t\tfailures INTEGER NOT NULL DEFAULT 0,\n\t\t\t\t\t\t\t\t\tPRIMARY KEY (id, path)\n\t\t\t\t\t\t\t\t)`);\n\n\t\t\t\t\t\t\tawait client.query(`\n\t\t\t\t\t\t\t\tCREATE TABLE IF NOT EXISTS ${this.tableNameIdempotentKeys} (\n\t\t\t\t\t\t\t\t\tentry_id TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tidempotent_id TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tpath TEXT NOT NULL,\n\t\t\t\t\t\t\t\t\tUNIQUE (idempotent_id, path),\n\t\t\t\t\t\t\t\t\tPRIMARY KEY (entry_id, idempotent_id, path),\n\t\t\t\t\t\t\t\t\tFOREIGN KEY (entry_id, path) REFERENCES ${this.tableNameEntries}(id, path)\n\t\t\t\t\t\t\t\t)`);\n\n\t\t\t\t\t\t\t// Old single-column indexes (for pre-version-2 schemas)\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_status ON ${this.tableNameEntries}(status)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_updated ON ${this.tableNameEntries}(updated)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameIdempotentKeys}_idempotent_id ON ${this.tableNameIdempotentKeys}(idempotent_id)`);\n\n\t\t\t\t\t\t\tawait client.query(`INSERT INTO ${this.tableNameSchemaVersion} (version, applied_at) VALUES (1, $1)`, [Date.now()]);\n\t\t\t\t\t\t\tawait client.query('COMMIT');\n\t\t\t\t\t\t\tlogger?.debug('Applied schema version 1');\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t\t\t\t\tthrow(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Version 2: Partition-aware composite indexes\n\t\t\t\t\tif (currentVersion < 2) {\n\t\t\t\t\t\tlogger?.debug('Applying schema version 2: Partition-aware composite indexes');\n\n\t\t\t\t\t\t// Now drop old indexes and record version\n\t\t\t\t\t\tawait client.query('BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Create new partition-aware indexes\n\t\t\t\t\t\t\tlogger?.debug('Creating partition-aware indexes...');\n\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_path_status ON ${this.tableNameEntries}(path, status)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_path_updated ON ${this.tableNameEntries}(path, updated)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameEntries}_path_status_updated ON ${this.tableNameEntries}(path, status, updated)`);\n\t\t\t\t\t\t\tawait client.query(`CREATE INDEX IF NOT EXISTS idx_${this.tableNameIdempotentKeys}_path_idempotent_id ON ${this.tableNameIdempotentKeys}(path, idempotent_id)`);\n\n\t\t\t\t\t\t\t// Drop old indexes that are now redundant (these will fail gracefully if indexes don't exist)\n\t\t\t\t\t\t\tlogger?.debug('Dropping old single-column indexes...');\n\t\t\t\t\t\t\tawait client.query(`DROP INDEX IF EXISTS idx_${this.tableNameEntries}_status`);\n\t\t\t\t\t\t\tawait client.query(`DROP INDEX IF EXISTS idx_${this.tableNameEntries}_updated`);\n\t\t\t\t\t\t\tawait client.query(`DROP INDEX IF EXISTS idx_${this.tableNameIdempotentKeys}_idempotent_id`);\n\n\t\t\t\t\t\t\tawait client.query(`INSERT INTO ${this.tableNameSchemaVersion} (version, applied_at) VALUES (2, $1)`, [Date.now()]);\n\t\t\t\t\t\t\tawait client.query('COMMIT');\n\t\t\t\t\t\t\tlogger?.debug('Applied schema version 2');\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t\t\t\t\tthrow(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger?.debug('Schema is up to date');\n\t\t\t\t} finally {\n\t\t\t\t\t// Always release the advisory lock\n\t\t\t\t\t// Note: Advisory locks are session-based and auto-release on disconnect,\n\t\t\t\t\t// but we explicitly unlock for clarity and to avoid holding locks longer than needed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlogger?.debug('Releasing advisory lock');\n\t\t\t\t\t\tawait client.query('SELECT pg_advisory_unlock($1)', [lockId]);\n\t\t\t\t\t} catch (unlockError) {\n\t\t\t\t\t\t// Log but don't throw - the lock will be auto-released when connection closes\n\t\t\t\t\t\tlogger?.debug('Failed to explicitly release advisory lock (will auto-release on disconnect):', unlockError);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\n\t\t\tlogger?.debug('Completed DB schema initialization for queue storage driver');\n\n\t\t\treturn(true);\n\t\t})();\n\n\t\tawait this.dbInitializationPromise;\n\n\t\treturn(pool);\n\t}\n\n\tprivate methodLogger(method: string): Logger | undefined {\n\t\treturn(MethodLogger(this.logger, {\n\t\t\tclass: 'KeetaAnchorQueueStorageDriverPostgres',\n\t\t\tfile: 'src/lib/queue/drivers/queue_postgres.ts',\n\t\t\tmethod: method,\n\t\t\tinstanceID: this.id\n\t\t}));\n\t}\n\n\tprivate async runWithRetry<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst logger = this.methodLogger('runWithRetry');\n\n\t\tlet lastError: unknown;\n\t\tfor (let retry = 0; retry < 16; retry++) {\n\t\t\tif (this.poolInternal === null) {\n\t\t\t\tthis.methodLogger('runWithRetry')?.debug('Aborting DB operation retries because the instance was destroyed');\n\n\t\t\t\tif (lastError !== undefined) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/only-throw-error\n\t\t\t\t\tthrow(lastError);\n\t\t\t\t}\n\t\t\t\tthrow(new Error('Aborting because the instance was destroyed'));\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn(await fn());\n\t\t\t} catch (error: unknown) {\n\t\t\t\tlastError = error;\n\n\t\t\t\tlet detectedRetryableError = false;\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst errorCode = 'code' in error ? error.code : null;\n\t\t\t\t\tif (errorCode === '40001' || errorCode === '40P01') {\n\t\t\t\t\t\t// Track serialization retries for instrumentation\n\t\t\t\t\t\tthis.serializationRetryCount++;\n\n\t\t\t\t\t\tdetectedRetryableError = true;\n\t\t\t\t\t\tlogger?.debug('Detected retryable error with code', errorCode);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (detectedRetryableError) {\n\t\t\t\t\tconst minBackoff = 100;\n\t\t\t\t\tconst maxBackoff = 30_000;\n\t\t\t\t\tconst backoffIntervalSize = Math.min(maxBackoff - minBackoff, (retry + 50) ** 2);\n\t\t\t\t\tconst backoff = Math.round((Math.random() * backoffIntervalSize)) + minBackoff;\n\n\t\t\t\t\tthis.methodLogger('runWithRetry')?.debug(`Retrying DB operation in ${backoff}ms (retry #${retry}) from`, new Error().stack);\n\t\t\t\t\tawait asleep(backoff);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthrow(error);\n\t\t\t}\n\t\t}\n\t\tthrow(lastError);\n\t}\n\n\tprivate async newDBConnection(): Promise<pg.Pool> {\n\t\tif (this.poolInternal === null) {\n\t\t\tthrow(new Error('Database connection is not available'));\n\t\t}\n\n\t\treturn(await this.runWithRetry(async () => {\n\t\t\tif (this.poolInternal === null) {\n\t\t\t\tthrow(new Error('Database connection is not available'));\n\t\t\t}\n\n\t\t\tthis.methodLogger('newDBConnection')?.debug('Getting DB pool');\n\t\t\tconst pool = await this.poolInternal();\n\n\t\t\treturn(await this.initializeDBConnection(pool));\n\t\t}));\n\t}\n\n\tprivate async dbTransaction<T>(className: string, fn: (client: pg.PoolClient, logger: Logger | undefined) => Promise<T>): Promise<T> {\n\t\tconst pool = await this.newDBConnection();\n\t\tconst logger = this.methodLogger(className);\n\n\t\tconst debugForceIndexScan = this.debugForceIndexScan;\n\n\t\tconst result = await this.runWithRetry(async function() {\n\t\t\tconst client = await pool.connect();\n\n\t\t\ttry {\n\t\t\t\tlogger?.debug('Starting DB transaction');\n\t\t\t\tawait client.query('BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED');\n\t\t\t\tlogger?.debug('DB transaction started');\n\n\t\t\t\tif (debugForceIndexScan) {\n\t\t\t\t\tawait client.query('SET LOCAL enable_seqscan TO off');\n\t\t\t\t}\n\n\t\t\t\tconst retval = await fn(client, logger);\n\n\t\t\t\tlogger?.debug('Committing DB transaction');\n\t\t\t\tawait client.query('COMMIT');\n\t\t\t\tlogger?.debug('DB transaction committed');\n\n\t\t\t\treturn(retval);\n\t\t\t} catch (error: unknown) {\n\t\t\t\ttry {\n\t\t\t\t\tlogger?.debug('Rolling back DB transaction due to error:', error);\n\t\t\t\t\tawait client.query('ROLLBACK');\n\t\t\t\t\tlogger?.debug('DB transaction rolled back');\n\t\t\t\t} catch {\n\t\t\t\t\tlogger?.debug('Error rolling back DB transaction !!');\n\t\t\t\t}\n\t\t\t\tthrow(error);\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t});\n\n\t\treturn(result);\n\t}\n\n\tasync add(request: KeetaAnchorQueueRequest<QueueRequest>, info?: KeetaAnchorQueueEntryExtra): Promise<KeetaAnchorQueueRequestID> {\n\t\treturn(await this.dbTransaction('add', async (client, logger): Promise<KeetaAnchorQueueRequestID> => {\n\t\t\tlet entryID = ConvertStringToRequestID(info?.id);\n\t\t\tentryID ??= ConvertStringToRequestID(crypto.randomUUID());\n\n\t\t\tlogger?.debug(`Enqueuing request with id ${String(entryID)}`);\n\n\t\t\tconst currentTime = Date.now();\n\t\t\tconst requestJSON = JSON.stringify(request);\n\n\t\t\t/**\n\t\t\t * The status to use for the new entry\n\t\t\t */\n\t\t\tconst status = info?.status ?? 'pending';\n\n\n\t\t\tconst insertedEntry = await client.query<{ id: string }>(`\n\t\t\t\tINSERT INTO ${this.tableNameEntries} (\n\t\t\t\t\tid, path, request, output, last_error, status,\n\t\t\t\t\tcreated, updated, worker, failures\n\t\t\t\t) VALUES ($1, $2, $3, NULL, NULL, $4, $5, $6, NULL, 0)\n\t\t\t\tON CONFLICT (id, path) DO NOTHING\n\t\t\t\tRETURNING id`,\n\t\t\t[entryID, this.pathStr, requestJSON, status, currentTime, currentTime]);\n\n\t\t\tif (insertedEntry.rows.length === 0) {\n\t\t\t\tlogger?.debug(`Request with id ${String(entryID)} already exists, ignoring`);\n\t\t\t\treturn(entryID);\n\t\t\t}\n\n\t\t\tawait this.toctouDelay?.();\n\n\t\t\tconst idempotentIDs = info?.idempotentKeys;\n\t\t\tif (idempotentIDs && idempotentIDs.size > 0) {\n\t\t\t\tconst keys = Array.from(idempotentIDs);\n\n\t\t\t\tconst insertedKeys = await client.query<{ idempotent_id: string }>(`\n\t\t\t\t\tINSERT INTO ${this.tableNameIdempotentKeys}(entry_id, path, idempotent_id)\n\t\t\t\t\tSELECT $1, $2, unnest($3::text[])\n\t\t\t\t\tON CONFLICT (idempotent_id, path) DO NOTHING\n\t\t\t\t\tRETURNING idempotent_id`,\n\t\t\t\t[entryID, this.pathStr, keys]);\n\n\t\t\t\tconst foundKeySet = new Set(keys);\n\t\t\t\tfor (const row of insertedKeys.rows) {\n\t\t\t\t\tfoundKeySet.delete(ConvertStringToRequestID(row.idempotent_id));\n\t\t\t\t}\n\n\t\t\t\tif (insertedKeys.rows.length !== keys.length) {\n\t\t\t\t\tthrow(new Errors.IdempotentExistsError('One or more idempotent entries already exist in the queue', foundKeySet));\n\t\t\t\t}\n\n\t\t\t\tawait this.toctouDelay?.();\n\t\t\t}\n\n\t\t\treturn(entryID);\n\t\t}));\n\t}\n\n\tasync setStatus(id: KeetaAnchorQueueRequestID, status: KeetaAnchorQueueStatus, ancillary?: KeetaAnchorQueueEntryAncillaryData<QueueResult>): Promise<void> {\n\t\tconst { oldStatus } = ancillary ?? {};\n\n\t\treturn(await this.dbTransaction('setStatus', async (client, logger): Promise<void> => {\n\t\t\tconst existingEntry = await client.query<{ status: KeetaAnchorQueueStatus; failures: number; last_error: string | null; output: string | null }>(`SELECT status, failures, last_error, output FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2 FOR UPDATE`, [id, this.pathStr]);\n\t\t\tif (existingEntry.rows.length === 0) {\n\t\t\t\tthrow(new Error(`Request with ID ${String(id)} not found`));\n\t\t\t}\n\n\t\t\tawait this.toctouDelay?.();\n\n\t\t\tconst currentEntry = existingEntry.rows[0];\n\t\t\tif (!currentEntry) {\n\t\t\t\tthrow(new Error(`Request with ID ${String(id)} not found`));\n\t\t\t}\n\n\t\t\tconst newEntry = ManageStatusUpdates<QueueResult>(id, currentEntry, status, ancillary, logger);\n\t\t\tconst currentTime = newEntry.updated.getTime();\n\t\t\tconst workerValue = newEntry.worker;\n\t\t\tconst newFailures = newEntry.failures ?? currentEntry.failures;\n\t\t\tconst newLastError = newEntry.lastError !== undefined ? newEntry.lastError : currentEntry.last_error;\n\t\t\tconst newOutput = newEntry.output !== undefined ? JSON.stringify(newEntry.output) : currentEntry.output;\n\n\t\t\tlet updateQuery: string;\n\t\t\tlet updateParams: (KeetaAnchorQueueRequestID | string | number | null)[];\n\n\t\t\tif (oldStatus) {\n\t\t\t\tupdateQuery = `UPDATE ${this.tableNameEntries}\n\t\t\t\t SET status = $1, updated = $2, worker = $3, failures = $4, last_error = $5, output = $6\n\t\t\t\t WHERE id = $7 AND path = $8 AND status = $9`;\n\t\t\t\tupdateParams = [status, currentTime, workerValue, newFailures, newLastError, newOutput, id, this.pathStr, oldStatus];\n\t\t\t} else {\n\t\t\t\tupdateQuery = `UPDATE ${this.tableNameEntries}\n\t\t\t\t SET status = $1, updated = $2, worker = $3, failures = $4, last_error = $5, output = $6\n\t\t\t\t WHERE id = $7 AND path = $8`;\n\t\t\t\tupdateParams = [status, currentTime, workerValue, newFailures, newLastError, newOutput, id, this.pathStr];\n\t\t\t}\n\n\t\t\tconst result = await client.query(updateQuery, updateParams);\n\n\t\t\tawait this.toctouDelay?.();\n\n\t\t\tif (oldStatus && result.rowCount === 0) {\n\t\t\t\tconst currentEntry = await client.query<{ status: KeetaAnchorQueueStatus }>(`SELECT status FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2`, [id, this.pathStr]);\n\t\t\t\tconst currentStatus = currentEntry.rows[0]?.status;\n\t\t\t\tif (currentEntry.rows.length > 0) {\n\t\t\t\t\tif (currentStatus === undefined) {\n\t\t\t\t\t\tthrow(new Error(`internal error: could not retrieve current status for request with ID ${String(id)}`));\n\t\t\t\t\t}\n\t\t\t\t\tthrow(new Errors.IncorrectStateAssertedError(id, oldStatus, currentStatus));\n\t\t\t\t} else {\n\t\t\t\t\tthrow(new Error(`Request with ID ${String(id)} not found`));\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t}\n\n\tasync get(id: KeetaAnchorQueueRequestID): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult> | null> {\n\t\treturn(await this.dbTransaction('get', async (client): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult> | null> => {\n\t\t\tconst row = await client.query<QueueEntryRow>(\n\t\t\t\t`SELECT id, request, output, last_error, status, created, updated, worker, failures\n\t\t\t\t FROM ${this.tableNameEntries} WHERE id = $1 AND path = $2`,\n\t\t\t\t[id, this.pathStr]\n\t\t\t);\n\n\t\t\tif (row.rows.length === 0) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst entry = row.rows[0];\n\t\t\tif (!entry) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst idempotentRows = await client.query<IdempotentRow>(\n\t\t\t\t`SELECT idempotent_id FROM ${this.tableNameIdempotentKeys} WHERE entry_id = $1 AND path = $2`,\n\t\t\t\t[id, this.pathStr]\n\t\t\t);\n\n\t\t\tconst idempotentKeys = idempotentRows.rows.length > 0\n\t\t\t\t? new Set(idempotentRows.rows.map(function(idempotentRow: IdempotentRow) {\n\t\t\t\t\treturn(ConvertStringToRequestID(idempotentRow.idempotent_id));\n\t\t\t\t}))\n\t\t\t\t: undefined;\n\n\t\t\treturn({\n\t\t\t\tid: ConvertStringToRequestID(entry.id),\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\trequest: JSON.parse(entry.request) as QueueRequest,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\toutput: entry.output ? JSON.parse(entry.output) as QueueResult : null,\n\t\t\t\tlastError: entry.last_error,\n\t\t\t\tstatus: entry.status,\n\t\t\t\tcreated: new Date(Number(entry.created)),\n\t\t\t\tupdated: new Date(Number(entry.updated)),\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tworker: entry.worker as unknown as KeetaAnchorQueueWorkerID | null,\n\t\t\t\tfailures: entry.failures,\n\t\t\t\tidempotentKeys: idempotentKeys\n\t\t\t});\n\t\t}));\n\t}\n\n\tasync query(filter?: KeetaAnchorQueueFilter): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult>[]> {\n\t\treturn(await this.dbTransaction('query', async (client, logger): Promise<KeetaAnchorQueueEntry<QueueRequest, QueueResult>[]> => {\n\t\t\tlogger?.debug(`Querying queue with id ${this.id} with filter:`, filter);\n\n\t\t\tconst conditions: string[] = [];\n\t\t\tconst params: (string | number)[] = [];\n\t\t\tlet paramIndex = 1;\n\n\t\t\tconditions.push(`path = $${paramIndex++}`);\n\t\t\tparams.push(this.pathStr);\n\n\t\t\tif (filter?.status) {\n\t\t\t\tconditions.push(`status = $${paramIndex++}`);\n\t\t\t\tparams.push(filter.status);\n\t\t\t}\n\n\t\t\tif (filter?.updatedBefore) {\n\t\t\t\tconditions.push(`updated < $${paramIndex++}`);\n\t\t\t\tparams.push(filter.updatedBefore.getTime());\n\t\t\t}\n\n\t\t\tlet query = `SELECT id, request, output, last_error, status, created, updated, worker, failures FROM ${this.tableNameEntries}`;\n\n\t\t\tif (conditions.length > 0) {\n\t\t\t\tquery += ' WHERE ' + conditions.join(' AND ');\n\t\t\t}\n\n\t\t\t// Use random ordering to prevent multiple workers from contending for the same rows\n\t\t\t// This spreads the load when multiple workers query simultaneously\n\t\t\tquery += ' ORDER BY RANDOM()';\n\n\t\t\tif (filter?.limit !== undefined) {\n\t\t\t\tquery += ` LIMIT $${paramIndex++}`;\n\t\t\t\tparams.push(filter.limit);\n\t\t\t}\n\n\t\t\tconst rows = await client.query<QueueEntryRow>(query, params);\n\n\t\t\tconst entries: KeetaAnchorQueueEntry<QueueRequest, QueueResult>[] = [];\n\n\t\t\tfor (const row of rows.rows) {\n\t\t\t\tconst idempotentRows = await client.query<IdempotentRow>(\n\t\t\t\t\t`SELECT idempotent_id FROM ${this.tableNameIdempotentKeys} WHERE entry_id = $1 AND path = $2`,\n\t\t\t\t\t[row.id, this.pathStr]\n\t\t\t\t);\n\n\t\t\t\tconst idempotentKeys = idempotentRows.rows.length > 0\n\t\t\t\t\t? new Set(idempotentRows.rows.map(function(idempotentRow: IdempotentRow) {\n\t\t\t\t\t\treturn(ConvertStringToRequestID(idempotentRow.idempotent_id));\n\t\t\t\t\t}))\n\t\t\t\t\t: undefined;\n\n\t\t\t\tentries.push({\n\t\t\t\t\tid: ConvertStringToRequestID(row.id),\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\trequest: JSON.parse(row.request) as QueueRequest,\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\toutput: row.output ? JSON.parse(row.output) as QueueResult : null,\n\t\t\t\t\tlastError: row.last_error,\n\t\t\t\t\tstatus: row.status,\n\t\t\t\t\tcreated: new Date(Number(row.created)),\n\t\t\t\t\tupdated: new Date(Number(row.updated)),\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\tworker: row.worker as unknown as KeetaAnchorQueueWorkerID | null,\n\t\t\t\t\tfailures: row.failures,\n\t\t\t\t\tidempotentKeys: idempotentKeys\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger?.debug(`Queried queue with id ${this.id} with filter:`, filter, '-- found', entries.length, 'entries');\n\n\t\t\treturn(entries);\n\t\t}));\n\t}\n\n\tasync partition(path: string) : Promise<KeetaAnchorQueueStorageDriver<QueueRequest, QueueResult>> {\n\t\tthis.methodLogger('partition')?.debug(`Creating partitioned queue storage driver for path: ${path}`);\n\n\t\tif (this.poolInternal === null) {\n\t\t\tthrow(new Error('Asked to partition but the instance has been destroyed'));\n\t\t}\n\n\t\tconst retval = new KeetaAnchorQueueStorageDriverPostgres<QueueRequest, QueueResult>({\n\t\t\tid: `${this.id}::${path}`,\n\t\t\tlogger: this.logger,\n\t\t\tpool: this.poolInternal,\n\t\t\tpath: [...this.path, path],\n\t\t\ttablePrefix: this.tablePrefix\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tthis.methodLogger('destroy')?.debug('Destroying instance');\n\n\t\tthis.poolInternal = null;\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\treturn(await this.destroy());\n\t}\n\n\t/** @internal */\n\t_Testing(key: string): {\n\t\tsetToctouDelay(delay: number): void;\n\t\tunsetToctouDelay(): void;\n\t\tgetSerializationRetryCount(): number;\n\t\tresetSerializationRetryCount(): void;\n\t\tenableDebugForceIndexScan(): void;\n\t\tdisableDebugForceIndexScan(): void;\n\t} {\n\t\tif (key !== 'bc81abf8-e43b-490b-b486-744fb49a5082') {\n\t\t\tthrow(new Error('This is a testing only method'));\n\t\t}\n\n\t\treturn({\n\t\t\tsetToctouDelay: (delay: number): void => {\n\t\t\t\tthis.toctouDelay = async (): Promise<void> => {\n\t\t\t\t\treturn(await asleep(delay));\n\t\t\t\t};\n\t\t\t},\n\t\t\tunsetToctouDelay: (): void => {\n\t\t\t\tthis.toctouDelay = undefined;\n\t\t\t},\n\t\t\tgetSerializationRetryCount: (): number => {\n\t\t\t\treturn(this.serializationRetryCount);\n\t\t\t},\n\t\t\tresetSerializationRetryCount: (): void => {\n\t\t\t\tthis.serializationRetryCount = 0;\n\t\t\t},\n\t\t\tenableDebugForceIndexScan: (): void => {\n\t\t\t\tthis.debugForceIndexScan = true;\n\t\t\t},\n\t\t\tdisableDebugForceIndexScan: (): void => {\n\t\t\t\tthis.debugForceIndexScan = false;\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
|
package/lib/resolver.d.ts
CHANGED
|
@@ -458,6 +458,10 @@ type ResolverConfig = {
|
|
|
458
458
|
* Caching Parameters
|
|
459
459
|
*/
|
|
460
460
|
cache?: Omit<NonNullable<MetadataConfig['cache']>, 'instance'>;
|
|
461
|
+
/**
|
|
462
|
+
* Additional configuration for reading metadata
|
|
463
|
+
*/
|
|
464
|
+
metadataConfig?: Pick<MetadataConfig, 'allowInsecureProtocols'>;
|
|
461
465
|
};
|
|
462
466
|
type MetadataConfig = {
|
|
463
467
|
trustedCAs: ResolverConfig['trustedCAs'];
|
|
@@ -470,6 +474,11 @@ type MetadataConfig = {
|
|
|
470
474
|
negativeTTL?: number;
|
|
471
475
|
};
|
|
472
476
|
parent?: Metadata;
|
|
477
|
+
/**
|
|
478
|
+
* Flag indicating if the resolver should read from insecure protocols (ex: http)
|
|
479
|
+
* Defaults to false
|
|
480
|
+
*/
|
|
481
|
+
allowInsecureProtocols?: boolean;
|
|
473
482
|
};
|
|
474
483
|
type ValuizableInstance = {
|
|
475
484
|
value: ValuizableMethod;
|
package/lib/resolver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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"}
|
package/lib/resolver.js
CHANGED
|
@@ -6327,6 +6327,7 @@ class Metadata {
|
|
|
6327
6327
|
#url;
|
|
6328
6328
|
#resolver;
|
|
6329
6329
|
#stats;
|
|
6330
|
+
#allowInsecureProtocols;
|
|
6330
6331
|
seenURLs;
|
|
6331
6332
|
static instanceTypeID = 'Metadata:c85b3d67-9548-4042-9862-f6e6677690ac';
|
|
6332
6333
|
static isInstance(value) {
|
|
@@ -6462,6 +6463,7 @@ class Metadata {
|
|
|
6462
6463
|
this.#client = config.client;
|
|
6463
6464
|
this.#logger = config.logger;
|
|
6464
6465
|
this.#resolver = config.resolver;
|
|
6466
|
+
this.#allowInsecureProtocols = config.allowInsecureProtocols ?? false;
|
|
6465
6467
|
this.#stats = this.#resolver._mutableStats(statsAccessToken);
|
|
6466
6468
|
if (config.parent !== undefined) {
|
|
6467
6469
|
this.seenURLs = config.parent.seenURLs;
|
|
@@ -6587,7 +6589,7 @@ class Metadata {
|
|
|
6587
6589
|
if (protocol === 'keetanet:') {
|
|
6588
6590
|
retval = await this.readKeetaNetURL(url);
|
|
6589
6591
|
}
|
|
6590
|
-
else if (protocol === 'https:') {
|
|
6592
|
+
else if (protocol === 'https:' || (protocol === 'http:' && this.#allowInsecureProtocols)) {
|
|
6591
6593
|
retval = await this.readHTTPSURL(url);
|
|
6592
6594
|
}
|
|
6593
6595
|
else {
|
|
@@ -6698,6 +6700,7 @@ class Metadata {
|
|
|
6698
6700
|
logger: this.#logger,
|
|
6699
6701
|
resolver: this.#resolver,
|
|
6700
6702
|
cache: this.#cache,
|
|
6703
|
+
allowInsecureProtocols: this.#allowInsecureProtocols,
|
|
6701
6704
|
parent: this
|
|
6702
6705
|
});
|
|
6703
6706
|
const newValuizableObject = newMetadataObject.value.bind(newMetadataObject);
|
|
@@ -6750,6 +6753,7 @@ class Resolver {
|
|
|
6750
6753
|
#logger;
|
|
6751
6754
|
#stats;
|
|
6752
6755
|
#metadataCache;
|
|
6756
|
+
#metadataConfig;
|
|
6753
6757
|
id;
|
|
6754
6758
|
static Metadata = Metadata;
|
|
6755
6759
|
lookupMap = {
|
|
@@ -6789,6 +6793,7 @@ class Resolver {
|
|
|
6789
6793
|
...config.cache,
|
|
6790
6794
|
instance: new Map()
|
|
6791
6795
|
};
|
|
6796
|
+
this.#metadataConfig = config.metadataConfig;
|
|
6792
6797
|
this.id = config.id ?? crypto.randomUUID();
|
|
6793
6798
|
const rootAccountStrings = this.#roots.map(root => root.publicKeyString.get()).join(', ');
|
|
6794
6799
|
this.#logger?.debug(`Resolver:${this.id}`, 'Creating resolver with root account(s)', rootAccountStrings);
|
|
@@ -7284,6 +7289,7 @@ class Resolver {
|
|
|
7284
7289
|
for (const root of this.#roots) {
|
|
7285
7290
|
const rootURL = new URL(`keetanet://${root.publicKeyString.get()}/metadata`);
|
|
7286
7291
|
const metadata = new Metadata(rootURL, {
|
|
7292
|
+
...this.#metadataConfig,
|
|
7287
7293
|
trustedCAs: this.#trustedCAs,
|
|
7288
7294
|
client: this.#client,
|
|
7289
7295
|
logger: this.#logger,
|