@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.
Files changed (34) hide show
  1. package/README.md +14 -17
  2. package/dist/client/index.d.ts +9 -5
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +9 -4
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/component/_generated/component.d.ts +0 -3
  7. package/dist/component/_generated/component.d.ts.map +1 -1
  8. package/dist/component/config.d.ts +3 -0
  9. package/dist/component/config.d.ts.map +1 -1
  10. package/dist/component/config.js +3 -0
  11. package/dist/component/config.js.map +1 -1
  12. package/dist/component/entities/batch.d.ts +57 -57
  13. package/dist/component/entities/indicatorForecasts.d.ts +7 -7
  14. package/dist/component/entities/indicatorValues.d.ts +7 -7
  15. package/dist/component/entities/indicators.d.ts +8 -8
  16. package/dist/component/entities/initiatives.d.ts +58 -58
  17. package/dist/component/entities/keyResults.d.ts +21 -21
  18. package/dist/component/entities/milestones.d.ts +11 -11
  19. package/dist/component/entities/objectives.d.ts +18 -18
  20. package/dist/component/entities/risks.d.ts +32 -32
  21. package/dist/component/sync/processor.d.ts +4 -4
  22. package/dist/component/sync/processor.d.ts.map +1 -1
  23. package/dist/component/sync/processor.js +121 -20
  24. package/dist/component/sync/processor.js.map +1 -1
  25. package/dist/component/sync/queue.d.ts +35 -6
  26. package/dist/component/sync/queue.d.ts.map +1 -1
  27. package/dist/component/sync/queue.js +182 -3
  28. package/dist/component/sync/queue.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/client/index.ts +9 -4
  31. package/src/component/_generated/component.ts +0 -3
  32. package/src/component/config.ts +3 -0
  33. package/src/component/sync/processor.ts +151 -25
  34. 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 { internalMutation, query } from "../_generated/server.js";
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
- return await ctx.db.insert("syncQueue", {
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
- * Gets pending items from the sync queue
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;IAC7C,IAAI,EAAE;QACJ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;YACtC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;IAClD,IAAI,EAAE;QACJ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC;QACrB,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CACpB;QACD,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACpC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAClC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAA4B;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;SAC1B,CAAC;QAEF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAErC,qEAAqE;QACrE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;YACtC,qDAAqD;YACrD,MAAM,aAAa,GAAG,QAAQ,CAAC;YAE/B,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,YAAY,CAAC;qBACnB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;wBAC7B,UAAU,EAAE,aAAa;wBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,YAAY,CAAC;qBACnB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;wBAC7B,UAAU,EAAE,aAAa;wBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,OAAO,CAAC;qBACd,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,aAAa,CAAC;qBACpB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;wBAC7B,UAAU,EAAE,aAAa;wBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,YAAY,CAAC;qBACnB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,iBAAiB,CAAC;qBACxB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,mBAAmB,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,oBAAoB,CAAC;qBAC3B,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;qBACxB,KAAK,CAAC,YAAY,CAAC;qBACnB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CACpC;qBACA,KAAK,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;wBAC7B,UAAU,EAAE,aAAa;wBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,eAAe;YACf,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,MAAM,EAAE,QAAQ,EAAE,sCAAsC;aACzD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;IACvC,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC;QACtB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACrC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC,CACH;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;aACxD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/component/sync/queue.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "bugs": {
7
7
  "url": "https://github.com/okrlinkhub/okrhub-convex/issues"
8
8
  },
9
- "version": "0.1.7",
9
+ "version": "0.2.0",
10
10
  "license": "Apache-2.0",
11
11
  "keywords": [
12
12
  "convex",
@@ -281,10 +281,11 @@ export function exposeApi(
281
281
  }),
282
282
 
283
283
  /**
284
- * Start the auto-sync loop. Triggers one processSyncQueue run,
285
- * which will self-schedule subsequent runs if autoSyncEnabled is true.
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 kick off the sync loop.
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, also self-schedules the next run.
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
@@ -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 self-schedules
9
- * the next run via ctx.scheduler.runAfter.
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 the next run automatically.
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
- api.sync.queue.getPendingSyncItems,
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
- let processed = 0;
73
- let succeeded = 0;
74
- let failed = 0;
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
- processed++;
117
+ const batchKey = BATCH_KEY_BY_ENTITY_TYPE[item.entityType];
118
+ if (!batchKey) {
119
+ continue;
120
+ }
78
121
 
79
- // Mark as processing
80
- await ctx.runMutation(internal.sync.queue.updateSyncQueueItem, {
81
- id: item._id,
82
- status: "processing",
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
- // Send to LinkHub
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
- succeeded++;
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
- failed++;
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
- // Self-scheduling: schedule the next run if autoSync is enabled
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.scheduler.runAfter(
114
- storedConfig.syncIntervalMs,
115
- api.sync.processor.processSyncQueue,
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
  });