@runko/persist-mongo 0.1.1 → 0.2.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.
- package/README.md +44 -4
- package/dist/index.cjs +642 -21
- package/dist/index.d.cts +129 -4
- package/dist/index.d.ts +129 -4
- package/dist/index.js +636 -22
- package/package.json +17 -17
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { Persistence } from "@runko/agent";
|
|
1
|
+
import { Arbitration, NodeRegistry, Persistence } from "@runko/agent";
|
|
2
2
|
import { Db } from "mongodb";
|
|
3
3
|
import { JsonValue } from "@runko/core";
|
|
4
4
|
//#region src/collections.d.ts
|
|
5
5
|
declare const LEDGER_COLLECTION = "agent_ledger";
|
|
6
6
|
declare const DECISIONS_COLLECTION = "agent_decisions";
|
|
7
7
|
declare const QUEUE_COLLECTION = "agent_queue";
|
|
8
|
+
declare const LEASES_COLLECTION = "agent_leases";
|
|
9
|
+
declare const NODES_COLLECTION = "agent_nodes";
|
|
10
|
+
declare const TAILS_COLLECTION = "agent_tool_tails";
|
|
8
11
|
/**
|
|
9
12
|
* [账本](../../../docs/terms.md)文档。
|
|
10
13
|
*
|
|
@@ -34,6 +37,46 @@ interface DecisionDoc {
|
|
|
34
37
|
requestedAt: number;
|
|
35
38
|
decidedAt: number | null;
|
|
36
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* [租约](../../../docs/terms.md)文档——一个会话一条,**`_id` 就是会话 id**。
|
|
42
|
+
*
|
|
43
|
+
* 唯一性于是由 `_id` 白送(不用额外建唯一索引),而且每一次读写都是按 `_id` 的点查,
|
|
44
|
+
* 这正是 Mongo 最快的那条路。
|
|
45
|
+
*
|
|
46
|
+
* **字段名跟着本包走驼峰,不跟 SQL 表的下划线。** 它与 `agent_leases` 表一一对应
|
|
47
|
+
* ([技术方案 §4.2](../../../docs/host/node/tech/multi-replica.md)),但同一个 database 里
|
|
48
|
+
* 另外三个集合都是驼峰,为了「对齐一张永远不会跟它 join 的表」把这一个写成下划线,
|
|
49
|
+
* 只会让用 Compass 翻库的人多一次愣神。
|
|
50
|
+
*/
|
|
51
|
+
interface LeaseDoc {
|
|
52
|
+
/** = `conversationId`。 */
|
|
53
|
+
_id: string;
|
|
54
|
+
/** 当前持有者(不透明字符串)。`null` = 没人持有。 */
|
|
55
|
+
holder: string | null;
|
|
56
|
+
/** 一次租期的唯一标识([租期标识](../../../docs/terms.md))。`null` = 没人持有。 */
|
|
57
|
+
leaseToken: string | null;
|
|
58
|
+
/**
|
|
59
|
+
* [账本](../../../docs/terms.md)水位,**跨释放保留**——下次抢占才不用回账本重新问。
|
|
60
|
+
* `null` = **还没播种**:这份文档是 `markAwaitingTakeover` 在会话从没被真正 `acquire`
|
|
61
|
+
* 过时垫出来的,`acquire()` 见到 `null` 要先调 `ctx.seedSeq()` 播种,不能当成合法的 0。
|
|
62
|
+
*/
|
|
63
|
+
seqWatermark: number | null;
|
|
64
|
+
/** 最后一次心跳写进来的时刻。别的副本判它死活看的就是这个值。 */
|
|
65
|
+
heartbeatAt: number;
|
|
66
|
+
/** 这次租期是什么时候抢到的。只用于排障,不参与任何判断。 */
|
|
67
|
+
acquiredAt: number;
|
|
68
|
+
/**
|
|
69
|
+
* [交接预留](../../../docs/terms.md):预留给哪个节点。`null` = 没有预留。**直接放在
|
|
70
|
+
* 租约文档上**(跟 SQL 那几家不同,那边独立建了一张 `agent_handover`)——Mongo 里
|
|
71
|
+
* 这是同一份文档,`findOneAndUpdate` 一次 CAS 就能把「放手」与「写预留」焊在一起,
|
|
72
|
+
* 不需要像 SQL 那样开一个跨表事务。
|
|
73
|
+
*/
|
|
74
|
+
reservedFor: string | null;
|
|
75
|
+
/** 预留截止时刻。`null` = 没有预留。过了这个时刻退化成「没人持有」。 */
|
|
76
|
+
reservedUntil: number | null;
|
|
77
|
+
/** [待接手](../../../docs/terms.md)标记。 */
|
|
78
|
+
awaitingTakeover: boolean;
|
|
79
|
+
}
|
|
37
80
|
/** [待发队列](../../../docs/terms.md)文档。`_id` 直接用队列条目自己的 id。 */
|
|
38
81
|
interface QueueDoc {
|
|
39
82
|
_id: string;
|
|
@@ -43,6 +86,88 @@ interface QueueDoc {
|
|
|
43
86
|
input: JsonValue;
|
|
44
87
|
createdAt: number;
|
|
45
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* [节点登记表](../../../docs/terms.md)文档——`_id` 就是节点地址,唯一性由它白送。
|
|
91
|
+
* 与 SQL 那几家的字段名一一对应([技术方案 §7.1](../../../docs/logic/orchestration/tech/handover.md)),
|
|
92
|
+
* 只是驼峰换下划线。
|
|
93
|
+
*/
|
|
94
|
+
interface NodeDoc {
|
|
95
|
+
/** = 节点地址,同租约里的 `holder`。 */
|
|
96
|
+
_id: string;
|
|
97
|
+
/** [发布序号](../../../docs/terms.md):每次发布递增,回滚也递增。 */
|
|
98
|
+
releaseSeq: number;
|
|
99
|
+
/** `ready` | `leaving`。 */
|
|
100
|
+
state: string;
|
|
101
|
+
heartbeatAt: number;
|
|
102
|
+
startedAt: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* [工具收尾](../../../docs/terms.md)文档——[交权](../../../docs/terms.md)那一刻还在跑、
|
|
106
|
+
* 留在旧节点上跑完的那次调用。用 `conversationId` + `toolCallId` 一对唯一索引,
|
|
107
|
+
* 不用复合 `_id`(理由同 `LedgerDoc`)。
|
|
108
|
+
*/
|
|
109
|
+
interface ToolTailDoc {
|
|
110
|
+
conversationId: string;
|
|
111
|
+
toolCallId: string;
|
|
112
|
+
toolName: string;
|
|
113
|
+
/** 在哪个节点上收尾(同 `holder` 的值空间)。 */
|
|
114
|
+
runner: string;
|
|
115
|
+
startedAt: number;
|
|
116
|
+
/** 过了这个时刻还没有结果,持有者就把它记成「结果未知」。 */
|
|
117
|
+
deadline: number;
|
|
118
|
+
/** `TailOutcome`。`null` = 还在跑。**只在为空时写得进**。 */
|
|
119
|
+
outcome: JsonValue | null;
|
|
120
|
+
settledAt: number | null;
|
|
121
|
+
/** 持有者要求停止。 */
|
|
122
|
+
stopRequested: boolean;
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/arbitration.d.ts
|
|
126
|
+
/** 心跳间隔的默认值(毫秒)。与 SQL 那一档同款,定案见技术方案 §8.3。 */
|
|
127
|
+
declare const DEFAULT_HEARTBEAT_MS = 5000;
|
|
128
|
+
/** 超时接管阈值的默认值(毫秒)——12 个心跳。 */
|
|
129
|
+
declare const DEFAULT_TAKEOVER_MS = 60000;
|
|
130
|
+
interface MongoArbitrationOptions {
|
|
131
|
+
/**
|
|
132
|
+
* 这个副本的身份——**不透明字符串**(k8s pod 地址 / Fly machine id / 随便什么)。
|
|
133
|
+
* 框架存它、传它、**不解释它**:别人抢不到归属时会拿到它,由[接入层](../../../docs/terms.md)
|
|
134
|
+
* 决定把请求转给谁。**转发是宿主写的,不是框架做的。**
|
|
135
|
+
*/
|
|
136
|
+
holder: string;
|
|
137
|
+
/** 心跳间隔,默认 5 秒。 */
|
|
138
|
+
heartbeatMs?: number;
|
|
139
|
+
/** 多久没心跳算它死了,默认 60 秒。**必须 ≥ 3 × 心跳间隔**,否则构造时就抛。 */
|
|
140
|
+
takeoverMs?: number;
|
|
141
|
+
/** 让测试能控制时间;缺省 `Date.now`。 */
|
|
142
|
+
now?: () => number;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 建一个租约版归属仲裁机制。
|
|
146
|
+
*
|
|
147
|
+
* ```ts
|
|
148
|
+
* const arbitration = mongoArbitration(db, { holder: process.env.POD_NAME });
|
|
149
|
+
* createAgentRuntime({ ..., persistence: mongoPersistence(db), arbitration });
|
|
150
|
+
* ```
|
|
151
|
+
*
|
|
152
|
+
* **吃的是同一个 `Db`**——跟 `mongoPersistence(db)` 一样。`migrate(db)` 已经把租约集合要的
|
|
153
|
+
* 索引一起建了,不用再调别的。
|
|
154
|
+
*/
|
|
155
|
+
declare function mongoArbitration(db: Db, opts: MongoArbitrationOptions): Arbitration;
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/nodes.d.ts
|
|
158
|
+
interface MongoNodeRegistryOptions {
|
|
159
|
+
/** 让测试能控制时间;缺省 `Date.now`。 */
|
|
160
|
+
now?: () => number;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 建一个节点登记表。
|
|
164
|
+
*
|
|
165
|
+
* ```ts
|
|
166
|
+
* const registry = mongoNodeRegistry(db);
|
|
167
|
+
* await registry.register({ node: process.env.RUNKO_NODE_URL, releaseSeq: Number(process.env.RUNKO_RELEASE_SEQ) });
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
declare function mongoNodeRegistry(db: Db, opts?: MongoNodeRegistryOptions): NodeRegistry;
|
|
46
171
|
//#endregion
|
|
47
172
|
//#region src/migrate.d.ts
|
|
48
173
|
declare function migrate(db: Db): Promise<void>;
|
|
@@ -55,9 +180,9 @@ declare const RUNKO_PERSIST_MONGO_VERSION: "0.0.0";
|
|
|
55
180
|
* **吃 `Db` 而不是 `MongoClient`**:选哪个 database 是宿主的决定(多租户可能一租户
|
|
56
181
|
* 一个 db),连接的生命周期也归宿主管——本包不 connect、不 close。
|
|
57
182
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
183
|
+
* 四个集合固定叫 `agent_ledger` / `agent_decisions` / `agent_queue` / `agent_tool_tails`,
|
|
184
|
+
* 你自己的集合照常在同一个 db 里,互不干扰。
|
|
60
185
|
*/
|
|
61
186
|
declare function mongoPersistence(db: Db): Persistence;
|
|
62
187
|
//#endregion
|
|
63
|
-
export { DECISIONS_COLLECTION, type DecisionDoc, LEDGER_COLLECTION, type LedgerDoc, QUEUE_COLLECTION, type QueueDoc, RUNKO_PERSIST_MONGO_VERSION, migrate, mongoPersistence };
|
|
188
|
+
export { DECISIONS_COLLECTION, DEFAULT_HEARTBEAT_MS, DEFAULT_TAKEOVER_MS, type DecisionDoc, LEASES_COLLECTION, LEDGER_COLLECTION, type LeaseDoc, type LedgerDoc, type MongoArbitrationOptions, type MongoNodeRegistryOptions, NODES_COLLECTION, type NodeDoc, QUEUE_COLLECTION, type QueueDoc, RUNKO_PERSIST_MONGO_VERSION, TAILS_COLLECTION, type ToolTailDoc, migrate, mongoArbitration, mongoNodeRegistry, mongoPersistence };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { Persistence } from "@runko/agent";
|
|
1
|
+
import { Arbitration, NodeRegistry, Persistence } from "@runko/agent";
|
|
2
2
|
import { Db } from "mongodb";
|
|
3
3
|
import { JsonValue } from "@runko/core";
|
|
4
4
|
//#region src/collections.d.ts
|
|
5
5
|
declare const LEDGER_COLLECTION = "agent_ledger";
|
|
6
6
|
declare const DECISIONS_COLLECTION = "agent_decisions";
|
|
7
7
|
declare const QUEUE_COLLECTION = "agent_queue";
|
|
8
|
+
declare const LEASES_COLLECTION = "agent_leases";
|
|
9
|
+
declare const NODES_COLLECTION = "agent_nodes";
|
|
10
|
+
declare const TAILS_COLLECTION = "agent_tool_tails";
|
|
8
11
|
/**
|
|
9
12
|
* [账本](../../../docs/terms.md)文档。
|
|
10
13
|
*
|
|
@@ -34,6 +37,46 @@ interface DecisionDoc {
|
|
|
34
37
|
requestedAt: number;
|
|
35
38
|
decidedAt: number | null;
|
|
36
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* [租约](../../../docs/terms.md)文档——一个会话一条,**`_id` 就是会话 id**。
|
|
42
|
+
*
|
|
43
|
+
* 唯一性于是由 `_id` 白送(不用额外建唯一索引),而且每一次读写都是按 `_id` 的点查,
|
|
44
|
+
* 这正是 Mongo 最快的那条路。
|
|
45
|
+
*
|
|
46
|
+
* **字段名跟着本包走驼峰,不跟 SQL 表的下划线。** 它与 `agent_leases` 表一一对应
|
|
47
|
+
* ([技术方案 §4.2](../../../docs/host/node/tech/multi-replica.md)),但同一个 database 里
|
|
48
|
+
* 另外三个集合都是驼峰,为了「对齐一张永远不会跟它 join 的表」把这一个写成下划线,
|
|
49
|
+
* 只会让用 Compass 翻库的人多一次愣神。
|
|
50
|
+
*/
|
|
51
|
+
interface LeaseDoc {
|
|
52
|
+
/** = `conversationId`。 */
|
|
53
|
+
_id: string;
|
|
54
|
+
/** 当前持有者(不透明字符串)。`null` = 没人持有。 */
|
|
55
|
+
holder: string | null;
|
|
56
|
+
/** 一次租期的唯一标识([租期标识](../../../docs/terms.md))。`null` = 没人持有。 */
|
|
57
|
+
leaseToken: string | null;
|
|
58
|
+
/**
|
|
59
|
+
* [账本](../../../docs/terms.md)水位,**跨释放保留**——下次抢占才不用回账本重新问。
|
|
60
|
+
* `null` = **还没播种**:这份文档是 `markAwaitingTakeover` 在会话从没被真正 `acquire`
|
|
61
|
+
* 过时垫出来的,`acquire()` 见到 `null` 要先调 `ctx.seedSeq()` 播种,不能当成合法的 0。
|
|
62
|
+
*/
|
|
63
|
+
seqWatermark: number | null;
|
|
64
|
+
/** 最后一次心跳写进来的时刻。别的副本判它死活看的就是这个值。 */
|
|
65
|
+
heartbeatAt: number;
|
|
66
|
+
/** 这次租期是什么时候抢到的。只用于排障,不参与任何判断。 */
|
|
67
|
+
acquiredAt: number;
|
|
68
|
+
/**
|
|
69
|
+
* [交接预留](../../../docs/terms.md):预留给哪个节点。`null` = 没有预留。**直接放在
|
|
70
|
+
* 租约文档上**(跟 SQL 那几家不同,那边独立建了一张 `agent_handover`)——Mongo 里
|
|
71
|
+
* 这是同一份文档,`findOneAndUpdate` 一次 CAS 就能把「放手」与「写预留」焊在一起,
|
|
72
|
+
* 不需要像 SQL 那样开一个跨表事务。
|
|
73
|
+
*/
|
|
74
|
+
reservedFor: string | null;
|
|
75
|
+
/** 预留截止时刻。`null` = 没有预留。过了这个时刻退化成「没人持有」。 */
|
|
76
|
+
reservedUntil: number | null;
|
|
77
|
+
/** [待接手](../../../docs/terms.md)标记。 */
|
|
78
|
+
awaitingTakeover: boolean;
|
|
79
|
+
}
|
|
37
80
|
/** [待发队列](../../../docs/terms.md)文档。`_id` 直接用队列条目自己的 id。 */
|
|
38
81
|
interface QueueDoc {
|
|
39
82
|
_id: string;
|
|
@@ -43,6 +86,88 @@ interface QueueDoc {
|
|
|
43
86
|
input: JsonValue;
|
|
44
87
|
createdAt: number;
|
|
45
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* [节点登记表](../../../docs/terms.md)文档——`_id` 就是节点地址,唯一性由它白送。
|
|
91
|
+
* 与 SQL 那几家的字段名一一对应([技术方案 §7.1](../../../docs/logic/orchestration/tech/handover.md)),
|
|
92
|
+
* 只是驼峰换下划线。
|
|
93
|
+
*/
|
|
94
|
+
interface NodeDoc {
|
|
95
|
+
/** = 节点地址,同租约里的 `holder`。 */
|
|
96
|
+
_id: string;
|
|
97
|
+
/** [发布序号](../../../docs/terms.md):每次发布递增,回滚也递增。 */
|
|
98
|
+
releaseSeq: number;
|
|
99
|
+
/** `ready` | `leaving`。 */
|
|
100
|
+
state: string;
|
|
101
|
+
heartbeatAt: number;
|
|
102
|
+
startedAt: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* [工具收尾](../../../docs/terms.md)文档——[交权](../../../docs/terms.md)那一刻还在跑、
|
|
106
|
+
* 留在旧节点上跑完的那次调用。用 `conversationId` + `toolCallId` 一对唯一索引,
|
|
107
|
+
* 不用复合 `_id`(理由同 `LedgerDoc`)。
|
|
108
|
+
*/
|
|
109
|
+
interface ToolTailDoc {
|
|
110
|
+
conversationId: string;
|
|
111
|
+
toolCallId: string;
|
|
112
|
+
toolName: string;
|
|
113
|
+
/** 在哪个节点上收尾(同 `holder` 的值空间)。 */
|
|
114
|
+
runner: string;
|
|
115
|
+
startedAt: number;
|
|
116
|
+
/** 过了这个时刻还没有结果,持有者就把它记成「结果未知」。 */
|
|
117
|
+
deadline: number;
|
|
118
|
+
/** `TailOutcome`。`null` = 还在跑。**只在为空时写得进**。 */
|
|
119
|
+
outcome: JsonValue | null;
|
|
120
|
+
settledAt: number | null;
|
|
121
|
+
/** 持有者要求停止。 */
|
|
122
|
+
stopRequested: boolean;
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/arbitration.d.ts
|
|
126
|
+
/** 心跳间隔的默认值(毫秒)。与 SQL 那一档同款,定案见技术方案 §8.3。 */
|
|
127
|
+
declare const DEFAULT_HEARTBEAT_MS = 5000;
|
|
128
|
+
/** 超时接管阈值的默认值(毫秒)——12 个心跳。 */
|
|
129
|
+
declare const DEFAULT_TAKEOVER_MS = 60000;
|
|
130
|
+
interface MongoArbitrationOptions {
|
|
131
|
+
/**
|
|
132
|
+
* 这个副本的身份——**不透明字符串**(k8s pod 地址 / Fly machine id / 随便什么)。
|
|
133
|
+
* 框架存它、传它、**不解释它**:别人抢不到归属时会拿到它,由[接入层](../../../docs/terms.md)
|
|
134
|
+
* 决定把请求转给谁。**转发是宿主写的,不是框架做的。**
|
|
135
|
+
*/
|
|
136
|
+
holder: string;
|
|
137
|
+
/** 心跳间隔,默认 5 秒。 */
|
|
138
|
+
heartbeatMs?: number;
|
|
139
|
+
/** 多久没心跳算它死了,默认 60 秒。**必须 ≥ 3 × 心跳间隔**,否则构造时就抛。 */
|
|
140
|
+
takeoverMs?: number;
|
|
141
|
+
/** 让测试能控制时间;缺省 `Date.now`。 */
|
|
142
|
+
now?: () => number;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 建一个租约版归属仲裁机制。
|
|
146
|
+
*
|
|
147
|
+
* ```ts
|
|
148
|
+
* const arbitration = mongoArbitration(db, { holder: process.env.POD_NAME });
|
|
149
|
+
* createAgentRuntime({ ..., persistence: mongoPersistence(db), arbitration });
|
|
150
|
+
* ```
|
|
151
|
+
*
|
|
152
|
+
* **吃的是同一个 `Db`**——跟 `mongoPersistence(db)` 一样。`migrate(db)` 已经把租约集合要的
|
|
153
|
+
* 索引一起建了,不用再调别的。
|
|
154
|
+
*/
|
|
155
|
+
declare function mongoArbitration(db: Db, opts: MongoArbitrationOptions): Arbitration;
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/nodes.d.ts
|
|
158
|
+
interface MongoNodeRegistryOptions {
|
|
159
|
+
/** 让测试能控制时间;缺省 `Date.now`。 */
|
|
160
|
+
now?: () => number;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 建一个节点登记表。
|
|
164
|
+
*
|
|
165
|
+
* ```ts
|
|
166
|
+
* const registry = mongoNodeRegistry(db);
|
|
167
|
+
* await registry.register({ node: process.env.RUNKO_NODE_URL, releaseSeq: Number(process.env.RUNKO_RELEASE_SEQ) });
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
declare function mongoNodeRegistry(db: Db, opts?: MongoNodeRegistryOptions): NodeRegistry;
|
|
46
171
|
//#endregion
|
|
47
172
|
//#region src/migrate.d.ts
|
|
48
173
|
declare function migrate(db: Db): Promise<void>;
|
|
@@ -55,9 +180,9 @@ declare const RUNKO_PERSIST_MONGO_VERSION: "0.0.0";
|
|
|
55
180
|
* **吃 `Db` 而不是 `MongoClient`**:选哪个 database 是宿主的决定(多租户可能一租户
|
|
56
181
|
* 一个 db),连接的生命周期也归宿主管——本包不 connect、不 close。
|
|
57
182
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
183
|
+
* 四个集合固定叫 `agent_ledger` / `agent_decisions` / `agent_queue` / `agent_tool_tails`,
|
|
184
|
+
* 你自己的集合照常在同一个 db 里,互不干扰。
|
|
60
185
|
*/
|
|
61
186
|
declare function mongoPersistence(db: Db): Persistence;
|
|
62
187
|
//#endregion
|
|
63
|
-
export { DECISIONS_COLLECTION, type DecisionDoc, LEDGER_COLLECTION, type LedgerDoc, QUEUE_COLLECTION, type QueueDoc, RUNKO_PERSIST_MONGO_VERSION, migrate, mongoPersistence };
|
|
188
|
+
export { DECISIONS_COLLECTION, DEFAULT_HEARTBEAT_MS, DEFAULT_TAKEOVER_MS, type DecisionDoc, LEASES_COLLECTION, LEDGER_COLLECTION, type LeaseDoc, type LedgerDoc, type MongoArbitrationOptions, type MongoNodeRegistryOptions, NODES_COLLECTION, type NodeDoc, QUEUE_COLLECTION, type QueueDoc, RUNKO_PERSIST_MONGO_VERSION, TAILS_COLLECTION, type ToolTailDoc, migrate, mongoArbitration, mongoNodeRegistry, mongoPersistence };
|