@cadenza.io/service 2.17.32 → 2.17.34
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/browser/index.js +397 -136
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/index.mjs +354 -94
- package/dist/browser/index.mjs.map +1 -1
- package/dist/index.js +399 -138
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +356 -96
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/browser/index.mjs
CHANGED
|
@@ -249,7 +249,7 @@ var DatabaseTask = class extends DeputyTask {
|
|
|
249
249
|
};
|
|
250
250
|
|
|
251
251
|
// src/registry/ServiceRegistry.ts
|
|
252
|
-
import {
|
|
252
|
+
import { v4 as uuid3 } from "uuid";
|
|
253
253
|
|
|
254
254
|
// src/utils/environment.ts
|
|
255
255
|
var isNode = typeof process !== "undefined" && process.versions?.node != null;
|
|
@@ -385,16 +385,16 @@ function normalizeServiceTransportConfig(value) {
|
|
|
385
385
|
}
|
|
386
386
|
function normalizeServiceTransportDescriptor(value) {
|
|
387
387
|
const raw = value ?? {};
|
|
388
|
-
const
|
|
388
|
+
const uuid8 = normalizeString(raw.uuid);
|
|
389
389
|
const serviceInstanceId = normalizeString(
|
|
390
390
|
raw.serviceInstanceId ?? raw.service_instance_id
|
|
391
391
|
);
|
|
392
392
|
const config = normalizeServiceTransportConfig(raw);
|
|
393
|
-
if (!
|
|
393
|
+
if (!uuid8 || !serviceInstanceId || !config) {
|
|
394
394
|
return null;
|
|
395
395
|
}
|
|
396
396
|
return {
|
|
397
|
-
uuid:
|
|
397
|
+
uuid: uuid8,
|
|
398
398
|
serviceInstanceId,
|
|
399
399
|
role: config.role,
|
|
400
400
|
origin: config.origin,
|
|
@@ -456,14 +456,14 @@ function normalizeTransportArray(value, serviceInstanceId) {
|
|
|
456
456
|
}
|
|
457
457
|
function normalizeServiceInstanceDescriptor(value) {
|
|
458
458
|
const raw = value ?? {};
|
|
459
|
-
const
|
|
459
|
+
const uuid8 = normalizeString2(raw.uuid);
|
|
460
460
|
const serviceName = normalizeString2(raw.serviceName ?? raw.service_name);
|
|
461
|
-
if (!
|
|
461
|
+
if (!uuid8 || !serviceName) {
|
|
462
462
|
return null;
|
|
463
463
|
}
|
|
464
|
-
const transports = normalizeTransportArray(raw.transports,
|
|
464
|
+
const transports = normalizeTransportArray(raw.transports, uuid8);
|
|
465
465
|
return {
|
|
466
|
-
uuid:
|
|
466
|
+
uuid: uuid8,
|
|
467
467
|
serviceName,
|
|
468
468
|
numberOfRunningGraphs: Math.max(
|
|
469
469
|
0,
|
|
@@ -723,6 +723,8 @@ function normalizeServiceRegistryInsertResult(tableName, ctx, queryData, rawResu
|
|
|
723
723
|
return rawResult;
|
|
724
724
|
}
|
|
725
725
|
const result = { ...rawResult };
|
|
726
|
+
delete result.__resolverOriginalContext;
|
|
727
|
+
delete result.__resolverQueryData;
|
|
726
728
|
const normalizedQueryData = result.queryData && typeof result.queryData === "object" ? { ...result.queryData } : { ...queryData };
|
|
727
729
|
const resolvedData = result.data ?? normalizedQueryData.data ?? queryData.data ?? ctx.data ?? ctx.__registrationData;
|
|
728
730
|
if (resolvedData !== void 0 && result.data === void 0) {
|
|
@@ -734,12 +736,18 @@ function normalizeServiceRegistryInsertResult(tableName, ctx, queryData, rawResu
|
|
|
734
736
|
result.queryData = normalizedQueryData;
|
|
735
737
|
if (tableName === "service") {
|
|
736
738
|
const resolvedServiceName = String(
|
|
737
|
-
result.__serviceName ?? resolvedData?.name ?? resolvedData?.service_name ??
|
|
739
|
+
ctx.__serviceName ?? result.__serviceName ?? resolvedData?.name ?? resolvedData?.service_name ?? ""
|
|
738
740
|
).trim();
|
|
739
741
|
if (resolvedServiceName) {
|
|
740
742
|
result.__serviceName = resolvedServiceName;
|
|
741
743
|
}
|
|
742
744
|
}
|
|
745
|
+
const resolvedLocalServiceInstanceId = String(
|
|
746
|
+
ctx.__serviceInstanceId ?? resolvedData?.uuid ?? resolvedData?.service_instance_id ?? ""
|
|
747
|
+
).trim();
|
|
748
|
+
if (resolvedLocalServiceInstanceId) {
|
|
749
|
+
result.__serviceInstanceId = resolvedLocalServiceInstanceId;
|
|
750
|
+
}
|
|
743
751
|
if (tableName === "service_instance" || tableName === "service_instance_transport") {
|
|
744
752
|
const resolvedUuid = String(
|
|
745
753
|
result.uuid ?? resolvedData?.uuid ?? ctx.__serviceInstanceId ?? ""
|
|
@@ -756,49 +764,105 @@ function resolveServiceRegistryInsertTask(tableName, queryData = {}, options = {
|
|
|
756
764
|
queryData,
|
|
757
765
|
options
|
|
758
766
|
);
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
767
|
+
const localExecutionRequestedSignal = `meta.service_registry.insert_execution_requested:${tableName}:local`;
|
|
768
|
+
const remoteExecutionRequestedSignal = `meta.service_registry.insert_execution_requested:${tableName}:remote`;
|
|
769
|
+
const executionResolvedSignal = `meta.service_registry.insert_execution_resolved:${tableName}`;
|
|
770
|
+
const executionFailedSignal = `meta.service_registry.insert_execution_failed:${tableName}`;
|
|
771
|
+
const createPrepareExecutionTask = (signalName) => CadenzaService.createMetaTask(
|
|
772
|
+
`Prepare service registry insert execution for ${tableName} (${signalName})`,
|
|
773
|
+
(ctx) => {
|
|
762
774
|
const nextQueryData = buildServiceRegistryInsertQueryData(ctx, queryData);
|
|
763
|
-
if (tableName === "service" && nextQueryData.data === void 0) {
|
|
764
|
-
CadenzaService.log(
|
|
765
|
-
"Service registry insert resolver missing service payload.",
|
|
766
|
-
{
|
|
767
|
-
ctxKeys: ctx && typeof ctx === "object" ? Object.keys(ctx).sort() : [],
|
|
768
|
-
hasData: !!ctx && typeof ctx === "object" && (Object.prototype.hasOwnProperty.call(ctx, "data") || ctx.data !== void 0),
|
|
769
|
-
hasRegistrationData: !!ctx && typeof ctx === "object" && (Object.prototype.hasOwnProperty.call(ctx, "__registrationData") || ctx.__registrationData !== void 0),
|
|
770
|
-
serviceName: ctx?.__serviceName ?? ctx?.data?.name ?? null
|
|
771
|
-
},
|
|
772
|
-
"warning"
|
|
773
|
-
);
|
|
774
|
-
}
|
|
775
|
-
const targetTask = CadenzaService.getLocalCadenzaDBInsertTask(tableName) ?? remoteInsertTask;
|
|
776
775
|
const delegationContext = ensureDelegationContextMetadata({
|
|
777
776
|
...ctx,
|
|
778
777
|
queryData: nextQueryData
|
|
779
778
|
});
|
|
780
779
|
delegationContext.__metadata.__skipRemoteExecution = delegationContext.__metadata.__skipRemoteExecution ?? delegationContext.__skipRemoteExecution ?? false;
|
|
781
780
|
delegationContext.__metadata.__blockRemoteExecution = delegationContext.__metadata.__blockRemoteExecution ?? delegationContext.__blockRemoteExecution ?? false;
|
|
782
|
-
return
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
781
|
+
return {
|
|
782
|
+
...delegationContext,
|
|
783
|
+
__resolverOriginalContext: {
|
|
784
|
+
...ctx
|
|
785
|
+
},
|
|
786
|
+
__resolverQueryData: nextQueryData
|
|
787
|
+
};
|
|
788
|
+
},
|
|
789
|
+
`Prepares ${tableName} service-registry insert payloads for runner execution.`,
|
|
790
|
+
{
|
|
791
|
+
register: false,
|
|
792
|
+
isHidden: true
|
|
793
|
+
}
|
|
794
|
+
).doOn(signalName).emitsOnFail(executionFailedSignal);
|
|
795
|
+
const prepareLocalExecutionTask = createPrepareExecutionTask(
|
|
796
|
+
localExecutionRequestedSignal
|
|
797
|
+
);
|
|
798
|
+
const prepareRemoteExecutionTask = createPrepareExecutionTask(
|
|
799
|
+
remoteExecutionRequestedSignal
|
|
800
|
+
);
|
|
801
|
+
const finalizeExecutionTask = CadenzaService.createMetaTask(
|
|
802
|
+
`Finalize service registry insert execution for ${tableName}`,
|
|
803
|
+
(ctx, emit) => {
|
|
804
|
+
if (!ctx.__resolverRequestId) {
|
|
805
|
+
return false;
|
|
806
|
+
}
|
|
807
|
+
const normalized = normalizeServiceRegistryInsertResult(
|
|
808
|
+
tableName,
|
|
809
|
+
ctx.__resolverOriginalContext ?? ctx,
|
|
810
|
+
ctx.__resolverQueryData ?? ctx.queryData ?? {},
|
|
811
|
+
ctx
|
|
800
812
|
);
|
|
813
|
+
if (!normalized || typeof normalized !== "object") {
|
|
814
|
+
return normalized;
|
|
815
|
+
}
|
|
816
|
+
emit(executionResolvedSignal, normalized);
|
|
817
|
+
return normalized;
|
|
801
818
|
},
|
|
819
|
+
`Normalizes ${tableName} service-registry insert results for resolver callers.`,
|
|
820
|
+
{
|
|
821
|
+
register: false,
|
|
822
|
+
isHidden: true
|
|
823
|
+
}
|
|
824
|
+
);
|
|
825
|
+
const wiredLocalTaskNames = /* @__PURE__ */ new Set();
|
|
826
|
+
const wireExecutionTarget = (targetTask, prepareTask) => {
|
|
827
|
+
targetTask.then(finalizeExecutionTask).emitsOnFail(executionFailedSignal);
|
|
828
|
+
prepareTask.then(targetTask);
|
|
829
|
+
};
|
|
830
|
+
wireExecutionTarget(remoteInsertTask, prepareRemoteExecutionTask);
|
|
831
|
+
return CadenzaService.createUniqueMetaTask(
|
|
832
|
+
`Resolve service registry insert for ${tableName}`,
|
|
833
|
+
(ctx, emit) => new Promise((resolve) => {
|
|
834
|
+
const resolverRequestId = uuid3();
|
|
835
|
+
CadenzaService.createEphemeralMetaTask(
|
|
836
|
+
`Resolve service registry insert execution for ${tableName} (${resolverRequestId})`,
|
|
837
|
+
(resultCtx) => {
|
|
838
|
+
if (resultCtx.__resolverRequestId !== resolverRequestId) {
|
|
839
|
+
return false;
|
|
840
|
+
}
|
|
841
|
+
const normalizedResult = {
|
|
842
|
+
...resultCtx
|
|
843
|
+
};
|
|
844
|
+
delete normalizedResult.__resolverRequestId;
|
|
845
|
+
delete normalizedResult.__resolverOriginalContext;
|
|
846
|
+
delete normalizedResult.__resolverQueryData;
|
|
847
|
+
resolve(normalizedResult);
|
|
848
|
+
return normalizedResult;
|
|
849
|
+
},
|
|
850
|
+
`Resolves signal-driven ${tableName} service-registry insert execution.`,
|
|
851
|
+
{
|
|
852
|
+
register: false
|
|
853
|
+
}
|
|
854
|
+
).doOn(executionResolvedSignal, executionFailedSignal);
|
|
855
|
+
const localInsertTask = CadenzaService.getLocalCadenzaDBInsertTask(tableName);
|
|
856
|
+
const executionSignal = localInsertTask ? localExecutionRequestedSignal : remoteExecutionRequestedSignal;
|
|
857
|
+
if (localInsertTask && !wiredLocalTaskNames.has(localInsertTask.name)) {
|
|
858
|
+
wireExecutionTarget(localInsertTask, prepareLocalExecutionTask);
|
|
859
|
+
wiredLocalTaskNames.add(localInsertTask.name);
|
|
860
|
+
}
|
|
861
|
+
emit(executionSignal, {
|
|
862
|
+
...ctx,
|
|
863
|
+
__resolverRequestId: resolverRequestId
|
|
864
|
+
});
|
|
865
|
+
}),
|
|
802
866
|
`Resolves ${tableName} inserts through the local CadenzaDB task when available.`,
|
|
803
867
|
options
|
|
804
868
|
);
|
|
@@ -1036,15 +1100,15 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1036
1100
|
if (!serviceInstance) {
|
|
1037
1101
|
return false;
|
|
1038
1102
|
}
|
|
1039
|
-
const
|
|
1103
|
+
const uuid8 = serviceInstance.uuid;
|
|
1040
1104
|
const serviceName = serviceInstance.serviceName;
|
|
1041
1105
|
const deleted = Boolean(
|
|
1042
1106
|
ctx.deleted ?? ctx.serviceInstance?.deleted ?? ctx.data?.deleted
|
|
1043
1107
|
);
|
|
1044
|
-
if (
|
|
1108
|
+
if (uuid8 === this.serviceInstanceId) return;
|
|
1045
1109
|
if (deleted) {
|
|
1046
|
-
const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid ===
|
|
1047
|
-
const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid ===
|
|
1110
|
+
const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid8);
|
|
1111
|
+
const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid8) ?? -1;
|
|
1048
1112
|
if (indexToDelete >= 0 && existingInstance) {
|
|
1049
1113
|
this.instances.get(serviceName)?.splice(indexToDelete, 1);
|
|
1050
1114
|
for (const transport of existingInstance.transports) {
|
|
@@ -1056,13 +1120,13 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1056
1120
|
if (this.instances.get(serviceName)?.length === 0) {
|
|
1057
1121
|
this.instances.delete(serviceName);
|
|
1058
1122
|
}
|
|
1059
|
-
this.unregisterDependee(
|
|
1123
|
+
this.unregisterDependee(uuid8, serviceName);
|
|
1060
1124
|
return;
|
|
1061
1125
|
}
|
|
1062
1126
|
if (!this.instances.has(serviceName))
|
|
1063
1127
|
this.instances.set(serviceName, []);
|
|
1064
1128
|
const instances = this.instances.get(serviceName);
|
|
1065
|
-
const existing = instances.find((i) => i.uuid ===
|
|
1129
|
+
const existing = instances.find((i) => i.uuid === uuid8);
|
|
1066
1130
|
if (existing) {
|
|
1067
1131
|
Object.assign(existing, {
|
|
1068
1132
|
...serviceInstance,
|
|
@@ -1072,7 +1136,7 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1072
1136
|
} else {
|
|
1073
1137
|
instances.push(serviceInstance);
|
|
1074
1138
|
}
|
|
1075
|
-
const trackedInstance = existing ?? instances.find((instance) => instance.uuid ===
|
|
1139
|
+
const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid8);
|
|
1076
1140
|
if (trackedInstance) {
|
|
1077
1141
|
const snapshot = this.resolveRuntimeStatusSnapshot(
|
|
1078
1142
|
trackedInstance.numberOfRunningGraphs ?? 0,
|
|
@@ -1085,16 +1149,19 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1085
1149
|
trackedInstance.reportedAt = trackedInstance.reportedAt ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
1086
1150
|
}
|
|
1087
1151
|
if (!serviceInstance.isBootstrapPlaceholder) {
|
|
1088
|
-
this.reconcileBootstrapPlaceholderInstance(serviceName,
|
|
1152
|
+
this.reconcileBootstrapPlaceholderInstance(serviceName, uuid8, emit);
|
|
1089
1153
|
}
|
|
1090
1154
|
if (this.serviceName === serviceName) {
|
|
1091
1155
|
return false;
|
|
1092
1156
|
}
|
|
1157
|
+
if (trackedInstance?.isFrontend) {
|
|
1158
|
+
return true;
|
|
1159
|
+
}
|
|
1093
1160
|
const trackedTransport = this.getRouteableTransport(
|
|
1094
1161
|
trackedInstance,
|
|
1095
1162
|
this.useSocket ? "socket" : "rest"
|
|
1096
1163
|
);
|
|
1097
|
-
if (
|
|
1164
|
+
if (this.deputies.has(serviceName) || this.remoteIntents.has(serviceName) || this.remoteSignals.has(serviceName)) {
|
|
1098
1165
|
const communicationTypes = Array.from(
|
|
1099
1166
|
new Set(
|
|
1100
1167
|
this.deputies.get(serviceName)?.map((d) => d.communicationType) ?? []
|
|
@@ -1111,7 +1178,7 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1111
1178
|
if (!clientCreated) {
|
|
1112
1179
|
emit("meta.service_registry.dependee_registered", {
|
|
1113
1180
|
serviceName,
|
|
1114
|
-
serviceInstanceId:
|
|
1181
|
+
serviceInstanceId: uuid8,
|
|
1115
1182
|
serviceTransportId: trackedTransport.uuid,
|
|
1116
1183
|
serviceOrigin: trackedTransport.origin,
|
|
1117
1184
|
transportProtocols: trackedTransport.protocols,
|
|
@@ -1125,7 +1192,7 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1125
1192
|
} else {
|
|
1126
1193
|
emit("meta.service_registry.routeable_transport_missing", {
|
|
1127
1194
|
serviceName,
|
|
1128
|
-
serviceInstanceId:
|
|
1195
|
+
serviceInstanceId: uuid8,
|
|
1129
1196
|
requiredRole: this.getRoutingTransportRole(),
|
|
1130
1197
|
isFrontend: this.isFrontend
|
|
1131
1198
|
});
|
|
@@ -1184,7 +1251,7 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1184
1251
|
if (ownerInstance.uuid === this.serviceInstanceId) {
|
|
1185
1252
|
return true;
|
|
1186
1253
|
}
|
|
1187
|
-
const hasRemoteInterest =
|
|
1254
|
+
const hasRemoteInterest = !ownerInstance.isFrontend && (this.deputies.has(ownerInstance.serviceName) || this.remoteIntents.has(ownerInstance.serviceName) || this.remoteSignals.has(ownerInstance.serviceName)) && transport.role === this.getRoutingTransportRole();
|
|
1188
1255
|
if (!hasRemoteInterest) {
|
|
1189
1256
|
return true;
|
|
1190
1257
|
}
|
|
@@ -1599,6 +1666,9 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1599
1666
|
if (!instance.isActive || instance.isNonResponsive || instance.isBlocked) {
|
|
1600
1667
|
return false;
|
|
1601
1668
|
}
|
|
1669
|
+
if (instance.isFrontend) {
|
|
1670
|
+
return true;
|
|
1671
|
+
}
|
|
1602
1672
|
return Boolean(
|
|
1603
1673
|
this.selectTransportForInstance(instance, context, preferredRole)
|
|
1604
1674
|
);
|
|
@@ -1632,6 +1702,21 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1632
1702
|
}
|
|
1633
1703
|
if (__broadcast || instances[0].isFrontend) {
|
|
1634
1704
|
for (const instance of instances) {
|
|
1705
|
+
if (instance.isFrontend) {
|
|
1706
|
+
const fetchId = `browser:${instance.uuid}`;
|
|
1707
|
+
emit(
|
|
1708
|
+
`meta.service_registry.selected_instance_for_socket:${fetchId}`,
|
|
1709
|
+
{
|
|
1710
|
+
...context,
|
|
1711
|
+
__instance: instance.uuid,
|
|
1712
|
+
__transportId: void 0,
|
|
1713
|
+
__transportOrigin: void 0,
|
|
1714
|
+
__transportProtocols: ["socket"],
|
|
1715
|
+
__fetchId: fetchId
|
|
1716
|
+
}
|
|
1717
|
+
);
|
|
1718
|
+
continue;
|
|
1719
|
+
}
|
|
1635
1720
|
const selectedTransport2 = this.selectTransportForInstance(
|
|
1636
1721
|
instance,
|
|
1637
1722
|
context,
|
|
@@ -1673,6 +1758,21 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
1673
1758
|
if (retries > 0) {
|
|
1674
1759
|
selected = instancesToTry[Math.floor(Math.random() * instancesToTry.length)];
|
|
1675
1760
|
}
|
|
1761
|
+
if (selected.isFrontend) {
|
|
1762
|
+
context.__instance = selected.uuid;
|
|
1763
|
+
context.__transportId = void 0;
|
|
1764
|
+
context.__transportOrigin = void 0;
|
|
1765
|
+
context.__transportProtocols = ["socket"];
|
|
1766
|
+
context.__fetchId = `browser:${selected.uuid}`;
|
|
1767
|
+
context.__triedInstances = triedInstances;
|
|
1768
|
+
context.__triedInstances.push(selected.uuid);
|
|
1769
|
+
context.__retries = retries;
|
|
1770
|
+
emit(
|
|
1771
|
+
`meta.service_registry.selected_instance_for_socket:${context.__fetchId}`,
|
|
1772
|
+
context
|
|
1773
|
+
);
|
|
1774
|
+
return context;
|
|
1775
|
+
}
|
|
1676
1776
|
const selectedTransport = this.selectTransportForInstance(
|
|
1677
1777
|
selected,
|
|
1678
1778
|
context,
|
|
@@ -2329,7 +2429,7 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
2329
2429
|
)
|
|
2330
2430
|
);
|
|
2331
2431
|
for (const service of services) {
|
|
2332
|
-
const instances = this.instances.get(service).filter((i) => i.isActive);
|
|
2432
|
+
const instances = this.instances.get(service).filter((i) => i.isActive && !i.isFrontend);
|
|
2333
2433
|
for (const instance of instances) {
|
|
2334
2434
|
const transport = this.getRouteableTransport(
|
|
2335
2435
|
instance,
|
|
@@ -3381,9 +3481,9 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
3381
3481
|
};
|
|
3382
3482
|
|
|
3383
3483
|
// src/graph/definition/SignalTransmissionTask.ts
|
|
3384
|
-
import { Task as
|
|
3385
|
-
import { v4 as
|
|
3386
|
-
var SignalTransmissionTask = class extends
|
|
3484
|
+
import { Task as Task2 } from "@cadenza.io/core";
|
|
3485
|
+
import { v4 as uuid4 } from "uuid";
|
|
3486
|
+
var SignalTransmissionTask = class extends Task2 {
|
|
3387
3487
|
/**
|
|
3388
3488
|
* Constructs a new instance of the class and initializes it with the provided parameters.
|
|
3389
3489
|
*
|
|
@@ -3411,7 +3511,7 @@ var SignalTransmissionTask = class extends Task3 {
|
|
|
3411
3511
|
*/
|
|
3412
3512
|
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) {
|
|
3413
3513
|
const taskFunction = (context) => {
|
|
3414
|
-
context.__routineExecId =
|
|
3514
|
+
context.__routineExecId = uuid4();
|
|
3415
3515
|
return context;
|
|
3416
3516
|
};
|
|
3417
3517
|
super(
|
|
@@ -4048,6 +4148,35 @@ var SocketController = class _SocketController {
|
|
|
4048
4148
|
},
|
|
4049
4149
|
{ isMeta: true }
|
|
4050
4150
|
);
|
|
4151
|
+
CadenzaService.registry.getTaskByName.doOn("meta.socket.delegation_requested");
|
|
4152
|
+
CadenzaService.registry.getRoutineByName.doOn("meta.socket.delegation_requested");
|
|
4153
|
+
CadenzaService.createMetaTask(
|
|
4154
|
+
"Forward socket delegations to runner",
|
|
4155
|
+
(context, emit) => {
|
|
4156
|
+
if (!isBrowser && !CadenzaService.serviceRegistry.isFrontend) {
|
|
4157
|
+
return false;
|
|
4158
|
+
}
|
|
4159
|
+
if (context.task || context.routine) {
|
|
4160
|
+
const routine = context.task ?? context.routine;
|
|
4161
|
+
delete context.task;
|
|
4162
|
+
delete context.routine;
|
|
4163
|
+
context.__routineExecId = context.__metadata?.__deputyExecId ?? null;
|
|
4164
|
+
context.__isDeputy = true;
|
|
4165
|
+
CadenzaService.runner.run(routine, context);
|
|
4166
|
+
return true;
|
|
4167
|
+
}
|
|
4168
|
+
const deputyExecId = context.__metadata?.__deputyExecId ?? context.__deputyExecId;
|
|
4169
|
+
const remoteRoutineName = context.__remoteRoutineName ?? context.__name ?? "unknown";
|
|
4170
|
+
context.errored = true;
|
|
4171
|
+
context.__error = `No task or routine registered for delegation target ${remoteRoutineName}.`;
|
|
4172
|
+
if (deputyExecId) {
|
|
4173
|
+
emit(`meta.socket.delegation_target_not_found:${deputyExecId}`, context);
|
|
4174
|
+
}
|
|
4175
|
+
emit("meta.runner.failed", context);
|
|
4176
|
+
return false;
|
|
4177
|
+
},
|
|
4178
|
+
"Forwards socket delegated lookups to the local runner in frontend runtimes."
|
|
4179
|
+
).attachSignal("meta.runner.failed").doAfter(CadenzaService.registry.getTaskByName, CadenzaService.registry.getRoutineByName);
|
|
4051
4180
|
this.registerDiagnosticsTasks();
|
|
4052
4181
|
this.registerSocketServerTasks();
|
|
4053
4182
|
this.registerSocketClientTasks();
|
|
@@ -4291,8 +4420,56 @@ var SocketController = class _SocketController {
|
|
|
4291
4420
|
});
|
|
4292
4421
|
if (ctx.isFrontend) {
|
|
4293
4422
|
const fetchId = `browser:${ctx.serviceInstanceId}`;
|
|
4423
|
+
const frontendDelegateTaskName = `Delegate flow to frontend ${fetchId}`;
|
|
4424
|
+
const frontendTransmitTaskName = `Transmit signal to ${fetchId}`;
|
|
4425
|
+
CadenzaService.get(frontendDelegateTaskName)?.destroy();
|
|
4426
|
+
CadenzaService.get(frontendTransmitTaskName)?.destroy();
|
|
4427
|
+
CadenzaService.createMetaTask(
|
|
4428
|
+
frontendDelegateTaskName,
|
|
4429
|
+
async (delegateCtx, emitter) => {
|
|
4430
|
+
if (delegateCtx.__remoteRoutineName === void 0) {
|
|
4431
|
+
return;
|
|
4432
|
+
}
|
|
4433
|
+
const normalizedDelegateCtx = ensureDelegationContextMetadata(delegateCtx);
|
|
4434
|
+
delete normalizedDelegateCtx.__isSubMeta;
|
|
4435
|
+
delete normalizedDelegateCtx.__broadcast;
|
|
4436
|
+
const deputyExecId = normalizedDelegateCtx.__metadata?.__deputyExecId;
|
|
4437
|
+
const resultContext = await new Promise((resolve) => {
|
|
4438
|
+
ws.timeout(normalizedDelegateCtx.__timeout ?? 6e4).emit(
|
|
4439
|
+
"delegation",
|
|
4440
|
+
normalizedDelegateCtx,
|
|
4441
|
+
(err, response) => {
|
|
4442
|
+
if (err) {
|
|
4443
|
+
resolve({
|
|
4444
|
+
...normalizedDelegateCtx,
|
|
4445
|
+
errored: true,
|
|
4446
|
+
__error: `Frontend delegation timed out: ${err.message ?? err}`
|
|
4447
|
+
});
|
|
4448
|
+
return;
|
|
4449
|
+
}
|
|
4450
|
+
resolve(
|
|
4451
|
+
response ?? {
|
|
4452
|
+
errored: true,
|
|
4453
|
+
__error: "Frontend delegation returned no response"
|
|
4454
|
+
}
|
|
4455
|
+
);
|
|
4456
|
+
}
|
|
4457
|
+
);
|
|
4458
|
+
});
|
|
4459
|
+
if (deputyExecId) {
|
|
4460
|
+
const metadata = resultContext.__metadata;
|
|
4461
|
+
delete resultContext.__metadata;
|
|
4462
|
+
emitter(`meta.socket_client.delegated:${deputyExecId}`, {
|
|
4463
|
+
...resultContext,
|
|
4464
|
+
...metadata && typeof metadata === "object" ? metadata : {}
|
|
4465
|
+
});
|
|
4466
|
+
}
|
|
4467
|
+
return resultContext;
|
|
4468
|
+
},
|
|
4469
|
+
"Delegates work to a connected frontend runtime through its active websocket."
|
|
4470
|
+
).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`).attachSignal("meta.socket_client.delegated");
|
|
4294
4471
|
CadenzaService.createMetaTask(
|
|
4295
|
-
|
|
4472
|
+
frontendTransmitTaskName,
|
|
4296
4473
|
(c, emitter) => {
|
|
4297
4474
|
if (c.__signalName === void 0) {
|
|
4298
4475
|
return;
|
|
@@ -4757,10 +4934,54 @@ var SocketController = class _SocketController {
|
|
|
4757
4934
|
delegationCtx
|
|
4758
4935
|
);
|
|
4759
4936
|
});
|
|
4760
|
-
socket.on("
|
|
4937
|
+
socket.on("delegation", (delegationCtx, callback) => {
|
|
4938
|
+
const normalizedDelegationCtx = ensureDelegationContextMetadata(delegationCtx);
|
|
4939
|
+
const deputyExecId = normalizedDelegationCtx.__metadata.__deputyExecId;
|
|
4940
|
+
const targetNotFoundSignal = `meta.socket.delegation_target_not_found:${deputyExecId}`;
|
|
4941
|
+
CadenzaService.createEphemeralMetaTask(
|
|
4942
|
+
`Resolve frontend socket delegation ${deputyExecId}`,
|
|
4943
|
+
(completedCtx) => {
|
|
4944
|
+
callback(completedCtx);
|
|
4945
|
+
return completedCtx;
|
|
4946
|
+
},
|
|
4947
|
+
"Resolves a server-routed delegation request through the frontend runtime.",
|
|
4948
|
+
{
|
|
4949
|
+
register: false
|
|
4950
|
+
}
|
|
4951
|
+
).doOn(`meta.node.graph_completed:${deputyExecId}`, targetNotFoundSignal);
|
|
4952
|
+
if (!CadenzaService.get(normalizedDelegationCtx.__remoteRoutineName) && !CadenzaService.registry.routines.get(
|
|
4953
|
+
normalizedDelegationCtx.__remoteRoutineName
|
|
4954
|
+
)) {
|
|
4955
|
+
CadenzaService.emit(targetNotFoundSignal, {
|
|
4956
|
+
...normalizedDelegationCtx,
|
|
4957
|
+
__error: `No task or routine registered for delegation target ${normalizedDelegationCtx.__remoteRoutineName}.`,
|
|
4958
|
+
errored: true
|
|
4959
|
+
});
|
|
4960
|
+
return;
|
|
4961
|
+
}
|
|
4962
|
+
CadenzaService.emit("meta.socket.delegation_requested", {
|
|
4963
|
+
...normalizedDelegationCtx,
|
|
4964
|
+
__name: normalizedDelegationCtx.__remoteRoutineName
|
|
4965
|
+
});
|
|
4966
|
+
});
|
|
4967
|
+
socket.on("signal", (signalCtx, callback) => {
|
|
4761
4968
|
if (CadenzaService.signalBroker.listObservedSignals().includes(signalCtx.__signalName)) {
|
|
4969
|
+
callback?.({
|
|
4970
|
+
__status: "success",
|
|
4971
|
+
__signalName: signalCtx.__signalName
|
|
4972
|
+
});
|
|
4762
4973
|
CadenzaService.emit(signalCtx.__signalName, signalCtx);
|
|
4974
|
+
return;
|
|
4763
4975
|
}
|
|
4976
|
+
callback?.({
|
|
4977
|
+
...signalCtx,
|
|
4978
|
+
__status: "error",
|
|
4979
|
+
__error: `No such signal: ${signalCtx.__signalName}`,
|
|
4980
|
+
errored: true
|
|
4981
|
+
});
|
|
4982
|
+
});
|
|
4983
|
+
socket.on("status_check", (statusCtx, callback) => {
|
|
4984
|
+
callback(CadenzaService.serviceRegistry.resolveLocalStatusCheck(statusCtx));
|
|
4764
4985
|
});
|
|
4765
4986
|
socket.on("status_update", (status) => {
|
|
4766
4987
|
CadenzaService.emit("meta.socket_client.status_received", status);
|
|
@@ -5835,13 +6056,13 @@ var DatabaseController = class _DatabaseController {
|
|
|
5835
6056
|
};
|
|
5836
6057
|
|
|
5837
6058
|
// src/Cadenza.ts
|
|
5838
|
-
import { v4 as
|
|
6059
|
+
import { v4 as uuid6 } from "uuid";
|
|
5839
6060
|
|
|
5840
6061
|
// src/graph/controllers/GraphSyncController.ts
|
|
5841
6062
|
import {
|
|
5842
|
-
GraphContext as GraphContext4,
|
|
5843
6063
|
META_ACTOR_SESSION_STATE_PERSIST_INTENT as META_ACTOR_SESSION_STATE_PERSIST_INTENT2
|
|
5844
6064
|
} from "@cadenza.io/core";
|
|
6065
|
+
import { v4 as uuid5 } from "uuid";
|
|
5845
6066
|
var ACTOR_TASK_METADATA = /* @__PURE__ */ Symbol.for("@cadenza.io/core/actor-task-meta");
|
|
5846
6067
|
function getActorTaskRuntimeMetadata(taskFunction) {
|
|
5847
6068
|
if (typeof taskFunction !== "function") {
|
|
@@ -5975,30 +6196,69 @@ function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, opti
|
|
|
5975
6196
|
if (!localInsertTask && !remoteInsertTask) {
|
|
5976
6197
|
return void 0;
|
|
5977
6198
|
}
|
|
5978
|
-
|
|
5979
|
-
|
|
5980
|
-
|
|
5981
|
-
|
|
5982
|
-
|
|
6199
|
+
const targetTask = localInsertTask ?? remoteInsertTask;
|
|
6200
|
+
const executionRequestedSignal = `meta.sync_controller.insert_execution_requested:${tableName}`;
|
|
6201
|
+
const executionResolvedSignal = `meta.sync_controller.insert_execution_resolved:${tableName}`;
|
|
6202
|
+
const executionFailedSignal = `meta.sync_controller.insert_execution_failed:${tableName}`;
|
|
6203
|
+
const prepareExecutionTask = CadenzaService.createMetaTask(
|
|
6204
|
+
`Prepare graph sync insert execution for ${tableName}`,
|
|
6205
|
+
(ctx) => ({
|
|
6206
|
+
...ctx,
|
|
6207
|
+
queryData: buildSyncInsertQueryData(
|
|
6208
|
+
ctx,
|
|
6209
|
+
queryData
|
|
6210
|
+
)
|
|
6211
|
+
}),
|
|
6212
|
+
`Prepares ${tableName} graph-sync insert payloads for runner execution.`,
|
|
6213
|
+
{
|
|
6214
|
+
register: false,
|
|
6215
|
+
isHidden: true
|
|
6216
|
+
}
|
|
6217
|
+
).doOn(executionRequestedSignal).emitsOnFail(executionFailedSignal);
|
|
6218
|
+
const finalizeExecutionTask = CadenzaService.createMetaTask(
|
|
6219
|
+
`Finalize graph sync insert execution for ${tableName}`,
|
|
6220
|
+
(ctx, emit) => {
|
|
6221
|
+
if (!ctx.__resolverRequestId) {
|
|
5983
6222
|
return false;
|
|
5984
6223
|
}
|
|
5985
|
-
|
|
5986
|
-
|
|
5987
|
-
|
|
5988
|
-
|
|
5989
|
-
|
|
5990
|
-
|
|
5991
|
-
|
|
5992
|
-
|
|
5993
|
-
|
|
5994
|
-
|
|
5995
|
-
|
|
6224
|
+
emit(executionResolvedSignal, ctx);
|
|
6225
|
+
return ctx;
|
|
6226
|
+
},
|
|
6227
|
+
`Resolves signal-driven ${tableName} graph-sync insert execution.`,
|
|
6228
|
+
{
|
|
6229
|
+
register: false,
|
|
6230
|
+
isHidden: true
|
|
6231
|
+
}
|
|
6232
|
+
);
|
|
6233
|
+
targetTask.then(finalizeExecutionTask).emitsOnFail(executionFailedSignal);
|
|
6234
|
+
prepareExecutionTask.then(targetTask);
|
|
6235
|
+
return CadenzaService.createUniqueMetaTask(
|
|
6236
|
+
`Resolve graph sync insert for ${tableName}`,
|
|
6237
|
+
(ctx, emit) => new Promise((resolve) => {
|
|
6238
|
+
const resolverRequestId = uuid5();
|
|
6239
|
+
CadenzaService.createEphemeralMetaTask(
|
|
6240
|
+
`Resolve graph sync insert execution for ${tableName} (${resolverRequestId})`,
|
|
6241
|
+
(resultCtx) => {
|
|
6242
|
+
if (resultCtx.__resolverRequestId !== resolverRequestId) {
|
|
6243
|
+
return false;
|
|
6244
|
+
}
|
|
6245
|
+
const normalizedResult = {
|
|
6246
|
+
...resultCtx
|
|
6247
|
+
};
|
|
6248
|
+
delete normalizedResult.__resolverRequestId;
|
|
6249
|
+
resolve(normalizedResult);
|
|
6250
|
+
return normalizedResult;
|
|
6251
|
+
},
|
|
6252
|
+
`Waits for signal-driven ${tableName} graph-sync insert execution.`,
|
|
5996
6253
|
{
|
|
5997
|
-
|
|
5998
|
-
routineExecId: ctx.__routineExecId ?? ctx.__metadata?.__routineExecId ?? ctx.__metadata?.__localRoutineExecId ?? "graph-sync"
|
|
6254
|
+
register: false
|
|
5999
6255
|
}
|
|
6000
|
-
);
|
|
6001
|
-
|
|
6256
|
+
).doOn(executionResolvedSignal, executionFailedSignal);
|
|
6257
|
+
emit(executionRequestedSignal, {
|
|
6258
|
+
...ctx,
|
|
6259
|
+
__resolverRequestId: resolverRequestId
|
|
6260
|
+
});
|
|
6261
|
+
}),
|
|
6002
6262
|
`Routes graph sync inserts for ${tableName} through the local authority task when available.`,
|
|
6003
6263
|
{
|
|
6004
6264
|
...options,
|
|
@@ -7350,7 +7610,7 @@ var CadenzaService = class {
|
|
|
7350
7610
|
(transport) => !!transport
|
|
7351
7611
|
).map((transport) => ({
|
|
7352
7612
|
...transport,
|
|
7353
|
-
uuid:
|
|
7613
|
+
uuid: uuid6()
|
|
7354
7614
|
}));
|
|
7355
7615
|
}
|
|
7356
7616
|
static createBootstrapTransport(serviceInstanceId, role, endpoint) {
|
|
@@ -7602,7 +7862,7 @@ var CadenzaService = class {
|
|
|
7602
7862
|
}
|
|
7603
7863
|
for (const responder of responders) {
|
|
7604
7864
|
const { task, descriptor } = responder;
|
|
7605
|
-
const inquiryId =
|
|
7865
|
+
const inquiryId = uuid6();
|
|
7606
7866
|
startTimeByTask.set(task, Date.now());
|
|
7607
7867
|
const resolverTask = this.createEphemeralMetaTask(
|
|
7608
7868
|
`Resolve inquiry ${inquiry} for ${descriptor.localTaskName}`,
|
|
@@ -8110,7 +8370,7 @@ var CadenzaService = class {
|
|
|
8110
8370
|
this.bootstrap();
|
|
8111
8371
|
this.validateName(serviceName);
|
|
8112
8372
|
this.validateServiceName(serviceName);
|
|
8113
|
-
const serviceId = options.customServiceId ??
|
|
8373
|
+
const serviceId = options.customServiceId ?? uuid6();
|
|
8114
8374
|
this.serviceRegistry.serviceName = serviceName;
|
|
8115
8375
|
this.serviceRegistry.serviceInstanceId = serviceId;
|
|
8116
8376
|
this.setHydrationResults(options.hydration);
|
|
@@ -8247,7 +8507,7 @@ var CadenzaService = class {
|
|
|
8247
8507
|
"global.meta.cadenza_db.gathered_sync_data",
|
|
8248
8508
|
ctx.serviceName
|
|
8249
8509
|
);
|
|
8250
|
-
}).doOn("meta.rest.handshake");
|
|
8510
|
+
}).doOn("meta.rest.handshake", "meta.socket.handshake");
|
|
8251
8511
|
}
|
|
8252
8512
|
this.createMetaTask("Handle service setup completion", () => {
|
|
8253
8513
|
if (isFrontend) {
|
|
@@ -8955,12 +9215,12 @@ import {
|
|
|
8955
9215
|
Actor as Actor2,
|
|
8956
9216
|
DebounceTask as DebounceTask2,
|
|
8957
9217
|
EphemeralTask as EphemeralTask2,
|
|
8958
|
-
GraphRoutine as
|
|
8959
|
-
Task as
|
|
9218
|
+
GraphRoutine as GraphRoutine2,
|
|
9219
|
+
Task as Task5
|
|
8960
9220
|
} from "@cadenza.io/core";
|
|
8961
9221
|
|
|
8962
9222
|
// src/ssr/createSSRInquiryBridge.ts
|
|
8963
|
-
import { v4 as
|
|
9223
|
+
import { v4 as uuid7 } from "uuid";
|
|
8964
9224
|
function ensureFetch() {
|
|
8965
9225
|
if (typeof globalThis.fetch !== "function") {
|
|
8966
9226
|
throw new Error("SSR inquiry bridge requires global fetch support.");
|
|
@@ -9049,7 +9309,7 @@ function createSSRInquiryBridge(options = {}) {
|
|
|
9049
9309
|
__remoteRoutineName: remoteRoutineName,
|
|
9050
9310
|
__metadata: {
|
|
9051
9311
|
...context.__metadata ?? {},
|
|
9052
|
-
__deputyExecId:
|
|
9312
|
+
__deputyExecId: uuid7()
|
|
9053
9313
|
}
|
|
9054
9314
|
}),
|
|
9055
9315
|
signal
|
|
@@ -9239,13 +9499,13 @@ export {
|
|
|
9239
9499
|
DeputyTask,
|
|
9240
9500
|
EphemeralTask2 as EphemeralTask,
|
|
9241
9501
|
GraphMetadataController,
|
|
9242
|
-
|
|
9502
|
+
GraphRoutine2 as GraphRoutine,
|
|
9243
9503
|
RestController,
|
|
9244
9504
|
ServiceRegistry,
|
|
9245
9505
|
SignalController,
|
|
9246
9506
|
SignalTransmissionTask,
|
|
9247
9507
|
SocketController,
|
|
9248
|
-
|
|
9508
|
+
Task5 as Task,
|
|
9249
9509
|
createSSRInquiryBridge,
|
|
9250
9510
|
index_default as default
|
|
9251
9511
|
};
|