@cadenza.io/service 1.19.2 → 1.20.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/dist/index.d.mts CHANGED
@@ -85,6 +85,10 @@ interface DbOperationPayload {
85
85
  target: string[];
86
86
  action: OnConflictAction;
87
87
  };
88
+ awaitExists?: Record<string, {
89
+ table: string;
90
+ column: string;
91
+ }>;
88
92
  }
89
93
 
90
94
  declare class DatabaseTask extends DeputyTask {
@@ -277,6 +281,7 @@ interface TableDefinition {
277
281
  tableName: string;
278
282
  fields: string[];
279
283
  referenceFields: string[];
284
+ onDelete?: "cascade" | "set null" | "no action";
280
285
  }[];
281
286
  triggers?: Record<string, {
282
287
  when: "before" | "after";
package/dist/index.d.ts CHANGED
@@ -85,6 +85,10 @@ interface DbOperationPayload {
85
85
  target: string[];
86
86
  action: OnConflictAction;
87
87
  };
88
+ awaitExists?: Record<string, {
89
+ table: string;
90
+ column: string;
91
+ }>;
88
92
  }
89
93
 
90
94
  declare class DatabaseTask extends DeputyTask {
@@ -277,6 +281,7 @@ interface TableDefinition {
277
281
  tableName: string;
278
282
  fields: string[];
279
283
  referenceFields: string[];
284
+ onDelete?: "cascade" | "set null" | "no action";
280
285
  }[];
281
286
  triggers?: Record<string, {
282
287
  when: "before" | "after";
package/dist/index.js CHANGED
@@ -180,7 +180,7 @@ var DeputyTask = class extends import_core.Task {
180
180
  __localTaskName: this.name,
181
181
  __remoteRoutineName: this.remoteRoutineName,
182
182
  __serviceName: this.serviceName,
183
- __localRoutineExecId: metadata.__routineExecId,
183
+ __localRoutineExecId: metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,
184
184
  __executionTraceId: metadata.__executionTraceId ?? null,
185
185
  __metadata: {
186
186
  ...metadata,
@@ -2032,19 +2032,27 @@ var GraphMetadataController = class _GraphMetadataController {
2032
2032
  }
2033
2033
  delete ctx.data.context;
2034
2034
  return {
2035
- data: {
2036
- ...ctx.data,
2037
- service_name: CadenzaService.serviceRegistry.serviceName,
2038
- service_instance_id: CadenzaService.serviceRegistry.serviceInstanceId,
2039
- context_id: typeof context === "string" ? context : {
2040
- subOperation: "insert",
2041
- table: "context",
2042
- data: {
2043
- uuid: context.id,
2044
- context: context.context,
2045
- is_meta: ctx.data.isMeta
2046
- },
2047
- return: "uuid"
2035
+ queryData: {
2036
+ data: {
2037
+ ...ctx.data,
2038
+ service_name: CadenzaService.serviceRegistry.serviceName,
2039
+ service_instance_id: CadenzaService.serviceRegistry.serviceInstanceId,
2040
+ context_id: typeof context === "string" ? context : {
2041
+ subOperation: "insert",
2042
+ table: "context",
2043
+ data: {
2044
+ uuid: context.id,
2045
+ context: context.context,
2046
+ is_meta: ctx.data.isMeta
2047
+ },
2048
+ return: "uuid"
2049
+ }
2050
+ },
2051
+ awaitExists: {
2052
+ previousRoutineExecution: {
2053
+ table: "routine_execution",
2054
+ column: "uuid"
2055
+ }
2048
2056
  }
2049
2057
  }
2050
2058
  };
@@ -2208,6 +2216,13 @@ var SCHEMA_TYPES = [
2208
2216
  // src/database/DatabaseController.ts
2209
2217
  var import_pg = require("pg");
2210
2218
  var import_lodash_es = require("lodash-es");
2219
+
2220
+ // src/utils/promise.ts
2221
+ function sleep(ms) {
2222
+ return new Promise((resolve) => setTimeout(resolve, ms));
2223
+ }
2224
+
2225
+ // src/database/DatabaseController.ts
2211
2226
  var DatabaseController = class _DatabaseController {
2212
2227
  constructor() {
2213
2228
  this.dbClient = new import_pg.Pool({
@@ -2845,12 +2860,37 @@ var DatabaseController = class _DatabaseController {
2845
2860
  }
2846
2861
  }
2847
2862
  async insertFunction(tableName, context) {
2848
- const { data, transaction = true, fields = [], onConflict } = context;
2863
+ const {
2864
+ data,
2865
+ transaction = true,
2866
+ fields = [],
2867
+ onConflict,
2868
+ awaitExists
2869
+ } = context;
2849
2870
  if (!data || Array.isArray(data) && data.length === 0) {
2850
2871
  return { errored: true, __error: "No data provided for insert" };
2851
2872
  }
2852
2873
  const client = transaction ? await this.getClient() : this.dbClient;
2853
2874
  try {
2875
+ if (awaitExists) {
2876
+ for (const fk of Object.keys(awaitExists)) {
2877
+ if (data[fk] === void 0 || data[fk] === null) continue;
2878
+ const { table, column } = awaitExists[fk];
2879
+ let exists = false;
2880
+ let retries = 0;
2881
+ const maxRetries = 100;
2882
+ while (!exists && retries < maxRetries) {
2883
+ const result2 = await client.query(
2884
+ `SELECT EXISTS(SELECT 1 from ${table} where ${column}=${data[fk]}) AS "exists"`
2885
+ );
2886
+ console.log("Exists check", fk, result2);
2887
+ exists = result2.rows[0].exists;
2888
+ if (exists) break;
2889
+ retries++;
2890
+ await sleep(100);
2891
+ }
2892
+ }
2893
+ }
2854
2894
  if (transaction) await client.query("BEGIN");
2855
2895
  const resolvedData = await this.resolveNestedData(data, tableName);
2856
2896
  const isBatch = Array.isArray(resolvedData);
@@ -3107,7 +3147,7 @@ var DatabaseController = class _DatabaseController {
3107
3147
  console.log(
3108
3148
  "EXECUTED",
3109
3149
  `db${op.charAt(0).toUpperCase() + op.slice(1)}${tableNameFormatted}`,
3110
- JSON.stringify(context).slice(0, 100),
3150
+ context.errored ? JSON.stringify(context).slice(0, 500) : JSON.stringify(context).slice(0, 100),
3111
3151
  context.__error
3112
3152
  );
3113
3153
  delete context.queryData;
@@ -3179,6 +3219,7 @@ var GraphSyncController = class _GraphSyncController {
3179
3219
  }
3180
3220
  });
3181
3221
  for (const task of routine.tasks) {
3222
+ if (task.registered) continue;
3182
3223
  const tasks = task.getIterator();
3183
3224
  while (tasks.hasNext()) {
3184
3225
  const nextTask = tasks.next();
@@ -3200,14 +3241,14 @@ var GraphSyncController = class _GraphSyncController {
3200
3241
  if (!__signals) return;
3201
3242
  const filteredSignals = __signals.filter(
3202
3243
  (signal) => !signal.data.registered
3203
- );
3244
+ ).map((signal) => signal.signal);
3204
3245
  for (const signal of filteredSignals) {
3205
- const parts = signal.signal.split(".");
3246
+ const parts = signal.split(".");
3206
3247
  const domain = parts[0] === "meta" ? parts[1] : parts[0];
3207
3248
  const action = parts[parts.length - 1];
3208
3249
  emit("meta.sync_controller.signal_added", {
3209
3250
  data: {
3210
- name: signal.signal,
3251
+ name: signal,
3211
3252
  domain,
3212
3253
  action,
3213
3254
  isMeta: parts[0] === "meta",
@@ -3215,21 +3256,17 @@ var GraphSyncController = class _GraphSyncController {
3215
3256
  }
3216
3257
  });
3217
3258
  emit("meta.signal.registered", {
3218
- __signalName: signal.signal
3259
+ __signalName: signal
3219
3260
  });
3220
3261
  }
3221
3262
  }).doAfter(CadenzaService.broker.getSignalsTask);
3222
3263
  CadenzaService.createMetaTask("Split tasks for registration", (ctx, emit) => {
3223
3264
  const { __tasks } = ctx;
3224
3265
  if (!__tasks) return;
3225
- console.log(
3226
- "SPLITTING TASKS",
3227
- __tasks.length,
3228
- __tasks.map((t) => t.name)
3229
- );
3230
3266
  for (const task of __tasks) {
3231
3267
  if (task.registered) continue;
3232
3268
  task.registered = true;
3269
+ console.log("REGISTERING TASK", task.name);
3233
3270
  const { __functionString, __getTagCallback } = task.export();
3234
3271
  emit("meta.sync_controller.task_added", {
3235
3272
  data: {
@@ -3303,6 +3340,7 @@ var GraphSyncController = class _GraphSyncController {
3303
3340
  }
3304
3341
  for (const task of __tasks) {
3305
3342
  if (task.hidden || !task.register) continue;
3343
+ if (task.registered) continue;
3306
3344
  task.mapNext(
3307
3345
  (t) => emit("meta.sync_controller.task_map", {
3308
3346
  data: {