@tstdl/base 0.93.198 → 0.93.199

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.93.198",
3
+ "version": "0.93.199",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -153,8 +153,8 @@
153
153
  "type-fest": "^5.5"
154
154
  },
155
155
  "peerDependencies": {
156
- "@aws-sdk/client-s3": "^3.1025",
157
- "@aws-sdk/s3-request-presigner": "^3.1025",
156
+ "@aws-sdk/client-s3": "^3.1026",
157
+ "@aws-sdk/s3-request-presigner": "^3.1026",
158
158
  "@genkit-ai/google-genai": "^1.31",
159
159
  "@google-cloud/storage": "^7.19",
160
160
  "@toon-format/toon": "^2.1.0",
@@ -187,6 +187,7 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
187
187
  },
188
188
  }));
189
189
  const itemsWithIdempotency = entitiesWithIndex.filter((e) => isNotNull(e.entity.idempotencyKey));
190
+ itemsWithIdempotency.sort((a, b) => a.entity.idempotencyKey.localeCompare(b.entity.idempotencyKey));
190
191
  const itemsWithoutIdempotency = entitiesWithIndex.filter((e) => isNull(e.entity.idempotencyKey));
191
192
  const hasDependencies = itemsWithDistinctDependencies.some((item) => ((item.scheduleAfter?.length ?? 0) > 0) || ((item.completeAfter?.length ?? 0) > 0) || (isDefined(item.parentId) && (item.parentRequires != false) && !(isArray(item.parentRequires) && (item.parentRequires.length == 0))));
192
193
  const mustUseTransaction = (entitiesWithIndex.length > 1) || hasDependencies;
@@ -382,7 +383,6 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
382
383
  decrementsToApply.set(dep.taskId, current);
383
384
  }
384
385
  const values = [...decrementsToApply]
385
- .toSorted(([idA], [idB]) => idA.localeCompare(idB))
386
386
  .map(([taskId, d]) => sql `(${taskId}::uuid, ${d.schedule}::int, ${d.complete}::int)`);
387
387
  const updates = session.$with('updates').as((qb) => qb
388
388
  .select({
@@ -391,8 +391,14 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
391
391
  completeIncrement: sql `(complete)::int`.as('complete_increment'),
392
392
  })
393
393
  .from(sql `(VALUES ${sql.join(values, sql `, `)}) AS t(id, schedule, complete)`));
394
+ const locked = session.$with('locked').as((qb) => qb
395
+ .select({ id: taskTable.id })
396
+ .from(taskTable)
397
+ .innerJoin(updates, eq(taskTable.id, updates.taskId))
398
+ .orderBy(asc(taskTable.id))
399
+ .for('update'));
394
400
  const updatedRows = await session
395
- .with(updates)
401
+ .with(updates, locked)
396
402
  .update(taskTable)
397
403
  .set({
398
404
  unresolvedScheduleDependencies: sql `${taskTable.unresolvedScheduleDependencies} + ${updates.scheduleIncrement}`,
@@ -400,7 +406,7 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
400
406
  status: caseWhen(and(eq(taskTable.status, TaskStatus.Pending), gt(sql `${taskTable.unresolvedScheduleDependencies} + ${updates.scheduleIncrement}`, 0)), TaskStatus.Waiting).else(taskTable.status),
401
407
  })
402
408
  .from(updates)
403
- .where(eq(taskTable.id, updates.taskId))
409
+ .where(and(eq(taskTable.id, updates.taskId), inArray(taskTable.id, session.select({ id: locked.id }).from(locked))))
404
410
  .returning({ id: taskTable.id, status: taskTable.status, namespace: taskTable.namespace });
405
411
  const notifiedNamespaces = new Set();
406
412
  for (const row of updatedRows) {
@@ -755,6 +761,12 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
755
761
  updateState: sql `(state)::jsonb`.as('update_state'),
756
762
  })
757
763
  .from(sql `(VALUES ${sql.join(rows, sql `, `)}) AS t(id, token, progress, state)`));
764
+ const locked = session.$with('locked').as((qb) => qb
765
+ .select({ id: taskTable.id })
766
+ .from(taskTable)
767
+ .innerJoin(updates, eq(taskTable.id, updates.updateId))
768
+ .orderBy(asc(taskTable.id))
769
+ .for('update'));
758
770
  const updated = session.$with('updated').as(() => session
759
771
  .update(taskTable)
760
772
  .set({
@@ -763,10 +775,10 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
763
775
  state: coalesce(updates.updateState, taskTable.state),
764
776
  })
765
777
  .from(updates)
766
- .where(and(eq(taskTable.id, updates.updateId), sql `${taskTable.token} IS NOT DISTINCT FROM ${updates.updateToken}`, eq(taskTable.status, TaskStatus.Running), gt(taskTable.startTimestamp, sql `${TRANSACTION_TIMESTAMP} - ${interval(this.maxExecutionTime, 'milliseconds')}`)))
778
+ .where(and(eq(taskTable.id, updates.updateId), inArray(taskTable.id, session.select({ id: locked.id }).from(locked)), sql `${taskTable.token} IS NOT DISTINCT FROM ${updates.updateToken}`, eq(taskTable.status, TaskStatus.Running), gt(taskTable.startTimestamp, sql `${TRANSACTION_TIMESTAMP} - ${interval(this.maxExecutionTime, 'milliseconds')}`)))
767
779
  .returning({ id: taskTable.id }));
768
780
  const result = await session
769
- .with(updates, updated)
781
+ .with(updates, locked, updated)
770
782
  .select({ id: updated.id })
771
783
  .from(updated);
772
784
  return result.map((r) => r.id);
@@ -810,6 +822,12 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
810
822
  updateProgress: sql `(progress)::numeric`.as('update_progress'),
811
823
  })
812
824
  .from(sql `(VALUES ${sql.join(rows, sql `, `)}) AS t(id, token, result, progress)`));
825
+ const locked = tx.pgTransaction.$with('locked').as((qb) => qb
826
+ .select({ id: taskTable.id })
827
+ .from(taskTable)
828
+ .innerJoin(updates, eq(taskTable.id, updates.updateId))
829
+ .orderBy(asc(taskTable.id))
830
+ .for('update'));
813
831
  const updated = tx.pgTransaction.$with('updated').as(() => tx.pgTransaction
814
832
  .update(taskTable)
815
833
  .set({
@@ -821,10 +839,10 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
821
839
  visibilityDeadline: null,
822
840
  })
823
841
  .from(updates)
824
- .where(and(eq(taskTable.id, updates.updateId), sql `${taskTable.token} IS NOT DISTINCT FROM ${updates.updateToken}`))
842
+ .where(and(eq(taskTable.id, updates.updateId), inArray(taskTable.id, tx.pgTransaction.select({ id: locked.id }).from(locked)), sql `${taskTable.token} IS NOT DISTINCT FROM ${updates.updateToken}`))
825
843
  .returning({ id: taskTable.id, status: taskTable.status }));
826
844
  const updatedRows = await tx.pgTransaction
827
- .with(updates, updated)
845
+ .with(updates, locked, updated)
828
846
  .select({ id: updated.id, status: updated.status })
829
847
  .from(updated);
830
848
  if (updatedRows.length > 0) {
@@ -879,6 +897,12 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
879
897
  updateComplete: sql `(complete_timestamp)`.as('update_complete'),
880
898
  })
881
899
  .from(sql `(VALUES ${sql.join(rows, sql `, `)}) AS t(id, token, tries, status, error, schedule_timestamp, complete_timestamp)`));
900
+ const locked = tx.pgTransaction.$with('locked').as((qb) => qb
901
+ .select({ id: taskTable.id })
902
+ .from(taskTable)
903
+ .innerJoin(updates, eq(taskTable.id, updates.updateId))
904
+ .orderBy(asc(taskTable.id))
905
+ .for('update'));
882
906
  const updated = tx.pgTransaction.$with('updated').as(() => tx.pgTransaction
883
907
  .update(taskTable)
884
908
  .set({
@@ -890,10 +914,10 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
890
914
  completeTimestamp: sql `${updates.updateComplete}`,
891
915
  })
892
916
  .from(updates)
893
- .where(and(eq(taskTable.id, updates.updateId), sql `${taskTable.token} IS NOT DISTINCT FROM ${updates.updateToken}`, eq(taskTable.tries, updates.updateTries)))
917
+ .where(and(eq(taskTable.id, updates.updateId), inArray(taskTable.id, tx.pgTransaction.select({ id: locked.id }).from(locked)), sql `${taskTable.token} IS NOT DISTINCT FROM ${updates.updateToken}`, eq(taskTable.tries, updates.updateTries)))
894
918
  .returning({ id: taskTable.id, status: taskTable.status }));
895
919
  const result = await tx.pgTransaction
896
- .with(updates, updated)
920
+ .with(updates, locked, updated)
897
921
  .select({ id: updated.id, status: updated.status })
898
922
  .from(updated);
899
923
  if (result.length > 0) {
@@ -916,7 +940,9 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
916
940
  await this.resolveDependenciesMany([{ id, status, namespace: options?.namespace }], options);
917
941
  }
918
942
  async resolveDependenciesMany(tasks, options) {
919
- const tasksToResolve = tasks.filter((t) => terminalStatuses.includes(t.status));
943
+ const tasksToResolve = tasks
944
+ .filter((t) => terminalStatuses.includes(t.status))
945
+ .toSorted((a, b) => a.id.localeCompare(b.id));
920
946
  if (tasksToResolve.length == 0) {
921
947
  return;
922
948
  }
@@ -1013,7 +1039,6 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
1013
1039
  }
1014
1040
  if (decrementsToApply.size > 0) {
1015
1041
  const decrementValues = [...decrementsToApply]
1016
- .toSorted(([idA], [idB]) => idA.localeCompare(idB))
1017
1042
  .map(([taskId, d]) => sql `(${taskId}::uuid, ${d.schedule}::int, ${d.complete}::int)`);
1018
1043
  const updates = tx.pgTransaction.$with('updates').as((qb) => qb
1019
1044
  .select({
@@ -1022,8 +1047,14 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
1022
1047
  completeDecrement: sql `(complete)::int`.as('complete_decrement'),
1023
1048
  })
1024
1049
  .from(sql `(VALUES ${sql.join(decrementValues, sql `, `)}) AS t(id, schedule, complete)`));
1050
+ const locked = tx.pgTransaction.$with('locked').as((qb) => qb
1051
+ .select({ id: taskTable.id })
1052
+ .from(taskTable)
1053
+ .innerJoin(updates, eq(taskTable.id, updates.taskId))
1054
+ .orderBy(asc(taskTable.id))
1055
+ .for('update'));
1025
1056
  const updatedRows = await tx.pgTransaction
1026
- .with(updates)
1057
+ .with(updates, locked)
1027
1058
  .update(taskTable)
1028
1059
  .set({
1029
1060
  unresolvedScheduleDependencies: greatest(0, sql `${taskTable.unresolvedScheduleDependencies} - ${updates.scheduleDecrement}`),
@@ -1034,7 +1065,7 @@ let PostgresTaskQueue = class PostgresTaskQueue extends TaskQueue {
1034
1065
  token: caseWhen(and(eq(taskTable.status, TaskStatus.WaitingChildren), eq(greatest(0, sql `${taskTable.unresolvedCompleteDependencies} - ${updates.completeDecrement}`), 0)), null).else(taskTable.token),
1035
1066
  })
1036
1067
  .from(updates)
1037
- .where(eq(taskTable.id, updates.taskId))
1068
+ .where(and(eq(taskTable.id, updates.taskId), inArray(taskTable.id, tx.pgTransaction.select({ id: locked.id }).from(locked))))
1038
1069
  .returning({
1039
1070
  id: taskTable.id,
1040
1071
  namespace: taskTable.namespace,