@neofinancial/chrono-mongo-datastore 0.3.0 → 0.4.0
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.
|
@@ -22,8 +22,20 @@ export type TaskDocument<TaskKind, TaskData> = WithId<Omit<Task<TaskKind, TaskDa
|
|
|
22
22
|
export declare class ChronoMongoDatastore<TaskMapping extends TaskMappingBase> implements Datastore<TaskMapping, MongoDatastoreOptions> {
|
|
23
23
|
private config;
|
|
24
24
|
private database;
|
|
25
|
-
private
|
|
26
|
-
|
|
25
|
+
private databaseResolvers;
|
|
26
|
+
constructor(config?: Partial<ChronoMongoDatastoreConfig>);
|
|
27
|
+
/**
|
|
28
|
+
* Sets the database connection for the datastore. Ensures that the indexes are created and resolves any pending promises waiting for the database.
|
|
29
|
+
*
|
|
30
|
+
* @param database - The database to set.
|
|
31
|
+
*/
|
|
32
|
+
initialize(database: Db): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Asyncronously gets the database connection for the datastore. If the database is not set, it will return a promise that resolves when the database is set.
|
|
35
|
+
*
|
|
36
|
+
* @returns The database connection.
|
|
37
|
+
*/
|
|
38
|
+
getDatabase(): Promise<Db>;
|
|
27
39
|
schedule<TaskKind extends keyof TaskMapping>(input: ScheduleInput<TaskKind, TaskMapping[TaskKind], MongoDatastoreOptions>): Promise<Task<TaskKind, TaskMapping[TaskKind]>>;
|
|
28
40
|
delete<TaskKind extends Extract<keyof TaskMapping, string>>(key: DeleteInput<TaskKind>, options?: DeleteOptions): Promise<Task<TaskKind, TaskMapping[TaskKind]> | undefined>;
|
|
29
41
|
claim<TaskKind extends Extract<keyof TaskMapping, string>>(input: ClaimTaskInput<TaskKind>): Promise<Task<TaskKind, TaskMapping[TaskKind]> | undefined>;
|
|
@@ -8,19 +8,43 @@ const DEFAULT_COLLECTION_NAME = 'chrono-tasks';
|
|
|
8
8
|
class ChronoMongoDatastore {
|
|
9
9
|
config;
|
|
10
10
|
database;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
databaseResolvers = [];
|
|
12
|
+
constructor(config) {
|
|
13
13
|
this.config = {
|
|
14
14
|
completedDocumentTTLSeconds: config?.completedDocumentTTLSeconds,
|
|
15
15
|
collectionName: config?.collectionName || DEFAULT_COLLECTION_NAME,
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Sets the database connection for the datastore. Ensures that the indexes are created and resolves any pending promises waiting for the database.
|
|
20
|
+
*
|
|
21
|
+
* @param database - The database to set.
|
|
22
|
+
*/
|
|
23
|
+
async initialize(database) {
|
|
24
|
+
if (this.database) {
|
|
25
|
+
throw new Error('Database connection already set');
|
|
26
|
+
}
|
|
27
|
+
await (0, mongo_indexes_1.ensureIndexes)(database.collection(this.config.collectionName), {
|
|
28
|
+
expireAfterSeconds: this.config.completedDocumentTTLSeconds,
|
|
29
|
+
});
|
|
30
|
+
this.database = database;
|
|
31
|
+
const resolvers = this.databaseResolvers.splice(0);
|
|
32
|
+
for (const resolve of resolvers) {
|
|
33
|
+
resolve(database);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Asyncronously gets the database connection for the datastore. If the database is not set, it will return a promise that resolves when the database is set.
|
|
38
|
+
*
|
|
39
|
+
* @returns The database connection.
|
|
40
|
+
*/
|
|
41
|
+
async getDatabase() {
|
|
42
|
+
if (this.database) {
|
|
43
|
+
return this.database;
|
|
44
|
+
}
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
this.databaseResolvers.push(resolve);
|
|
22
47
|
});
|
|
23
|
-
return datastore;
|
|
24
48
|
}
|
|
25
49
|
async schedule(input) {
|
|
26
50
|
const createInput = {
|
|
@@ -34,7 +58,8 @@ class ChronoMongoDatastore {
|
|
|
34
58
|
retryCount: 0,
|
|
35
59
|
};
|
|
36
60
|
try {
|
|
37
|
-
const
|
|
61
|
+
const database = await this.getDatabase();
|
|
62
|
+
const results = await database.collection(this.config.collectionName).insertOne(createInput, {
|
|
38
63
|
...(input?.datastoreOptions?.session ? { session: input.datastoreOptions.session } : undefined),
|
|
39
64
|
ignoreUndefined: true,
|
|
40
65
|
});
|
|
@@ -47,7 +72,8 @@ class ChronoMongoDatastore {
|
|
|
47
72
|
error instanceof Error &&
|
|
48
73
|
'code' in error &&
|
|
49
74
|
(error.code === 11000 || error.code === 11001)) {
|
|
50
|
-
const
|
|
75
|
+
const collection = await this.collection();
|
|
76
|
+
const existingTask = await collection.findOne({
|
|
51
77
|
idempotencyKey: input.idempotencyKey,
|
|
52
78
|
}, {
|
|
53
79
|
hint: mongo_indexes_1.IndexNames.IDEMPOTENCY_KEY_INDEX,
|
|
@@ -64,7 +90,8 @@ class ChronoMongoDatastore {
|
|
|
64
90
|
}
|
|
65
91
|
async delete(key, options) {
|
|
66
92
|
const filter = typeof key === 'string' ? { _id: new mongodb_1.ObjectId(key) } : { kind: key.kind, idempotencyKey: key.idempotencyKey };
|
|
67
|
-
const
|
|
93
|
+
const collection = await this.collection();
|
|
94
|
+
const task = await collection.findOneAndDelete({
|
|
68
95
|
...filter,
|
|
69
96
|
...(options?.force ? {} : { status: chrono_1.TaskStatus.PENDING }),
|
|
70
97
|
});
|
|
@@ -81,7 +108,8 @@ class ChronoMongoDatastore {
|
|
|
81
108
|
}
|
|
82
109
|
async claim(input) {
|
|
83
110
|
const now = new Date();
|
|
84
|
-
const
|
|
111
|
+
const collection = await this.collection();
|
|
112
|
+
const task = await collection.findOneAndUpdate({
|
|
85
113
|
kind: input.kind,
|
|
86
114
|
scheduledAt: { $lte: now },
|
|
87
115
|
$or: [
|
|
@@ -134,7 +162,8 @@ class ChronoMongoDatastore {
|
|
|
134
162
|
return this.toObject(task);
|
|
135
163
|
}
|
|
136
164
|
async updateOrThrow(taskId, update) {
|
|
137
|
-
const
|
|
165
|
+
const collection = await this.collection();
|
|
166
|
+
const document = await collection.findOneAndUpdate({ _id: new mongodb_1.ObjectId(taskId) }, update, {
|
|
138
167
|
returnDocument: 'after',
|
|
139
168
|
});
|
|
140
169
|
if (!document) {
|
|
@@ -142,8 +171,9 @@ class ChronoMongoDatastore {
|
|
|
142
171
|
}
|
|
143
172
|
return document;
|
|
144
173
|
}
|
|
145
|
-
collection() {
|
|
146
|
-
|
|
174
|
+
async collection() {
|
|
175
|
+
const database = await this.getDatabase();
|
|
176
|
+
return database.collection(this.config.collectionName);
|
|
147
177
|
}
|
|
148
178
|
toObject(document) {
|
|
149
179
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrono-mongo-datastore.js","sourceRoot":"","sources":["../src/chrono-mongo-datastore.ts"],"names":[],"mappings":";;;AAAA,iDAS8B;AAC9B,qCAQiB;AACjB,mDAA4D;AAE5D,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAyB/C,MAAa,oBAAoB;IAGvB,MAAM,CAA6B;IACnC,QAAQ,
|
|
1
|
+
{"version":3,"file":"chrono-mongo-datastore.js","sourceRoot":"","sources":["../src/chrono-mongo-datastore.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neofinancial/chrono-mongo-datastore",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "MongoDB datastore implementation for Chrono task scheduling system",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"mongodb": "^6",
|
|
25
25
|
"mongodb-memory-server": "^10.1.4",
|
|
26
|
-
"@neofinancial/chrono": "0.
|
|
26
|
+
"@neofinancial/chrono": "0.4.0"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"mongodb": "^6",
|
|
30
|
-
"@neofinancial/chrono": "0.
|
|
30
|
+
"@neofinancial/chrono": "0.4.0"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"clean": "rimraf ./build",
|