@okrlinkhub/okrhub 0.1.7 → 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 +14 -17
- package/dist/client/index.d.ts +9 -5
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +9 -4
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +0 -3
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/config.d.ts +3 -0
- package/dist/component/config.d.ts.map +1 -1
- package/dist/component/config.js +3 -0
- package/dist/component/config.js.map +1 -1
- package/dist/component/entities/batch.d.ts +57 -57
- package/dist/component/entities/indicatorForecasts.d.ts +7 -7
- package/dist/component/entities/indicatorValues.d.ts +7 -7
- package/dist/component/entities/indicators.d.ts +8 -8
- package/dist/component/entities/initiatives.d.ts +58 -58
- package/dist/component/entities/keyResults.d.ts +21 -21
- package/dist/component/entities/milestones.d.ts +11 -11
- package/dist/component/entities/objectives.d.ts +18 -18
- package/dist/component/entities/risks.d.ts +32 -32
- package/dist/component/sync/processor.d.ts +4 -4
- package/dist/component/sync/processor.d.ts.map +1 -1
- package/dist/component/sync/processor.js +121 -20
- package/dist/component/sync/processor.js.map +1 -1
- package/dist/component/sync/queue.d.ts +35 -6
- package/dist/component/sync/queue.d.ts.map +1 -1
- package/dist/component/sync/queue.js +182 -3
- package/dist/component/sync/queue.js.map +1 -1
- package/package.json +1 -1
- package/src/client/index.ts +9 -4
- package/src/component/_generated/component.ts +0 -3
- package/src/component/config.ts +3 -0
- package/src/component/sync/processor.ts +151 -25
- package/src/component/sync/queue.ts +218 -3
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Handles the sync queue for async processing of entities to LinkHub.
|
|
5
5
|
*/
|
|
6
6
|
import { v } from "convex/values";
|
|
7
|
-
import {
|
|
7
|
+
import { api, internal } from "../_generated/api.js";
|
|
8
|
+
import { internalMutation, internalQuery, query } from "../_generated/server.js";
|
|
8
9
|
/**
|
|
9
10
|
* Adds an item to the sync queue for async processing
|
|
10
11
|
*/
|
|
@@ -15,7 +16,11 @@ export const addToSyncQueue = internalMutation({
|
|
|
15
16
|
payload: v.string(),
|
|
16
17
|
},
|
|
17
18
|
handler: async (ctx, args) => {
|
|
18
|
-
|
|
19
|
+
const hadPendingBeforeInsert = await ctx.db
|
|
20
|
+
.query("syncQueue")
|
|
21
|
+
.withIndex("by_status", (q) => q.eq("status", "pending"))
|
|
22
|
+
.take(1);
|
|
23
|
+
const queueId = await ctx.db.insert("syncQueue", {
|
|
19
24
|
entityType: args.entityType,
|
|
20
25
|
externalId: args.externalId,
|
|
21
26
|
payload: args.payload,
|
|
@@ -23,6 +28,14 @@ export const addToSyncQueue = internalMutation({
|
|
|
23
28
|
attempts: 0,
|
|
24
29
|
createdAt: Date.now(),
|
|
25
30
|
});
|
|
31
|
+
if (hadPendingBeforeInsert.length === 0) {
|
|
32
|
+
const config = await ctx.runQuery(internal.config.getConfig, {});
|
|
33
|
+
if (config?.autoSyncEnabled) {
|
|
34
|
+
await ctx.scheduler.runAfter(0, api.sync.processor.processSyncQueue, {});
|
|
35
|
+
console.log(`[okrhub] enqueue scheduled processor entityType=${args.entityType} externalId=${args.externalId}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return queueId;
|
|
26
39
|
},
|
|
27
40
|
});
|
|
28
41
|
/**
|
|
@@ -148,9 +161,175 @@ export const updateSyncQueueItem = internalMutation({
|
|
|
148
161
|
},
|
|
149
162
|
});
|
|
150
163
|
/**
|
|
151
|
-
*
|
|
164
|
+
* Update multiple sync queue items in a single mutation call.
|
|
165
|
+
*/
|
|
166
|
+
export const updateSyncQueueItemsBatch = internalMutation({
|
|
167
|
+
args: {
|
|
168
|
+
updates: v.array(v.object({
|
|
169
|
+
id: v.id("syncQueue"),
|
|
170
|
+
status: v.union(v.literal("pending"), v.literal("processing"), v.literal("success"), v.literal("failed")),
|
|
171
|
+
errorMessage: v.optional(v.string()),
|
|
172
|
+
linkHubId: v.optional(v.string()),
|
|
173
|
+
})),
|
|
174
|
+
},
|
|
175
|
+
returns: v.object({
|
|
176
|
+
updated: v.number(),
|
|
177
|
+
}),
|
|
178
|
+
handler: async (ctx, args) => {
|
|
179
|
+
for (const update of args.updates) {
|
|
180
|
+
const patch = {
|
|
181
|
+
status: update.status,
|
|
182
|
+
lastAttemptAt: Date.now(),
|
|
183
|
+
};
|
|
184
|
+
if (update.errorMessage) {
|
|
185
|
+
patch.errorMessage = update.errorMessage;
|
|
186
|
+
}
|
|
187
|
+
const item = await ctx.db.get(update.id);
|
|
188
|
+
if (item) {
|
|
189
|
+
patch.attempts = item.attempts + 1;
|
|
190
|
+
}
|
|
191
|
+
await ctx.db.patch(update.id, patch);
|
|
192
|
+
if (update.status === "success" && item) {
|
|
193
|
+
const newSyncStatus = "synced";
|
|
194
|
+
if (item.entityType === "objective") {
|
|
195
|
+
const entity = await ctx.db
|
|
196
|
+
.query("objectives")
|
|
197
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
198
|
+
.first();
|
|
199
|
+
if (entity) {
|
|
200
|
+
await ctx.db.patch(entity._id, {
|
|
201
|
+
syncStatus: newSyncStatus,
|
|
202
|
+
updatedAt: Date.now(),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (item.entityType === "keyResult") {
|
|
207
|
+
const entity = await ctx.db
|
|
208
|
+
.query("keyResults")
|
|
209
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
210
|
+
.first();
|
|
211
|
+
if (entity) {
|
|
212
|
+
await ctx.db.patch(entity._id, {
|
|
213
|
+
syncStatus: newSyncStatus,
|
|
214
|
+
updatedAt: Date.now(),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else if (item.entityType === "risk") {
|
|
219
|
+
const entity = await ctx.db
|
|
220
|
+
.query("risks")
|
|
221
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
222
|
+
.first();
|
|
223
|
+
if (entity) {
|
|
224
|
+
await ctx.db.patch(entity._id, { syncStatus: newSyncStatus });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else if (item.entityType === "initiative") {
|
|
228
|
+
const entity = await ctx.db
|
|
229
|
+
.query("initiatives")
|
|
230
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
231
|
+
.first();
|
|
232
|
+
if (entity) {
|
|
233
|
+
await ctx.db.patch(entity._id, {
|
|
234
|
+
syncStatus: newSyncStatus,
|
|
235
|
+
updatedAt: Date.now(),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (item.entityType === "indicator") {
|
|
240
|
+
const entity = await ctx.db
|
|
241
|
+
.query("indicators")
|
|
242
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
243
|
+
.first();
|
|
244
|
+
if (entity) {
|
|
245
|
+
await ctx.db.patch(entity._id, { syncStatus: newSyncStatus });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (item.entityType === "indicatorValue") {
|
|
249
|
+
const entity = await ctx.db
|
|
250
|
+
.query("indicatorValues")
|
|
251
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
252
|
+
.first();
|
|
253
|
+
if (entity) {
|
|
254
|
+
await ctx.db.patch(entity._id, { syncStatus: newSyncStatus });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else if (item.entityType === "indicatorForecast") {
|
|
258
|
+
const entity = await ctx.db
|
|
259
|
+
.query("indicatorForecasts")
|
|
260
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
261
|
+
.first();
|
|
262
|
+
if (entity) {
|
|
263
|
+
await ctx.db.patch(entity._id, { syncStatus: newSyncStatus });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else if (item.entityType === "milestone") {
|
|
267
|
+
const entity = await ctx.db
|
|
268
|
+
.query("milestones")
|
|
269
|
+
.withIndex("by_external_id", (q) => q.eq("externalId", item.externalId))
|
|
270
|
+
.first();
|
|
271
|
+
if (entity) {
|
|
272
|
+
await ctx.db.patch(entity._id, {
|
|
273
|
+
syncStatus: newSyncStatus,
|
|
274
|
+
updatedAt: Date.now(),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
await ctx.db.insert("syncLog", {
|
|
279
|
+
entityType: item.entityType,
|
|
280
|
+
externalId: item.externalId,
|
|
281
|
+
linkHubId: update.linkHubId,
|
|
282
|
+
syncedAt: Date.now(),
|
|
283
|
+
action: "create",
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
console.log(`[okrhub] queue batch status updates applied=${args.updates.length}`);
|
|
288
|
+
return {
|
|
289
|
+
updated: args.updates.length,
|
|
290
|
+
};
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
/**
|
|
294
|
+
* Gets lightweight pending items from the sync queue (without payload).
|
|
152
295
|
*/
|
|
153
296
|
export const getPendingSyncItems = query({
|
|
297
|
+
args: {
|
|
298
|
+
limit: v.optional(v.number()),
|
|
299
|
+
},
|
|
300
|
+
returns: v.array(v.object({
|
|
301
|
+
_id: v.id("syncQueue"),
|
|
302
|
+
_creationTime: v.number(),
|
|
303
|
+
entityType: v.string(),
|
|
304
|
+
externalId: v.string(),
|
|
305
|
+
status: v.string(),
|
|
306
|
+
attempts: v.number(),
|
|
307
|
+
lastAttemptAt: v.optional(v.number()),
|
|
308
|
+
errorMessage: v.optional(v.string()),
|
|
309
|
+
createdAt: v.number(),
|
|
310
|
+
})),
|
|
311
|
+
handler: async (ctx, args) => {
|
|
312
|
+
const items = await ctx.db
|
|
313
|
+
.query("syncQueue")
|
|
314
|
+
.withIndex("by_status", (q) => q.eq("status", "pending"))
|
|
315
|
+
.take(args.limit ?? 50);
|
|
316
|
+
return items.map((item) => ({
|
|
317
|
+
_id: item._id,
|
|
318
|
+
_creationTime: item._creationTime,
|
|
319
|
+
entityType: item.entityType,
|
|
320
|
+
externalId: item.externalId,
|
|
321
|
+
status: item.status,
|
|
322
|
+
attempts: item.attempts,
|
|
323
|
+
lastAttemptAt: item.lastAttemptAt,
|
|
324
|
+
errorMessage: item.errorMessage,
|
|
325
|
+
createdAt: item.createdAt,
|
|
326
|
+
}));
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
/**
|
|
330
|
+
* Gets full pending items for processing (includes payload).
|
|
331
|
+
*/
|
|
332
|
+
export const getPendingSyncItemsForProcessing = internalQuery({
|
|
154
333
|
args: {
|
|
155
334
|
limit: v.optional(v.number()),
|
|
156
335
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/component/sync/queue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/component/sync/queue.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client/index.ts
CHANGED
|
@@ -281,10 +281,11 @@ export function exposeApi(
|
|
|
281
281
|
}),
|
|
282
282
|
|
|
283
283
|
/**
|
|
284
|
-
* Start
|
|
285
|
-
*
|
|
284
|
+
* Start event-driven sync. Triggers one processSyncQueue run.
|
|
285
|
+
* If autoSyncEnabled is true, the processor will continue only while
|
|
286
|
+
* there are pending items, then stop when the queue is empty.
|
|
286
287
|
*
|
|
287
|
-
* Call once after configure() to
|
|
288
|
+
* Call once after configure() to bootstrap the processor.
|
|
288
289
|
*/
|
|
289
290
|
startSync: actionGeneric({
|
|
290
291
|
args: {
|
|
@@ -307,7 +308,7 @@ export function exposeApi(
|
|
|
307
308
|
/**
|
|
308
309
|
* Process the sync queue manually.
|
|
309
310
|
* Reads config from stored DB config, env vars, or getConfig option.
|
|
310
|
-
* If autoSyncEnabled,
|
|
311
|
+
* If autoSyncEnabled, follow-up runs happen only in drain mode.
|
|
311
312
|
*/
|
|
312
313
|
processSyncQueue: actionGeneric({
|
|
313
314
|
args: {
|
|
@@ -333,6 +334,10 @@ export function exposeApi(
|
|
|
333
334
|
// =========================================================================
|
|
334
335
|
// QUEUE QUERIES
|
|
335
336
|
// =========================================================================
|
|
337
|
+
/**
|
|
338
|
+
* Read pending queue items for monitoring purposes.
|
|
339
|
+
* This query is lightweight and does not include payload bodies.
|
|
340
|
+
*/
|
|
336
341
|
getPendingSyncItems: queryGeneric({
|
|
337
342
|
args: {
|
|
338
343
|
limit: v.optional(v.number()),
|
|
@@ -1974,7 +1974,6 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
1974
1974
|
errorMessage?: string;
|
|
1975
1975
|
externalId: string;
|
|
1976
1976
|
lastAttemptAt?: number;
|
|
1977
|
-
payload: string;
|
|
1978
1977
|
status: string;
|
|
1979
1978
|
}>,
|
|
1980
1979
|
Name
|
|
@@ -2270,7 +2269,6 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
2270
2269
|
errorMessage?: string;
|
|
2271
2270
|
externalId: string;
|
|
2272
2271
|
lastAttemptAt?: number;
|
|
2273
|
-
payload: string;
|
|
2274
2272
|
status: string;
|
|
2275
2273
|
}>,
|
|
2276
2274
|
Name
|
|
@@ -2357,7 +2355,6 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
2357
2355
|
errorMessage?: string;
|
|
2358
2356
|
externalId: string;
|
|
2359
2357
|
lastAttemptAt?: number;
|
|
2360
|
-
payload: string;
|
|
2361
2358
|
status: string;
|
|
2362
2359
|
}>,
|
|
2363
2360
|
Name
|
package/src/component/config.ts
CHANGED
|
@@ -13,6 +13,8 @@ import { mutation, internalQuery } from "./_generated/server.js";
|
|
|
13
13
|
* Upsert the component configuration.
|
|
14
14
|
* Call this once during setup to store LinkHub connection details.
|
|
15
15
|
* If config already exists, it will be updated.
|
|
16
|
+
* `syncIntervalMs` is kept for backward compatibility, but the sync engine
|
|
17
|
+
* now prefers event-driven drain mode (no periodic polling when idle).
|
|
16
18
|
*/
|
|
17
19
|
export const configure = mutation({
|
|
18
20
|
args: {
|
|
@@ -49,6 +51,7 @@ export const configure = mutation({
|
|
|
49
51
|
/**
|
|
50
52
|
* Internal query to read the stored configuration.
|
|
51
53
|
* Used by processSyncQueue and other internal functions.
|
|
54
|
+
* Note: `syncIntervalMs` is legacy compatibility metadata.
|
|
52
55
|
*/
|
|
53
56
|
export const getConfig = internalQuery({
|
|
54
57
|
args: {},
|
|
@@ -5,14 +5,33 @@
|
|
|
5
5
|
* Supports both explicit config args (backward compatible) and
|
|
6
6
|
* stored config from the DB (new recommended approach).
|
|
7
7
|
*
|
|
8
|
-
* When autoSyncEnabled is true, the processor
|
|
9
|
-
*
|
|
8
|
+
* When autoSyncEnabled is true, the processor runs in drain mode:
|
|
9
|
+
* it keeps scheduling itself only while there are pending items.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { v } from "convex/values";
|
|
13
13
|
import { action } from "../_generated/server.js";
|
|
14
|
+
import type { Id } from "../_generated/dataModel.js";
|
|
14
15
|
import { api, internal } from "../_generated/api.js";
|
|
15
16
|
|
|
17
|
+
const BATCH_KEY_BY_ENTITY_TYPE: Record<string, string> = {
|
|
18
|
+
objective: "objectives",
|
|
19
|
+
keyResult: "keyResults",
|
|
20
|
+
risk: "risks",
|
|
21
|
+
initiative: "initiatives",
|
|
22
|
+
indicator: "indicators",
|
|
23
|
+
indicatorValue: "indicatorValues",
|
|
24
|
+
indicatorForecast: "indicatorForecasts",
|
|
25
|
+
milestone: "milestones",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type PendingSyncItem = {
|
|
29
|
+
_id: Id<"syncQueue">;
|
|
30
|
+
entityType: string;
|
|
31
|
+
externalId: string;
|
|
32
|
+
payload: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
16
35
|
/**
|
|
17
36
|
* Process pending items from the sync queue.
|
|
18
37
|
*
|
|
@@ -21,7 +40,7 @@ import { api, internal } from "../_generated/api.js";
|
|
|
21
40
|
* 2. Stored config from DB (set via configure()) - recommended
|
|
22
41
|
*
|
|
23
42
|
* Self-scheduling: if stored config has autoSyncEnabled=true,
|
|
24
|
-
* the processor schedules
|
|
43
|
+
* the processor only schedules immediate follow-up runs while work remains.
|
|
25
44
|
*/
|
|
26
45
|
export const processSyncQueue = action({
|
|
27
46
|
args: {
|
|
@@ -63,26 +82,119 @@ export const processSyncQueue = action({
|
|
|
63
82
|
|
|
64
83
|
const batchSize = args.batchSize ?? 10;
|
|
65
84
|
|
|
66
|
-
// Get pending items
|
|
67
|
-
const pendingItems = await ctx.runQuery(
|
|
68
|
-
|
|
85
|
+
// Get full pending items (includes payload for transport)
|
|
86
|
+
const pendingItems = (await ctx.runQuery(
|
|
87
|
+
internal.sync.queue.getPendingSyncItemsForProcessing,
|
|
69
88
|
{ limit: batchSize }
|
|
70
|
-
);
|
|
89
|
+
)) as PendingSyncItem[];
|
|
71
90
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
// Idle path: do nothing, don't self-schedule on an empty queue.
|
|
92
|
+
if (pendingItems.length === 0) {
|
|
93
|
+
console.log("[okrhub] processSyncQueue idle: no pending items");
|
|
94
|
+
return { processed: 0, succeeded: 0, failed: 0 };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Mark all selected items as processing in one mutation call.
|
|
98
|
+
await ctx.runMutation(internal.sync.queue.updateSyncQueueItemsBatch, {
|
|
99
|
+
updates: pendingItems.map((item) => ({
|
|
100
|
+
id: item._id,
|
|
101
|
+
status: "processing" as const,
|
|
102
|
+
})),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const updates: Array<{
|
|
106
|
+
id: Id<"syncQueue">;
|
|
107
|
+
status: "success" | "failed";
|
|
108
|
+
linkHubId?: string;
|
|
109
|
+
errorMessage?: string;
|
|
110
|
+
}> = [];
|
|
111
|
+
|
|
112
|
+
const batchPayload: Record<string, unknown[]> = {};
|
|
113
|
+
const batchItemIds = new Set<Id<"syncQueue">>();
|
|
114
|
+
const batchItemKeyToQueueId = new Map<string, Id<"syncQueue">>();
|
|
75
115
|
|
|
76
116
|
for (const item of pendingItems) {
|
|
77
|
-
|
|
117
|
+
const batchKey = BATCH_KEY_BY_ENTITY_TYPE[item.entityType];
|
|
118
|
+
if (!batchKey) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
78
121
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
122
|
+
try {
|
|
123
|
+
const parsed = JSON.parse(item.payload) as Record<string, unknown>;
|
|
124
|
+
if (!batchPayload[batchKey]) {
|
|
125
|
+
batchPayload[batchKey] = [];
|
|
126
|
+
}
|
|
127
|
+
batchPayload[batchKey].push(parsed);
|
|
128
|
+
batchItemIds.add(item._id);
|
|
129
|
+
batchItemKeyToQueueId.set(`${item.entityType}:${item.externalId}`, item._id);
|
|
130
|
+
} catch {
|
|
131
|
+
updates.push({
|
|
132
|
+
id: item._id,
|
|
133
|
+
status: "failed",
|
|
134
|
+
errorMessage: "Invalid payload JSON",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const batchKeys = Object.keys(batchPayload);
|
|
140
|
+
if (batchKeys.length > 0) {
|
|
141
|
+
const batchResult = await ctx.runAction(api.sync.http.sendBatchToLinkHub, {
|
|
142
|
+
endpointUrl,
|
|
143
|
+
apiKeyPrefix,
|
|
144
|
+
signingSecret,
|
|
145
|
+
payload: JSON.stringify(batchPayload),
|
|
83
146
|
});
|
|
84
147
|
|
|
85
|
-
|
|
148
|
+
if (!batchResult.success) {
|
|
149
|
+
const errorMessage =
|
|
150
|
+
batchResult.errors.length > 0
|
|
151
|
+
? batchResult.errors.join(" | ")
|
|
152
|
+
: "Batch sync failed";
|
|
153
|
+
|
|
154
|
+
for (const item of pendingItems) {
|
|
155
|
+
if (!batchItemIds.has(item._id)) continue;
|
|
156
|
+
updates.push({
|
|
157
|
+
id: item._id,
|
|
158
|
+
status: "failed",
|
|
159
|
+
errorMessage,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
} else {
|
|
163
|
+
const resultMap = new Map<
|
|
164
|
+
string,
|
|
165
|
+
{ linkHubId?: string; error?: string }
|
|
166
|
+
>();
|
|
167
|
+
for (const result of batchResult.results) {
|
|
168
|
+
resultMap.set(`${result.entityType}:${result.externalId}`, {
|
|
169
|
+
linkHubId: result.linkHubId,
|
|
170
|
+
error: result.error,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for (const [resultKey, queueId] of batchItemKeyToQueueId.entries()) {
|
|
175
|
+
const result = resultMap.get(resultKey);
|
|
176
|
+
if (result && !result.error) {
|
|
177
|
+
updates.push({
|
|
178
|
+
id: queueId,
|
|
179
|
+
status: "success",
|
|
180
|
+
linkHubId: result.linkHubId,
|
|
181
|
+
});
|
|
182
|
+
} else {
|
|
183
|
+
updates.push({
|
|
184
|
+
id: queueId,
|
|
185
|
+
status: "failed",
|
|
186
|
+
errorMessage: result?.error ?? "Missing batch result",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Fallback to single send for unsupported entity types.
|
|
194
|
+
for (const item of pendingItems) {
|
|
195
|
+
if (batchItemIds.has(item._id)) continue;
|
|
196
|
+
if (updates.some((update) => update.id === item._id)) continue;
|
|
197
|
+
|
|
86
198
|
const result = await ctx.runAction(api.sync.http.sendToLinkHub, {
|
|
87
199
|
endpointUrl,
|
|
88
200
|
apiKeyPrefix,
|
|
@@ -92,15 +204,13 @@ export const processSyncQueue = action({
|
|
|
92
204
|
});
|
|
93
205
|
|
|
94
206
|
if (result.success) {
|
|
95
|
-
|
|
96
|
-
await ctx.runMutation(internal.sync.queue.updateSyncQueueItem, {
|
|
207
|
+
updates.push({
|
|
97
208
|
id: item._id,
|
|
98
209
|
status: "success",
|
|
99
210
|
linkHubId: "linkHubId" in result ? result.linkHubId : undefined,
|
|
100
211
|
});
|
|
101
212
|
} else {
|
|
102
|
-
|
|
103
|
-
await ctx.runMutation(internal.sync.queue.updateSyncQueueItem, {
|
|
213
|
+
updates.push({
|
|
104
214
|
id: item._id,
|
|
105
215
|
status: "failed",
|
|
106
216
|
errorMessage: result.error,
|
|
@@ -108,15 +218,31 @@ export const processSyncQueue = action({
|
|
|
108
218
|
}
|
|
109
219
|
}
|
|
110
220
|
|
|
111
|
-
|
|
221
|
+
if (updates.length > 0) {
|
|
222
|
+
await ctx.runMutation(internal.sync.queue.updateSyncQueueItemsBatch, {
|
|
223
|
+
updates,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const processed = updates.length;
|
|
228
|
+
const succeeded = updates.filter((update) => update.status === "success").length;
|
|
229
|
+
const failed = processed - succeeded;
|
|
230
|
+
|
|
231
|
+
// Drain mode: if there are still pending items, immediately continue processing.
|
|
112
232
|
if (storedConfig?.autoSyncEnabled) {
|
|
113
|
-
await ctx.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
{} // no args needed - reads config from DB
|
|
233
|
+
const remaining = await ctx.runQuery(
|
|
234
|
+
internal.sync.queue.getPendingSyncItemsForProcessing,
|
|
235
|
+
{ limit: 1 }
|
|
117
236
|
);
|
|
237
|
+
if (remaining.length > 0) {
|
|
238
|
+
await ctx.scheduler.runAfter(0, api.sync.processor.processSyncQueue, {});
|
|
239
|
+
}
|
|
118
240
|
}
|
|
119
241
|
|
|
242
|
+
console.log(
|
|
243
|
+
`[okrhub] processSyncQueue processed=${processed} succeeded=${succeeded} failed=${failed}`
|
|
244
|
+
);
|
|
245
|
+
|
|
120
246
|
return { processed, succeeded, failed };
|
|
121
247
|
},
|
|
122
248
|
});
|