@cadenza.io/service 2.17.13 → 2.17.15

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.
@@ -433,16 +433,16 @@ function normalizeServiceTransportConfig(value) {
433
433
  }
434
434
  function normalizeServiceTransportDescriptor(value) {
435
435
  const raw = value ?? {};
436
- const uuid5 = normalizeString(raw.uuid);
436
+ const uuid6 = normalizeString(raw.uuid);
437
437
  const serviceInstanceId = normalizeString(
438
438
  raw.serviceInstanceId ?? raw.service_instance_id
439
439
  );
440
440
  const config = normalizeServiceTransportConfig(raw);
441
- if (!uuid5 || !serviceInstanceId || !config) {
441
+ if (!uuid6 || !serviceInstanceId || !config) {
442
442
  return null;
443
443
  }
444
444
  return {
445
- uuid: uuid5,
445
+ uuid: uuid6,
446
446
  serviceInstanceId,
447
447
  role: config.role,
448
448
  origin: config.origin,
@@ -504,14 +504,14 @@ function normalizeTransportArray(value, serviceInstanceId) {
504
504
  }
505
505
  function normalizeServiceInstanceDescriptor(value) {
506
506
  const raw = value ?? {};
507
- const uuid5 = normalizeString2(raw.uuid);
507
+ const uuid6 = normalizeString2(raw.uuid);
508
508
  const serviceName = normalizeString2(raw.serviceName ?? raw.service_name);
509
- if (!uuid5 || !serviceName) {
509
+ if (!uuid6 || !serviceName) {
510
510
  return null;
511
511
  }
512
- const transports = normalizeTransportArray(raw.transports, uuid5);
512
+ const transports = normalizeTransportArray(raw.transports, uuid6);
513
513
  return {
514
- uuid: uuid5,
514
+ uuid: uuid6,
515
515
  serviceName,
516
516
  numberOfRunningGraphs: Math.max(
517
517
  0,
@@ -542,6 +542,22 @@ function getRouteableTransport(instance, role, protocol) {
542
542
  return selectTransportForRole(instance.transports ?? [], role, protocol);
543
543
  }
544
544
 
545
+ // src/utils/delegation.ts
546
+ var import_uuid2 = require("uuid");
547
+ function ensureDelegationContextMetadata(input) {
548
+ const context = input && typeof input === "object" ? { ...input } : {};
549
+ const metadata = context.__metadata && typeof context.__metadata === "object" ? { ...context.__metadata } : {};
550
+ const deputyExecId = typeof metadata.__deputyExecId === "string" && metadata.__deputyExecId.length > 0 ? metadata.__deputyExecId : typeof context.__deputyExecId === "string" && context.__deputyExecId.length > 0 ? context.__deputyExecId : (0, import_uuid2.v4)();
551
+ return {
552
+ ...context,
553
+ __deputyExecId: deputyExecId,
554
+ __metadata: {
555
+ ...metadata,
556
+ __deputyExecId: deputyExecId
557
+ }
558
+ };
559
+ }
560
+
545
561
  // src/utils/readiness.ts
546
562
  function evaluateDependencyReadiness(input) {
547
563
  const missedHeartbeats = Math.max(
@@ -954,15 +970,15 @@ var ServiceRegistry = class _ServiceRegistry {
954
970
  if (!serviceInstance) {
955
971
  return false;
956
972
  }
957
- const uuid5 = serviceInstance.uuid;
973
+ const uuid6 = serviceInstance.uuid;
958
974
  const serviceName = serviceInstance.serviceName;
959
975
  const deleted = Boolean(
960
976
  ctx.deleted ?? ctx.serviceInstance?.deleted ?? ctx.data?.deleted
961
977
  );
962
- if (uuid5 === this.serviceInstanceId) return;
978
+ if (uuid6 === this.serviceInstanceId) return;
963
979
  if (deleted) {
964
- const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid5);
965
- const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid5) ?? -1;
980
+ const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid6);
981
+ const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid6) ?? -1;
966
982
  if (indexToDelete >= 0 && existingInstance) {
967
983
  this.instances.get(serviceName)?.splice(indexToDelete, 1);
968
984
  for (const transport of existingInstance.transports) {
@@ -974,13 +990,13 @@ var ServiceRegistry = class _ServiceRegistry {
974
990
  if (this.instances.get(serviceName)?.length === 0) {
975
991
  this.instances.delete(serviceName);
976
992
  }
977
- this.unregisterDependee(uuid5, serviceName);
993
+ this.unregisterDependee(uuid6, serviceName);
978
994
  return;
979
995
  }
980
996
  if (!this.instances.has(serviceName))
981
997
  this.instances.set(serviceName, []);
982
998
  const instances = this.instances.get(serviceName);
983
- const existing = instances.find((i) => i.uuid === uuid5);
999
+ const existing = instances.find((i) => i.uuid === uuid6);
984
1000
  if (existing) {
985
1001
  Object.assign(existing, {
986
1002
  ...serviceInstance,
@@ -990,7 +1006,7 @@ var ServiceRegistry = class _ServiceRegistry {
990
1006
  } else {
991
1007
  instances.push(serviceInstance);
992
1008
  }
993
- const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid5);
1009
+ const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid6);
994
1010
  if (trackedInstance) {
995
1011
  const snapshot = this.resolveRuntimeStatusSnapshot(
996
1012
  trackedInstance.numberOfRunningGraphs ?? 0,
@@ -1003,7 +1019,7 @@ var ServiceRegistry = class _ServiceRegistry {
1003
1019
  trackedInstance.reportedAt = trackedInstance.reportedAt ?? (/* @__PURE__ */ new Date()).toISOString();
1004
1020
  }
1005
1021
  if (!serviceInstance.isBootstrapPlaceholder) {
1006
- this.reconcileBootstrapPlaceholderInstance(serviceName, uuid5, emit);
1022
+ this.reconcileBootstrapPlaceholderInstance(serviceName, uuid6, emit);
1007
1023
  }
1008
1024
  if (this.serviceName === serviceName) {
1009
1025
  return false;
@@ -1029,7 +1045,7 @@ var ServiceRegistry = class _ServiceRegistry {
1029
1045
  if (!clientCreated) {
1030
1046
  emit("meta.service_registry.dependee_registered", {
1031
1047
  serviceName,
1032
- serviceInstanceId: uuid5,
1048
+ serviceInstanceId: uuid6,
1033
1049
  serviceTransportId: trackedTransport.uuid,
1034
1050
  serviceOrigin: trackedTransport.origin,
1035
1051
  transportProtocols: trackedTransport.protocols,
@@ -1043,7 +1059,7 @@ var ServiceRegistry = class _ServiceRegistry {
1043
1059
  } else {
1044
1060
  emit("meta.service_registry.routeable_transport_missing", {
1045
1061
  serviceName,
1046
- serviceInstanceId: uuid5,
1062
+ serviceInstanceId: uuid6,
1047
1063
  requiredRole: this.getRoutingTransportRole(),
1048
1064
  isFrontend: this.isFrontend
1049
1065
  });
@@ -1167,8 +1183,7 @@ var ServiceRegistry = class _ServiceRegistry {
1167
1183
  this.handleGlobalSignalRegistrationTask = CadenzaService.createMetaTask(
1168
1184
  "Handle global Signal Registration",
1169
1185
  (ctx) => {
1170
- const { signalToTaskMaps } = ctx;
1171
- const sortedSignalToTaskMap = signalToTaskMaps.sort(
1186
+ const sortedSignalToTaskMap = this.normalizeSignalMaps(ctx).sort(
1172
1187
  (a, b) => {
1173
1188
  if (a.deleted && !b.deleted) return -1;
1174
1189
  if (!a.deleted && b.deleted) return 1;
@@ -1406,22 +1421,14 @@ var ServiceRegistry = class _ServiceRegistry {
1406
1421
  },
1407
1422
  ctx.inquiryOptions ?? ctx.__inquiryOptions ?? {}
1408
1423
  );
1409
- const signalToTaskMaps = (inquiryResult.signalToTaskMaps ?? []).filter((m) => !!m.isGlobal).map((m) => ({
1410
- signalName: m.signalName,
1411
- serviceName: m.serviceName,
1412
- deleted: !!m.deleted
1413
- }));
1414
- const intentToTaskMaps = (inquiryResult.intentToTaskMaps ?? []).map(
1415
- (m) => ({
1416
- intentName: m.intentName,
1417
- taskName: m.taskName,
1418
- taskVersion: m.taskVersion ?? 1,
1419
- serviceName: m.serviceName,
1420
- deleted: !!m.deleted
1421
- })
1424
+ const signalToTaskMaps = this.normalizeSignalMaps(
1425
+ inquiryResult
1426
+ ).filter((m) => !!m.isGlobal);
1427
+ const intentToTaskMaps = this.normalizeIntentMaps(
1428
+ inquiryResult
1422
1429
  );
1423
- const serviceInstances = (inquiryResult.serviceInstances ?? []).map((instance) => normalizeServiceInstanceDescriptor(instance)).filter(
1424
- (instance) => !!instance && !!instance.isActive && !instance.isNonResponsive && !instance.isBlocked
1430
+ const serviceInstances = this.normalizeServiceInstancesFromSync(
1431
+ inquiryResult
1425
1432
  );
1426
1433
  return {
1427
1434
  ...ctx,
@@ -1506,6 +1513,9 @@ var ServiceRegistry = class _ServiceRegistry {
1506
1513
  this.getBalancedInstance = CadenzaService.createMetaTask(
1507
1514
  "Get balanced instance",
1508
1515
  (context, emit) => {
1516
+ if (context.__remoteRoutineName !== void 0) {
1517
+ context = ensureDelegationContextMetadata(context);
1518
+ }
1509
1519
  const {
1510
1520
  __serviceName,
1511
1521
  __triedInstances,
@@ -2244,9 +2254,47 @@ var ServiceRegistry = class _ServiceRegistry {
2244
2254
  buildRemoteIntentDeputyKey(map) {
2245
2255
  return `${map.intentName}|${map.serviceName}|${map.taskName}|${map.taskVersion ?? 1}`;
2246
2256
  }
2257
+ readArrayPayload(ctx, keys) {
2258
+ for (const key of keys) {
2259
+ const value = ctx?.[key];
2260
+ if (Array.isArray(value)) {
2261
+ return value;
2262
+ }
2263
+ }
2264
+ if (Array.isArray(ctx?.rows)) {
2265
+ return ctx.rows;
2266
+ }
2267
+ if (Array.isArray(ctx?.data)) {
2268
+ return ctx.data;
2269
+ }
2270
+ return [];
2271
+ }
2272
+ normalizeSignalMaps(ctx) {
2273
+ return this.readArrayPayload(ctx, [
2274
+ "signalToTaskMaps",
2275
+ "signal_to_task_maps",
2276
+ "signalToTaskMap",
2277
+ "signal_to_task_map"
2278
+ ]).map((map) => ({
2279
+ signalName: String(
2280
+ map.signalName ?? map.signal_name ?? ""
2281
+ ).trim(),
2282
+ serviceName: String(
2283
+ map.serviceName ?? map.service_name ?? ""
2284
+ ).trim(),
2285
+ isGlobal: Boolean(map.isGlobal ?? map.is_global ?? false),
2286
+ deleted: Boolean(map.deleted)
2287
+ })).filter((map) => map.signalName && map.serviceName);
2288
+ }
2247
2289
  normalizeIntentMaps(ctx) {
2248
- if (Array.isArray(ctx.intentToTaskMaps)) {
2249
- return ctx.intentToTaskMaps.map((m) => ({
2290
+ const arrayPayload = this.readArrayPayload(ctx, [
2291
+ "intentToTaskMaps",
2292
+ "intent_to_task_maps",
2293
+ "intentToTaskMap",
2294
+ "intent_to_task_map"
2295
+ ]);
2296
+ if (arrayPayload.length > 0) {
2297
+ return arrayPayload.map((m) => ({
2250
2298
  intentName: m.intentName ?? m.intent_name,
2251
2299
  serviceName: m.serviceName ?? m.service_name,
2252
2300
  taskName: m.taskName ?? m.task_name,
@@ -2254,7 +2302,7 @@ var ServiceRegistry = class _ServiceRegistry {
2254
2302
  deleted: !!m.deleted
2255
2303
  })).filter((m) => m.intentName && m.serviceName && m.taskName);
2256
2304
  }
2257
- const single = ctx.intentToTaskMap ?? ctx.data ?? (ctx.intentName ? ctx : void 0);
2305
+ const single = ctx.intentToTaskMap ?? ctx.intent_to_task_map ?? ctx.data ?? (ctx.intentName ? ctx : void 0);
2258
2306
  if (!single) return [];
2259
2307
  const normalized = {
2260
2308
  intentName: single.intentName ?? single.intent_name,
@@ -2267,6 +2315,40 @@ var ServiceRegistry = class _ServiceRegistry {
2267
2315
  return [];
2268
2316
  return [normalized];
2269
2317
  }
2318
+ normalizeServiceInstancesFromSync(ctx) {
2319
+ const rawTransports = this.readArrayPayload(ctx, [
2320
+ "serviceInstanceTransports",
2321
+ "service_instance_transports",
2322
+ "serviceInstanceTransport",
2323
+ "service_instance_transport"
2324
+ ]).map((transport) => normalizeServiceTransportDescriptor(transport)).filter(
2325
+ (transport) => !!transport && !transport.deleted
2326
+ );
2327
+ const transportsByInstance = /* @__PURE__ */ new Map();
2328
+ for (const transport of rawTransports) {
2329
+ if (!transportsByInstance.has(transport.serviceInstanceId)) {
2330
+ transportsByInstance.set(transport.serviceInstanceId, []);
2331
+ }
2332
+ transportsByInstance.get(transport.serviceInstanceId).push(transport);
2333
+ }
2334
+ return this.readArrayPayload(ctx, [
2335
+ "serviceInstances",
2336
+ "service_instances",
2337
+ "serviceInstance",
2338
+ "service_instance"
2339
+ ]).map(
2340
+ (instance) => normalizeServiceInstanceDescriptor({
2341
+ ...instance,
2342
+ transports: Array.isArray(instance?.transports) && instance.transports.length > 0 ? instance.transports : transportsByInstance.get(
2343
+ String(
2344
+ instance?.uuid ?? instance?.serviceInstanceId ?? instance?.service_instance_id ?? ""
2345
+ ).trim()
2346
+ ) ?? []
2347
+ })
2348
+ ).filter(
2349
+ (instance) => !!instance && !!instance.isActive && !instance.isNonResponsive && !instance.isBlocked
2350
+ );
2351
+ }
2270
2352
  registerRemoteIntentDeputy(map) {
2271
2353
  if (!this.serviceName || map.serviceName === this.serviceName) {
2272
2354
  return;
@@ -3185,7 +3267,7 @@ var ServiceRegistry = class _ServiceRegistry {
3185
3267
 
3186
3268
  // src/graph/definition/SignalTransmissionTask.ts
3187
3269
  var import_core2 = require("@cadenza.io/core");
3188
- var import_uuid2 = require("uuid");
3270
+ var import_uuid3 = require("uuid");
3189
3271
  var SignalTransmissionTask = class extends import_core2.Task {
3190
3272
  /**
3191
3273
  * Constructs a new instance of the class and initializes it with the provided parameters.
@@ -3214,7 +3296,7 @@ var SignalTransmissionTask = class extends import_core2.Task {
3214
3296
  */
3215
3297
  constructor(name, signalName, serviceName, description = "", concurrency = 0, timeout = 0, register = true, isUnique = false, isMeta = true, isSubMeta = false, isHidden = false, getTagCallback = void 0, inputSchema = void 0, validateInputContext = false, outputSchema = void 0, validateOutputContext = false, retryCount = 0, retryDelay = 0, retryDelayMax = 0, retryDelayFactor = 1) {
3216
3298
  const taskFunction = (context) => {
3217
- context.__routineExecId = (0, import_uuid2.v4)();
3299
+ context.__routineExecId = (0, import_uuid3.v4)();
3218
3300
  return context;
3219
3301
  };
3220
3302
  super(
@@ -3394,6 +3476,8 @@ var RestController = class _RestController {
3394
3476
  if (delegateCtx.__remoteRoutineName === void 0) {
3395
3477
  return;
3396
3478
  }
3479
+ const normalizedDelegateCtx = ensureDelegationContextMetadata(delegateCtx);
3480
+ const deputyExecId = normalizedDelegateCtx.__metadata.__deputyExecId;
3397
3481
  fetchDiagnostics.delegationRequests++;
3398
3482
  fetchDiagnostics.updatedAt = Date.now();
3399
3483
  let resultContext;
@@ -3405,7 +3489,7 @@ var RestController = class _RestController {
3405
3489
  "Content-Type": "application/json"
3406
3490
  },
3407
3491
  method: "POST",
3408
- body: JSON.stringify(delegateCtx)
3492
+ body: JSON.stringify(normalizedDelegateCtx)
3409
3493
  },
3410
3494
  3e4
3411
3495
  );
@@ -3416,14 +3500,11 @@ var RestController = class _RestController {
3416
3500
  resultContext = {
3417
3501
  __error: `Error: ${error}`,
3418
3502
  errored: true,
3419
- ...delegateCtx,
3420
- ...delegateCtx.__metadata
3503
+ ...normalizedDelegateCtx,
3504
+ ...normalizedDelegateCtx.__metadata
3421
3505
  };
3422
3506
  } finally {
3423
- emit(
3424
- `meta.fetch.delegated:${delegateCtx.__metadata.__deputyExecId}`,
3425
- resultContext
3426
- );
3507
+ emit(`meta.fetch.delegated:${deputyExecId}`, resultContext);
3427
3508
  }
3428
3509
  return resultContext;
3429
3510
  },
@@ -4102,11 +4183,12 @@ var SocketController = class _SocketController {
4102
4183
  CadenzaService.emit("meta.socket.handshake", ctx);
4103
4184
  });
4104
4185
  ws.on("delegation", (ctx, callback) => {
4105
- const deputyExecId = ctx.__metadata.__deputyExecId;
4186
+ const delegationCtx = ensureDelegationContextMetadata(ctx);
4187
+ const deputyExecId = delegationCtx.__metadata.__deputyExecId;
4106
4188
  CadenzaService.createEphemeralMetaTask(
4107
4189
  "Resolve delegation",
4108
- (delegationCtx) => {
4109
- callback(delegationCtx);
4190
+ (delegationCtx2) => {
4191
+ callback(delegationCtx2);
4110
4192
  },
4111
4193
  "Resolves a delegation request using client callback.",
4112
4194
  { register: false }
@@ -4129,8 +4211,8 @@ var SocketController = class _SocketController {
4129
4211
  `meta.node.graph_completed:${deputyExecId}`
4130
4212
  ).emitsOnFail(`meta.socket.progress_failed:${deputyExecId}`);
4131
4213
  CadenzaService.emit("meta.socket.delegation_requested", {
4132
- ...ctx,
4133
- __name: ctx.__remoteRoutineName
4214
+ ...delegationCtx,
4215
+ __name: delegationCtx.__remoteRoutineName
4134
4216
  });
4135
4217
  });
4136
4218
  ws.on("signal", (ctx, callback) => {
@@ -4750,9 +4832,10 @@ var SocketController = class _SocketController {
4750
4832
  if (delegateCtx.__remoteRoutineName === void 0) {
4751
4833
  return;
4752
4834
  }
4753
- delete delegateCtx.__isSubMeta;
4754
- delete delegateCtx.__broadcast;
4755
- const deputyExecId = delegateCtx.__metadata?.__deputyExecId;
4835
+ const normalizedDelegateCtx = ensureDelegationContextMetadata(delegateCtx);
4836
+ delete normalizedDelegateCtx.__isSubMeta;
4837
+ delete normalizedDelegateCtx.__broadcast;
4838
+ const deputyExecId = normalizedDelegateCtx.__metadata?.__deputyExecId;
4756
4839
  const requestSentAt = Date.now();
4757
4840
  if (deputyExecId) {
4758
4841
  runtimeHandle.pendingDelegationIds.add(deputyExecId);
@@ -4761,8 +4844,8 @@ var SocketController = class _SocketController {
4761
4844
  try {
4762
4845
  const resultContext = await runtimeHandle.emitWhenReady?.(
4763
4846
  "delegation",
4764
- delegateCtx,
4765
- delegateCtx.__timeout ?? 6e4
4847
+ normalizedDelegateCtx,
4848
+ normalizedDelegateCtx.__timeout ?? 6e4
4766
4849
  ) ?? {
4767
4850
  errored: true,
4768
4851
  __error: "Socket delegation returned no response"
@@ -5627,7 +5710,7 @@ var DatabaseController = class _DatabaseController {
5627
5710
  };
5628
5711
 
5629
5712
  // src/Cadenza.ts
5630
- var import_uuid3 = require("uuid");
5713
+ var import_uuid4 = require("uuid");
5631
5714
 
5632
5715
  // src/graph/controllers/GraphSyncController.ts
5633
5716
  var ACTOR_TASK_METADATA = /* @__PURE__ */ Symbol.for("@cadenza.io/core/actor-task-meta");
@@ -6735,7 +6818,7 @@ var CadenzaService = class {
6735
6818
  (transport) => !!transport
6736
6819
  ).map((transport) => ({
6737
6820
  ...transport,
6738
- uuid: (0, import_uuid3.v4)()
6821
+ uuid: (0, import_uuid4.v4)()
6739
6822
  }));
6740
6823
  }
6741
6824
  static createBootstrapTransport(serviceInstanceId, role, endpoint) {
@@ -6979,7 +7062,7 @@ var CadenzaService = class {
6979
7062
  }
6980
7063
  for (const responder of responders) {
6981
7064
  const { task, descriptor } = responder;
6982
- const inquiryId = (0, import_uuid3.v4)();
7065
+ const inquiryId = (0, import_uuid4.v4)();
6983
7066
  startTimeByTask.set(task, Date.now());
6984
7067
  const resolverTask = this.createEphemeralMetaTask(
6985
7068
  `Resolve inquiry ${inquiry} for ${descriptor.localTaskName}`,
@@ -7470,7 +7553,7 @@ var CadenzaService = class {
7470
7553
  this.bootstrap();
7471
7554
  this.validateName(serviceName);
7472
7555
  this.validateServiceName(serviceName);
7473
- const serviceId = options.customServiceId ?? (0, import_uuid3.v4)();
7556
+ const serviceId = options.customServiceId ?? (0, import_uuid4.v4)();
7474
7557
  this.serviceRegistry.serviceName = serviceName;
7475
7558
  this.serviceRegistry.serviceInstanceId = serviceId;
7476
7559
  this.setHydrationResults(options.hydration);
@@ -8298,7 +8381,7 @@ CadenzaService.frontendSyncScheduled = false;
8298
8381
  var import_core5 = require("@cadenza.io/core");
8299
8382
 
8300
8383
  // src/ssr/createSSRInquiryBridge.ts
8301
- var import_uuid4 = require("uuid");
8384
+ var import_uuid5 = require("uuid");
8302
8385
  function ensureFetch() {
8303
8386
  if (typeof globalThis.fetch !== "function") {
8304
8387
  throw new Error("SSR inquiry bridge requires global fetch support.");
@@ -8387,7 +8470,7 @@ function createSSRInquiryBridge(options = {}) {
8387
8470
  __remoteRoutineName: remoteRoutineName,
8388
8471
  __metadata: {
8389
8472
  ...context.__metadata ?? {},
8390
- __deputyExecId: (0, import_uuid4.v4)()
8473
+ __deputyExecId: (0, import_uuid5.v4)()
8391
8474
  }
8392
8475
  }),
8393
8476
  signal