@cadenza.io/service 2.19.0 → 2.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/{Cadenza-DCMs7q97.d.mts → Cadenza-D787NzXY.d.mts} +1 -0
- package/dist/{Cadenza-DCMs7q97.d.ts → Cadenza-D787NzXY.d.ts} +1 -0
- package/dist/browser/index.js +236 -26
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/index.mjs +236 -26
- package/dist/browser/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +236 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +236 -26
- package/dist/index.mjs.map +1 -1
- package/dist/nuxt/index.d.mts +2 -2
- package/dist/nuxt/index.d.ts +2 -2
- package/dist/react/index.d.mts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/vue/index.d.mts +2 -2
- package/dist/vue/index.d.ts +2 -2
- package/package.json +2 -2
|
@@ -1317,6 +1317,7 @@ declare class CadenzaService {
|
|
|
1317
1317
|
private static registerDatabaseServiceBridgeTask;
|
|
1318
1318
|
static createActor<D extends Record<string, any> = AnyObject, R = AnyObject>(spec: ActorSpec<D, R>, options?: ActorFactoryOptions): Actor<D, R>;
|
|
1319
1319
|
static createActorFromDefinition<D extends Record<string, any> = AnyObject, R = AnyObject>(definition: ActorDefinition<D, R>, options?: ActorFactoryOptions<D, R>): Actor<D, R>;
|
|
1320
|
+
private static withActorSessionHydration;
|
|
1320
1321
|
/**
|
|
1321
1322
|
* Creates and registers a new task with the provided name, function, and optional details.
|
|
1322
1323
|
*
|
|
@@ -1317,6 +1317,7 @@ declare class CadenzaService {
|
|
|
1317
1317
|
private static registerDatabaseServiceBridgeTask;
|
|
1318
1318
|
static createActor<D extends Record<string, any> = AnyObject, R = AnyObject>(spec: ActorSpec<D, R>, options?: ActorFactoryOptions): Actor<D, R>;
|
|
1319
1319
|
static createActorFromDefinition<D extends Record<string, any> = AnyObject, R = AnyObject>(definition: ActorDefinition<D, R>, options?: ActorFactoryOptions<D, R>): Actor<D, R>;
|
|
1320
|
+
private static withActorSessionHydration;
|
|
1320
1321
|
/**
|
|
1321
1322
|
* Creates and registers a new task with the provided name, function, and optional details.
|
|
1322
1323
|
*
|
package/dist/browser/index.js
CHANGED
|
@@ -5581,6 +5581,8 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
5581
5581
|
}
|
|
5582
5582
|
}
|
|
5583
5583
|
}
|
|
5584
|
+
const hasExplicitSignalRoutingRows = signalToTaskMaps.length > 0;
|
|
5585
|
+
const hasExplicitIntentRoutingRows = intentToTaskMaps.length > 0;
|
|
5584
5586
|
const latestManifestSnapshots = selectLatestServiceManifestSnapshots(manifestSnapshots);
|
|
5585
5587
|
const explodedManifest = explodeServiceManifestSnapshots(
|
|
5586
5588
|
latestManifestSnapshots
|
|
@@ -5661,26 +5663,30 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
5661
5663
|
row.task_version ?? 1
|
|
5662
5664
|
).trim()}`
|
|
5663
5665
|
);
|
|
5664
|
-
|
|
5665
|
-
|
|
5666
|
-
|
|
5667
|
-
|
|
5668
|
-
|
|
5669
|
-
row.
|
|
5670
|
-
|
|
5671
|
-
row.
|
|
5672
|
-
|
|
5673
|
-
|
|
5674
|
-
|
|
5675
|
-
|
|
5676
|
-
|
|
5677
|
-
|
|
5678
|
-
|
|
5679
|
-
|
|
5680
|
-
|
|
5681
|
-
row.
|
|
5682
|
-
|
|
5683
|
-
|
|
5666
|
+
if (!hasExplicitSignalRoutingRows) {
|
|
5667
|
+
pushUnique(
|
|
5668
|
+
explodedManifest.signalToTaskMaps,
|
|
5669
|
+
signalToTaskMaps,
|
|
5670
|
+
seenSignalMaps,
|
|
5671
|
+
(row) => `${String(row.signal_name ?? "").trim()}|${String(
|
|
5672
|
+
row.service_name ?? ""
|
|
5673
|
+
).trim()}|${String(row.task_name ?? "").trim()}|${String(
|
|
5674
|
+
row.task_version ?? 1
|
|
5675
|
+
).trim()}`
|
|
5676
|
+
);
|
|
5677
|
+
}
|
|
5678
|
+
if (!hasExplicitIntentRoutingRows) {
|
|
5679
|
+
pushUnique(
|
|
5680
|
+
explodedManifest.intentToTaskMaps,
|
|
5681
|
+
intentToTaskMaps,
|
|
5682
|
+
seenIntentMaps,
|
|
5683
|
+
(row) => `${String(row.intent_name ?? "").trim()}|${String(
|
|
5684
|
+
row.service_name ?? ""
|
|
5685
|
+
).trim()}|${String(row.task_name ?? "").trim()}|${String(
|
|
5686
|
+
row.task_version ?? 1
|
|
5687
|
+
).trim()}`
|
|
5688
|
+
);
|
|
5689
|
+
}
|
|
5684
5690
|
return {
|
|
5685
5691
|
serviceInstances,
|
|
5686
5692
|
serviceInstanceTransports,
|
|
@@ -6283,16 +6289,35 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
6283
6289
|
const authorityFullSyncResponderTask = CadenzaService.createMetaTask(
|
|
6284
6290
|
BOOTSTRAP_FULL_SYNC_RESPONDER_TASK_NAME,
|
|
6285
6291
|
async (ctx) => {
|
|
6292
|
+
const queryOptionalAuthorityRoutingRows = async (tableName) => {
|
|
6293
|
+
try {
|
|
6294
|
+
return await DatabaseController.instance.queryAuthorityTableRows(
|
|
6295
|
+
tableName
|
|
6296
|
+
);
|
|
6297
|
+
} catch (error) {
|
|
6298
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
6299
|
+
if (message.includes(
|
|
6300
|
+
`Table '${tableName}' is not registered on the CadenzaDB PostgresActor`
|
|
6301
|
+
)) {
|
|
6302
|
+
return [];
|
|
6303
|
+
}
|
|
6304
|
+
throw error;
|
|
6305
|
+
}
|
|
6306
|
+
};
|
|
6286
6307
|
const [
|
|
6287
6308
|
serviceInstances,
|
|
6288
6309
|
serviceInstanceTransports,
|
|
6289
|
-
serviceManifests
|
|
6310
|
+
serviceManifests,
|
|
6311
|
+
signalToTaskMaps,
|
|
6312
|
+
intentToTaskMaps
|
|
6290
6313
|
] = await Promise.all([
|
|
6291
6314
|
DatabaseController.instance.queryAuthorityTableRows("service_instance"),
|
|
6292
6315
|
DatabaseController.instance.queryAuthorityTableRows(
|
|
6293
6316
|
"service_instance_transport"
|
|
6294
6317
|
),
|
|
6295
|
-
DatabaseController.instance.queryAuthorityTableRows("service_manifest")
|
|
6318
|
+
DatabaseController.instance.queryAuthorityTableRows("service_manifest"),
|
|
6319
|
+
queryOptionalAuthorityRoutingRows("signal_to_task_map"),
|
|
6320
|
+
queryOptionalAuthorityRoutingRows("intent_to_task_map")
|
|
6296
6321
|
]);
|
|
6297
6322
|
return {
|
|
6298
6323
|
...ctx,
|
|
@@ -6300,7 +6325,9 @@ var ServiceRegistry = class _ServiceRegistry {
|
|
|
6300
6325
|
...this.collectBootstrapFullSyncPayload({
|
|
6301
6326
|
serviceInstances,
|
|
6302
6327
|
serviceInstanceTransports,
|
|
6303
|
-
serviceManifests
|
|
6328
|
+
serviceManifests,
|
|
6329
|
+
signalToTaskMaps,
|
|
6330
|
+
intentToTaskMaps
|
|
6304
6331
|
})
|
|
6305
6332
|
};
|
|
6306
6333
|
},
|
|
@@ -12257,12 +12284,13 @@ var RuntimeValidationController = class _RuntimeValidationController {
|
|
|
12257
12284
|
// src/graph/controllers/registerActorSessionPersistence.ts
|
|
12258
12285
|
var import_core3 = require("@cadenza.io/core");
|
|
12259
12286
|
var ACTOR_SESSION_STATE_PERSIST_CONCURRENCY = 20;
|
|
12287
|
+
var META_ACTOR_SESSION_STATE_HYDRATE_INTENT = "meta-actor-session-state-hydrate";
|
|
12260
12288
|
var ACTOR_SESSION_TRACE_ENABLED2 = process.env.CADENZA_ACTOR_SESSION_TRACE === "1" || process.env.CADENZA_ACTOR_SESSION_TRACE === "true";
|
|
12261
12289
|
function shouldAssumeSuccessfulActorSessionRowCount(ctx) {
|
|
12262
12290
|
return ctx.__success === true && ctx.rowCount === void 0 && ctx.__status === "success" && ctx.__serviceName === "CadenzaDB" && ctx.__localTaskName === "Insert actor_session_state in CadenzaDB";
|
|
12263
12291
|
}
|
|
12264
12292
|
function registerActorSessionPersistenceTasks() {
|
|
12265
|
-
if (CadenzaService.get("Persist actor session state")) {
|
|
12293
|
+
if (CadenzaService.get("Persist actor session state") && CadenzaService.get("Hydrate actor session state")) {
|
|
12266
12294
|
return;
|
|
12267
12295
|
}
|
|
12268
12296
|
const localActorSessionTaskOptions = {
|
|
@@ -12279,6 +12307,14 @@ function registerActorSessionPersistenceTasks() {
|
|
|
12279
12307
|
isSubMeta: true
|
|
12280
12308
|
}
|
|
12281
12309
|
);
|
|
12310
|
+
const actorSessionStateQueryTask = CadenzaService.getLocalCadenzaDBQueryTask("actor_session_state") ?? CadenzaService.get("dbQueryActorSessionState") ?? CadenzaService.get("Query actor_session_state in CadenzaDB") ?? CadenzaService.createCadenzaDBQueryTask(
|
|
12311
|
+
"actor_session_state",
|
|
12312
|
+
{},
|
|
12313
|
+
{
|
|
12314
|
+
concurrency: ACTOR_SESSION_STATE_PERSIST_CONCURRENCY,
|
|
12315
|
+
isSubMeta: true
|
|
12316
|
+
}
|
|
12317
|
+
);
|
|
12282
12318
|
const validateActorSessionStatePersistenceTask = CadenzaService.createMetaTask(
|
|
12283
12319
|
"Validate actor session state persistence",
|
|
12284
12320
|
(ctx) => {
|
|
@@ -12312,6 +12348,103 @@ function registerActorSessionPersistenceTasks() {
|
|
|
12312
12348
|
const insertAndValidateActorSessionStateTask = actorSessionStateInsertTask.then(
|
|
12313
12349
|
validateActorSessionStatePersistenceTask
|
|
12314
12350
|
);
|
|
12351
|
+
const validateActorSessionStateHydrationTask = CadenzaService.createMetaTask(
|
|
12352
|
+
"Validate actor session state hydration",
|
|
12353
|
+
(ctx) => {
|
|
12354
|
+
if (ctx.errored || ctx.failed || ctx.__success !== true) {
|
|
12355
|
+
throw new Error(
|
|
12356
|
+
String(
|
|
12357
|
+
ctx.__error ?? ctx.error ?? "actor_session_state hydration query failed"
|
|
12358
|
+
)
|
|
12359
|
+
);
|
|
12360
|
+
}
|
|
12361
|
+
const row = ctx.actorSessionState && typeof ctx.actorSessionState === "object" && !Array.isArray(ctx.actorSessionState) ? ctx.actorSessionState : null;
|
|
12362
|
+
if (!row) {
|
|
12363
|
+
return {
|
|
12364
|
+
__success: true,
|
|
12365
|
+
hydrated: false
|
|
12366
|
+
};
|
|
12367
|
+
}
|
|
12368
|
+
const expiresAt = typeof row.expiresAt === "string" ? row.expiresAt : typeof row.expires_at === "string" ? row.expires_at : null;
|
|
12369
|
+
const expiresAtMs = expiresAt ? Date.parse(expiresAt) : Number.NaN;
|
|
12370
|
+
if (Number.isFinite(expiresAtMs) && expiresAtMs <= Date.now()) {
|
|
12371
|
+
return {
|
|
12372
|
+
__success: true,
|
|
12373
|
+
hydrated: false
|
|
12374
|
+
};
|
|
12375
|
+
}
|
|
12376
|
+
const durableState = row.durableState ?? row.durable_state ?? null;
|
|
12377
|
+
const durableVersion = Number(
|
|
12378
|
+
row.durableVersion ?? row.durable_version ?? Number.NaN
|
|
12379
|
+
);
|
|
12380
|
+
if (typeof durableState !== "object" || durableState === null || Array.isArray(durableState)) {
|
|
12381
|
+
throw new Error("actor_session_state durable_state must be a non-null object");
|
|
12382
|
+
}
|
|
12383
|
+
if (!Number.isInteger(durableVersion) || durableVersion < 0) {
|
|
12384
|
+
throw new Error(
|
|
12385
|
+
"actor_session_state durable_version must be a non-negative integer"
|
|
12386
|
+
);
|
|
12387
|
+
}
|
|
12388
|
+
return {
|
|
12389
|
+
__success: true,
|
|
12390
|
+
hydrated: true,
|
|
12391
|
+
actor_name: row.actorName ?? row.actor_name,
|
|
12392
|
+
actor_version: row.actorVersion ?? row.actor_version,
|
|
12393
|
+
actor_key: row.actorKey ?? row.actor_key,
|
|
12394
|
+
service_name: row.serviceName ?? row.service_name,
|
|
12395
|
+
durable_state: durableState,
|
|
12396
|
+
durable_version: durableVersion
|
|
12397
|
+
};
|
|
12398
|
+
},
|
|
12399
|
+
"Validates and normalizes hydrated actor_session_state rows.",
|
|
12400
|
+
localActorSessionTaskOptions
|
|
12401
|
+
);
|
|
12402
|
+
const queryAndValidateActorSessionStateTask = actorSessionStateQueryTask.then(
|
|
12403
|
+
validateActorSessionStateHydrationTask
|
|
12404
|
+
);
|
|
12405
|
+
CadenzaService.createMetaTask(
|
|
12406
|
+
"Hydrate actor session state",
|
|
12407
|
+
(ctx) => {
|
|
12408
|
+
const actorName = typeof ctx.actor_name === "string" ? ctx.actor_name.trim() : "";
|
|
12409
|
+
const actorKey = typeof ctx.actor_key === "string" ? ctx.actor_key.trim() : "";
|
|
12410
|
+
const actorVersion = Number(ctx.actor_version ?? 1);
|
|
12411
|
+
const serviceName = CadenzaService.serviceRegistry.serviceName;
|
|
12412
|
+
if (!actorName) {
|
|
12413
|
+
throw new Error("actor_name is required for actor session hydration");
|
|
12414
|
+
}
|
|
12415
|
+
if (!actorKey) {
|
|
12416
|
+
throw new Error("actor_key is required for actor session hydration");
|
|
12417
|
+
}
|
|
12418
|
+
if (!Number.isInteger(actorVersion) || actorVersion < 1) {
|
|
12419
|
+
throw new Error("actor_version must be a positive integer");
|
|
12420
|
+
}
|
|
12421
|
+
if (!serviceName) {
|
|
12422
|
+
throw new Error("service_name is not available for actor session hydration");
|
|
12423
|
+
}
|
|
12424
|
+
return {
|
|
12425
|
+
...ctx,
|
|
12426
|
+
actor_name: actorName,
|
|
12427
|
+
actor_key: actorKey,
|
|
12428
|
+
actor_version: actorVersion,
|
|
12429
|
+
service_name: serviceName,
|
|
12430
|
+
queryData: {
|
|
12431
|
+
filter: {
|
|
12432
|
+
actor_name: actorName,
|
|
12433
|
+
actor_version: actorVersion,
|
|
12434
|
+
actor_key: actorKey,
|
|
12435
|
+
service_name: serviceName,
|
|
12436
|
+
deleted: false
|
|
12437
|
+
},
|
|
12438
|
+
queryMode: "one",
|
|
12439
|
+
sort: {
|
|
12440
|
+
updated: "desc"
|
|
12441
|
+
}
|
|
12442
|
+
}
|
|
12443
|
+
};
|
|
12444
|
+
},
|
|
12445
|
+
"Builds a one-row actor_session_state lookup for lazy actor hydration.",
|
|
12446
|
+
localActorSessionTaskOptions
|
|
12447
|
+
).then(queryAndValidateActorSessionStateTask).respondsTo(META_ACTOR_SESSION_STATE_HYDRATE_INTENT);
|
|
12315
12448
|
CadenzaService.createMetaTask(
|
|
12316
12449
|
"Persist actor session state",
|
|
12317
12450
|
(ctx) => {
|
|
@@ -16412,6 +16545,10 @@ function resolveInquiryFailureError(inquiry, value, depth = 3, seen = /* @__PURE
|
|
|
16412
16545
|
}
|
|
16413
16546
|
return `Inquiry '${inquiry}' did not complete successfully`;
|
|
16414
16547
|
}
|
|
16548
|
+
function normalizePositiveInteger(value, fallback) {
|
|
16549
|
+
const normalized = Number(value);
|
|
16550
|
+
return Number.isInteger(normalized) && normalized > 0 ? normalized : fallback;
|
|
16551
|
+
}
|
|
16415
16552
|
var DEFAULT_DEPUTY_TASK_CONCURRENCY = 50;
|
|
16416
16553
|
var DEFAULT_DEPUTY_TASK_TIMEOUT_MS = 12e4;
|
|
16417
16554
|
var DEFAULT_DATABASE_PROXY_TASK_CONCURRENCY = 50;
|
|
@@ -18245,11 +18382,84 @@ var CadenzaService = class {
|
|
|
18245
18382
|
}
|
|
18246
18383
|
static createActor(spec, options = {}) {
|
|
18247
18384
|
this.bootstrap();
|
|
18248
|
-
return import_core5.default.createActor(
|
|
18385
|
+
return import_core5.default.createActor(
|
|
18386
|
+
spec,
|
|
18387
|
+
this.withActorSessionHydration(
|
|
18388
|
+
spec,
|
|
18389
|
+
options
|
|
18390
|
+
)
|
|
18391
|
+
);
|
|
18249
18392
|
}
|
|
18250
18393
|
static createActorFromDefinition(definition, options = {}) {
|
|
18251
18394
|
this.bootstrap();
|
|
18252
|
-
return import_core5.default.createActorFromDefinition(
|
|
18395
|
+
return import_core5.default.createActorFromDefinition(
|
|
18396
|
+
definition,
|
|
18397
|
+
this.withActorSessionHydration(
|
|
18398
|
+
{
|
|
18399
|
+
name: definition.name,
|
|
18400
|
+
description: definition.description,
|
|
18401
|
+
defaultKey: definition.defaultKey,
|
|
18402
|
+
kind: definition.kind,
|
|
18403
|
+
loadPolicy: definition.loadPolicy,
|
|
18404
|
+
writeContract: definition.writeContract,
|
|
18405
|
+
consistencyProfile: definition.consistencyProfile,
|
|
18406
|
+
retry: definition.retry,
|
|
18407
|
+
idempotency: definition.idempotency,
|
|
18408
|
+
session: definition.session,
|
|
18409
|
+
runtimeReadGuard: definition.runtimeReadGuard,
|
|
18410
|
+
key: definition.key,
|
|
18411
|
+
state: definition.state,
|
|
18412
|
+
taskBindings: definition.tasks,
|
|
18413
|
+
initState: definition.state?.durable?.initState ?? definition.state?.durable?.initialState
|
|
18414
|
+
},
|
|
18415
|
+
options
|
|
18416
|
+
)
|
|
18417
|
+
);
|
|
18418
|
+
}
|
|
18419
|
+
static withActorSessionHydration(spec, options) {
|
|
18420
|
+
if (options.hydrateDurableState || spec.session?.persistDurableState !== true) {
|
|
18421
|
+
return options;
|
|
18422
|
+
}
|
|
18423
|
+
const actorName = String(spec.name ?? "").trim();
|
|
18424
|
+
const actorVersion = 1;
|
|
18425
|
+
const timeoutMs = normalizePositiveInteger(
|
|
18426
|
+
spec.session?.persistenceTimeoutMs,
|
|
18427
|
+
5e3
|
|
18428
|
+
);
|
|
18429
|
+
return {
|
|
18430
|
+
...options,
|
|
18431
|
+
hydrateDurableState: async (actorKey) => {
|
|
18432
|
+
registerActorSessionPersistenceTasks();
|
|
18433
|
+
const response = await import_core5.default.inquire(
|
|
18434
|
+
META_ACTOR_SESSION_STATE_HYDRATE_INTENT,
|
|
18435
|
+
{
|
|
18436
|
+
actor_name: actorName,
|
|
18437
|
+
actor_version: actorVersion,
|
|
18438
|
+
actor_key: actorKey
|
|
18439
|
+
},
|
|
18440
|
+
{
|
|
18441
|
+
timeout: timeoutMs,
|
|
18442
|
+
requireComplete: true,
|
|
18443
|
+
rejectOnTimeout: true
|
|
18444
|
+
}
|
|
18445
|
+
);
|
|
18446
|
+
if (!response || typeof response !== "object" || response.__success !== true) {
|
|
18447
|
+
throw new Error(
|
|
18448
|
+
resolveInquiryFailureError(
|
|
18449
|
+
META_ACTOR_SESSION_STATE_HYDRATE_INTENT,
|
|
18450
|
+
response
|
|
18451
|
+
)
|
|
18452
|
+
);
|
|
18453
|
+
}
|
|
18454
|
+
if (response.hydrated !== true) {
|
|
18455
|
+
return null;
|
|
18456
|
+
}
|
|
18457
|
+
return {
|
|
18458
|
+
durableState: response.durable_state,
|
|
18459
|
+
durableVersion: Number(response.durable_version)
|
|
18460
|
+
};
|
|
18461
|
+
}
|
|
18462
|
+
};
|
|
18253
18463
|
}
|
|
18254
18464
|
/**
|
|
18255
18465
|
* Creates and registers a new task with the provided name, function, and optional details.
|