@naylence/runtime 0.4.1 → 0.4.2
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.cjs +367 -396
- package/dist/browser/index.mjs +367 -396
- package/dist/cjs/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/cjs/version.js +2 -2
- package/dist/esm/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/esm/version.js +2 -2
- package/dist/node/index.cjs +367 -396
- package/dist/node/index.mjs +367 -396
- package/dist/node/node.cjs +389 -418
- package/dist/node/node.mjs +389 -418
- package/dist/types/naylence/fame/node/default-node-identity-policy.d.ts +6 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/node/node.cjs
CHANGED
|
@@ -725,7 +725,7 @@ class TaskCancelledError extends Error {
|
|
|
725
725
|
* Provides functionality similar to Python's asyncio TaskSpawner with proper
|
|
726
726
|
* error handling, cancellation, and graceful shutdown capabilities.
|
|
727
727
|
*/
|
|
728
|
-
const logger$
|
|
728
|
+
const logger$1p = getLogger('naylence.fame.util.task_spawner');
|
|
729
729
|
function firstDefined(source, keys) {
|
|
730
730
|
for (const key of keys) {
|
|
731
731
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
@@ -886,7 +886,7 @@ class TaskSpawner {
|
|
|
886
886
|
const taskId = `task-${++this._taskCounter}`;
|
|
887
887
|
const taskName = normalizedOptions.name || `unnamed-${taskId}`;
|
|
888
888
|
const timeout = normalizedOptions.timeout ?? this._config.defaultTimeout;
|
|
889
|
-
logger$
|
|
889
|
+
logger$1p.debug('starting_background_task', {
|
|
890
890
|
task_name: taskName,
|
|
891
891
|
task_id: taskId,
|
|
892
892
|
});
|
|
@@ -903,7 +903,7 @@ class TaskSpawner {
|
|
|
903
903
|
task.promise
|
|
904
904
|
.then(() => {
|
|
905
905
|
if (!this._suppressCompletionLogging) {
|
|
906
|
-
logger$
|
|
906
|
+
logger$1p.debug('task_completed_successfully', {
|
|
907
907
|
task_name: taskName,
|
|
908
908
|
task_id: taskId,
|
|
909
909
|
duration_ms: Date.now() - task.startTime,
|
|
@@ -957,7 +957,7 @@ class TaskSpawner {
|
|
|
957
957
|
error.name === 'AbortError' ||
|
|
958
958
|
error.message === 'Task cancelled' ||
|
|
959
959
|
error.message === 'Aborted') {
|
|
960
|
-
logger$
|
|
960
|
+
logger$1p.debug('task_cancelled', {
|
|
961
961
|
task_name: taskName,
|
|
962
962
|
note: 'Task cancelled as requested',
|
|
963
963
|
});
|
|
@@ -965,7 +965,7 @@ class TaskSpawner {
|
|
|
965
965
|
}
|
|
966
966
|
// Handle timeout
|
|
967
967
|
if (error instanceof TaskTimeoutError) {
|
|
968
|
-
logger$
|
|
968
|
+
logger$1p.warning('task_timed_out', {
|
|
969
969
|
task_name: taskName,
|
|
970
970
|
error: error.message,
|
|
971
971
|
});
|
|
@@ -977,7 +977,7 @@ class TaskSpawner {
|
|
|
977
977
|
// Handle known WebSocket shutdown race condition (similar to Python version)
|
|
978
978
|
if (error.message.includes("await wasn't used with future") ||
|
|
979
979
|
error.message.includes('WebSocket closed during receive')) {
|
|
980
|
-
logger$
|
|
980
|
+
logger$1p.debug('task_shutdown_race_condition_handled', {
|
|
981
981
|
task_name: taskName,
|
|
982
982
|
note: 'Normal WebSocket close timing during shutdown - not an error',
|
|
983
983
|
});
|
|
@@ -987,7 +987,7 @@ class TaskSpawner {
|
|
|
987
987
|
if (error.name === 'FameTransportClose' ||
|
|
988
988
|
error.message.includes('normal closure') ||
|
|
989
989
|
error.message.includes('Connection closed')) {
|
|
990
|
-
logger$
|
|
990
|
+
logger$1p.debug('task_shutdown_completed_normally', {
|
|
991
991
|
task_name: taskName,
|
|
992
992
|
note: 'Task closed normally during shutdown',
|
|
993
993
|
});
|
|
@@ -995,7 +995,7 @@ class TaskSpawner {
|
|
|
995
995
|
}
|
|
996
996
|
// Handle PKCE redirect "errors" as info
|
|
997
997
|
if (error.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
998
|
-
logger$
|
|
998
|
+
logger$1p.debug('background_task_redirecting', {
|
|
999
999
|
task_name: taskName,
|
|
1000
1000
|
note: 'Task interrupted for PKCE redirect',
|
|
1001
1001
|
});
|
|
@@ -1008,14 +1008,14 @@ class TaskSpawner {
|
|
|
1008
1008
|
// Log retriable errors as warnings (they'll be retried by upstream logic)
|
|
1009
1009
|
// Log non-retriable errors as errors (fatal failures)
|
|
1010
1010
|
if (isRetriableError) {
|
|
1011
|
-
logger$
|
|
1011
|
+
logger$1p.warning('background_task_failed', {
|
|
1012
1012
|
task_name: taskName,
|
|
1013
1013
|
error: error.message,
|
|
1014
1014
|
retriable: true,
|
|
1015
1015
|
});
|
|
1016
1016
|
}
|
|
1017
1017
|
else {
|
|
1018
|
-
logger$
|
|
1018
|
+
logger$1p.error('background_task_failed', {
|
|
1019
1019
|
task_name: taskName,
|
|
1020
1020
|
error: error.message,
|
|
1021
1021
|
stack: error.stack,
|
|
@@ -1034,11 +1034,11 @@ class TaskSpawner {
|
|
|
1034
1034
|
async shutdownTasks(options = {}) {
|
|
1035
1035
|
const { gracePeriod, cancelHanging, joinTimeout } = normalizeShutdownOptions(options);
|
|
1036
1036
|
if (this._tasks.size === 0) {
|
|
1037
|
-
logger$
|
|
1037
|
+
logger$1p.debug('shutdown_tasks_no_tasks_to_shutdown');
|
|
1038
1038
|
return;
|
|
1039
1039
|
}
|
|
1040
1040
|
this._suppressCompletionLogging = true;
|
|
1041
|
-
logger$
|
|
1041
|
+
logger$1p.debug('shutting_down_tasks', {
|
|
1042
1042
|
task_count: this._tasks.size,
|
|
1043
1043
|
task_names: Array.from(this._tasks.values()).map((t) => t.name),
|
|
1044
1044
|
grace_period_ms: gracePeriod,
|
|
@@ -1053,7 +1053,7 @@ class TaskSpawner {
|
|
|
1053
1053
|
if (cancelHanging) {
|
|
1054
1054
|
const stillRunning = tasks.filter((task) => task.getState() === TaskState.RUNNING && !completed.has(task));
|
|
1055
1055
|
if (stillRunning.length > 0) {
|
|
1056
|
-
logger$
|
|
1056
|
+
logger$1p.debug('tasks_did_not_complete_within_grace_period', {
|
|
1057
1057
|
hanging_count: stillRunning.length,
|
|
1058
1058
|
});
|
|
1059
1059
|
// Wait for them to finish with individual timeouts
|
|
@@ -1063,7 +1063,7 @@ class TaskSpawner {
|
|
|
1063
1063
|
}
|
|
1064
1064
|
catch (error) {
|
|
1065
1065
|
if (error instanceof TaskTimeoutError) {
|
|
1066
|
-
logger$
|
|
1066
|
+
logger$1p.warning('task_did_not_shutdown', {
|
|
1067
1067
|
task_name: task.name || task.id,
|
|
1068
1068
|
join_timeout_ms: joinTimeout,
|
|
1069
1069
|
});
|
|
@@ -1074,7 +1074,7 @@ class TaskSpawner {
|
|
|
1074
1074
|
}
|
|
1075
1075
|
else if (!(error instanceof TaskCancelledError)) {
|
|
1076
1076
|
/* istanbul ignore next - unreachable defensive branch */
|
|
1077
|
-
logger$
|
|
1077
|
+
logger$1p.error('task_raised_during_cancellation', {
|
|
1078
1078
|
task_name: task.name || task.id,
|
|
1079
1079
|
error: error instanceof Error ? error.message : String(error),
|
|
1080
1080
|
});
|
|
@@ -1193,7 +1193,7 @@ class TaskSpawner {
|
|
|
1193
1193
|
* condition/promise and ensure at most one notifier coroutine exists for a
|
|
1194
1194
|
* flow at any time.
|
|
1195
1195
|
*/
|
|
1196
|
-
const logger$
|
|
1196
|
+
const logger$1o = getLogger('naylence.fame.flow.flow_controller');
|
|
1197
1197
|
/**
|
|
1198
1198
|
* Simple condition variable implementation for TypeScript/Node.js
|
|
1199
1199
|
* Similar to Python's asyncio.Condition
|
|
@@ -1327,7 +1327,7 @@ class FlowController {
|
|
|
1327
1327
|
const newBalance = Math.max(0, Math.min(this.initialWindow, prev + delta));
|
|
1328
1328
|
this.credits.set(flowId, newBalance);
|
|
1329
1329
|
const crossedZero = prev <= 0 && newBalance > 0;
|
|
1330
|
-
logger$
|
|
1330
|
+
logger$1o.debug('flow_controller_add_credits', {
|
|
1331
1331
|
flow_id: flowId,
|
|
1332
1332
|
delta,
|
|
1333
1333
|
prev_balance: prev,
|
|
@@ -1347,12 +1347,12 @@ class FlowController {
|
|
|
1347
1347
|
async acquire(flowId) {
|
|
1348
1348
|
this.ensureFlow(flowId);
|
|
1349
1349
|
const condition = this.conditions.get(flowId);
|
|
1350
|
-
logger$
|
|
1350
|
+
logger$1o.debug('flow_controller_acquire_attempt', {
|
|
1351
1351
|
flow_id: flowId,
|
|
1352
1352
|
current_balance: this.credits.get(flowId),
|
|
1353
1353
|
});
|
|
1354
1354
|
while (this.credits.get(flowId) <= 0) {
|
|
1355
|
-
logger$
|
|
1355
|
+
logger$1o.debug('flow_controller_waiting_for_credits', {
|
|
1356
1356
|
flow_id: flowId,
|
|
1357
1357
|
current_balance: this.credits.get(flowId),
|
|
1358
1358
|
});
|
|
@@ -1360,12 +1360,12 @@ class FlowController {
|
|
|
1360
1360
|
}
|
|
1361
1361
|
const newBalance = this.credits.get(flowId) - 1;
|
|
1362
1362
|
this.credits.set(flowId, newBalance);
|
|
1363
|
-
logger$
|
|
1363
|
+
logger$1o.debug('flow_controller_acquire_success', {
|
|
1364
1364
|
flow_id: flowId,
|
|
1365
1365
|
new_balance: newBalance,
|
|
1366
1366
|
});
|
|
1367
1367
|
if (newBalance <= this.lowWatermark) {
|
|
1368
|
-
logger$
|
|
1368
|
+
logger$1o.debug('flow_controller_acquire_below_low_watermark', {
|
|
1369
1369
|
flow_id: flowId,
|
|
1370
1370
|
low_watermark: this.lowWatermark,
|
|
1371
1371
|
});
|
|
@@ -1389,7 +1389,7 @@ class FlowController {
|
|
|
1389
1389
|
const current = this.credits.get(flowId);
|
|
1390
1390
|
const remaining = Math.max(current - credits, 0);
|
|
1391
1391
|
this.credits.set(flowId, remaining);
|
|
1392
|
-
logger$
|
|
1392
|
+
logger$1o.debug('flow_controller_consume', {
|
|
1393
1393
|
flow_id: flowId,
|
|
1394
1394
|
requested: credits,
|
|
1395
1395
|
prev_balance: current,
|
|
@@ -1415,7 +1415,7 @@ class FlowController {
|
|
|
1415
1415
|
this.windowIds.delete(flowId);
|
|
1416
1416
|
this.credits.set(flowId, this.initialWindow);
|
|
1417
1417
|
this.wakeWaiters(flowId);
|
|
1418
|
-
logger$
|
|
1418
|
+
logger$1o.debug('flow_controller_flow_reset', {
|
|
1419
1419
|
flow_id: flowId,
|
|
1420
1420
|
reset_balance: this.initialWindow,
|
|
1421
1421
|
});
|
|
@@ -2047,7 +2047,7 @@ class TaskCancellationError extends Error {
|
|
|
2047
2047
|
this.name = 'TaskCancellationError';
|
|
2048
2048
|
}
|
|
2049
2049
|
}
|
|
2050
|
-
const logger$
|
|
2050
|
+
const logger$1n = getLogger('naylence.fame.connector.base_async_connector');
|
|
2051
2051
|
// Environment variables
|
|
2052
2052
|
const ENV_VAR_FAME_FLOW_CONTROL = 'FAME_FLOW_CONTROL';
|
|
2053
2053
|
const FLOW_CONTROL_ENABLED = typeof process !== 'undefined' && process?.env
|
|
@@ -2130,7 +2130,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2130
2130
|
if (this._state !== newState) {
|
|
2131
2131
|
const oldState = this._state;
|
|
2132
2132
|
this._state = newState;
|
|
2133
|
-
logger$
|
|
2133
|
+
logger$1n.debug('connector_state_transition', {
|
|
2134
2134
|
connector_id: this._connectorFlowId,
|
|
2135
2135
|
old_state: oldState,
|
|
2136
2136
|
new_state: newState,
|
|
@@ -2169,12 +2169,12 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2169
2169
|
* Stop the connector gracefully
|
|
2170
2170
|
*/
|
|
2171
2171
|
async stop() {
|
|
2172
|
-
logger$
|
|
2172
|
+
logger$1n.debug('stopping_connector', {
|
|
2173
2173
|
current_state: this._state,
|
|
2174
2174
|
connector_id: this._connectorFlowId,
|
|
2175
2175
|
});
|
|
2176
2176
|
if (!core.ConnectorStateUtils.canStop(this._state)) {
|
|
2177
|
-
logger$
|
|
2177
|
+
logger$1n.debug('connector_stop_already_stopped', {
|
|
2178
2178
|
current_state: this._state,
|
|
2179
2179
|
connector_id: this._connectorFlowId,
|
|
2180
2180
|
});
|
|
@@ -2185,7 +2185,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2185
2185
|
if (this._lastError) {
|
|
2186
2186
|
throw this._lastError;
|
|
2187
2187
|
}
|
|
2188
|
-
logger$
|
|
2188
|
+
logger$1n.debug('connector_stopped', {
|
|
2189
2189
|
current_state: this._state,
|
|
2190
2190
|
connector_id: this._connectorFlowId,
|
|
2191
2191
|
});
|
|
@@ -2194,19 +2194,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2194
2194
|
* Pause the connector (suspends heartbeat and housekeeping, but keeps connection alive)
|
|
2195
2195
|
*/
|
|
2196
2196
|
async pause() {
|
|
2197
|
-
logger$
|
|
2197
|
+
logger$1n.debug('pausing_connector', {
|
|
2198
2198
|
current_state: this._state,
|
|
2199
2199
|
connector_id: this._connectorFlowId,
|
|
2200
2200
|
});
|
|
2201
2201
|
if (this._state !== core.ConnectorState.STARTED) {
|
|
2202
|
-
logger$
|
|
2202
|
+
logger$1n.debug('connector_pause_invalid_state', {
|
|
2203
2203
|
current_state: this._state,
|
|
2204
2204
|
connector_id: this._connectorFlowId,
|
|
2205
2205
|
});
|
|
2206
2206
|
return;
|
|
2207
2207
|
}
|
|
2208
2208
|
this._setState(core.ConnectorState.PAUSED);
|
|
2209
|
-
logger$
|
|
2209
|
+
logger$1n.debug('connector_paused', {
|
|
2210
2210
|
current_state: this._state,
|
|
2211
2211
|
connector_id: this._connectorFlowId,
|
|
2212
2212
|
});
|
|
@@ -2215,19 +2215,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2215
2215
|
* Resume the connector from paused state
|
|
2216
2216
|
*/
|
|
2217
2217
|
async resume() {
|
|
2218
|
-
logger$
|
|
2218
|
+
logger$1n.debug('resuming_connector', {
|
|
2219
2219
|
current_state: this._state,
|
|
2220
2220
|
connector_id: this._connectorFlowId,
|
|
2221
2221
|
});
|
|
2222
2222
|
if (this._state !== core.ConnectorState.PAUSED) {
|
|
2223
|
-
logger$
|
|
2223
|
+
logger$1n.debug('connector_resume_invalid_state', {
|
|
2224
2224
|
current_state: this._state,
|
|
2225
2225
|
connector_id: this._connectorFlowId,
|
|
2226
2226
|
});
|
|
2227
2227
|
return;
|
|
2228
2228
|
}
|
|
2229
2229
|
this._setState(core.ConnectorState.STARTED);
|
|
2230
|
-
logger$
|
|
2230
|
+
logger$1n.debug('connector_resumed', {
|
|
2231
2231
|
current_state: this._state,
|
|
2232
2232
|
connector_id: this._connectorFlowId,
|
|
2233
2233
|
});
|
|
@@ -2237,7 +2237,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2237
2237
|
*/
|
|
2238
2238
|
async close(code = 1000, reason = 'normal closure') {
|
|
2239
2239
|
if (!core.ConnectorStateUtils.canClose(this._state)) {
|
|
2240
|
-
logger$
|
|
2240
|
+
logger$1n.warning('connector_close_invalid_state', {
|
|
2241
2241
|
current_state: this._state,
|
|
2242
2242
|
connector_id: this._connectorFlowId,
|
|
2243
2243
|
});
|
|
@@ -2318,7 +2318,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2318
2318
|
// Add to queue and notify send loop
|
|
2319
2319
|
this._sendQueue.push(raw);
|
|
2320
2320
|
// Log for debugging
|
|
2321
|
-
logger$
|
|
2321
|
+
logger$1n.debug('send_envelope_queued', {
|
|
2322
2322
|
queue_length: this._sendQueue.length,
|
|
2323
2323
|
max_queue_size: this._maxQueueSize,
|
|
2324
2324
|
});
|
|
@@ -2367,14 +2367,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2367
2367
|
const item = this._sendQueue[0];
|
|
2368
2368
|
if (!item)
|
|
2369
2369
|
continue;
|
|
2370
|
-
logger$
|
|
2370
|
+
logger$1n.debug('send_loop_processing_item', {
|
|
2371
2371
|
queue_length_before_send: this._sendQueue.length,
|
|
2372
2372
|
});
|
|
2373
2373
|
// Send through transport (this may block)
|
|
2374
2374
|
await this._transportSendBytes(item);
|
|
2375
2375
|
// Only remove from queue after successful send
|
|
2376
2376
|
this._sendQueue.shift();
|
|
2377
|
-
logger$
|
|
2377
|
+
logger$1n.debug('send_loop_item_sent', {
|
|
2378
2378
|
queue_length_after_send: this._sendQueue.length,
|
|
2379
2379
|
});
|
|
2380
2380
|
}
|
|
@@ -2387,14 +2387,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2387
2387
|
}
|
|
2388
2388
|
else if (error instanceof TaskCancellationError) {
|
|
2389
2389
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
2390
|
-
logger$
|
|
2390
|
+
logger$1n.debug('send loop cancelled', {
|
|
2391
2391
|
connector: this.constructor.name,
|
|
2392
2392
|
reason: error.message,
|
|
2393
2393
|
});
|
|
2394
2394
|
// Don't re-throw - this is normal during shutdown
|
|
2395
2395
|
}
|
|
2396
2396
|
else {
|
|
2397
|
-
logger$
|
|
2397
|
+
logger$1n.critical('unexpected exception in send loop', {
|
|
2398
2398
|
connector: this.constructor.name,
|
|
2399
2399
|
error: error instanceof Error ? error.message : String(error),
|
|
2400
2400
|
});
|
|
@@ -2435,7 +2435,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2435
2435
|
env = JSON.parse(jsonStr);
|
|
2436
2436
|
}
|
|
2437
2437
|
catch (error) {
|
|
2438
|
-
logger$
|
|
2438
|
+
logger$1n.error('Invalid envelope', {
|
|
2439
2439
|
message: message.toString(),
|
|
2440
2440
|
error: error instanceof Error ? error.message : String(error),
|
|
2441
2441
|
});
|
|
@@ -2459,7 +2459,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2459
2459
|
};
|
|
2460
2460
|
await withEnvelopeContextAsync(envelopeContext, async () => {
|
|
2461
2461
|
const prettyEnvelope = prettyModel$1(env);
|
|
2462
|
-
logger$
|
|
2462
|
+
logger$1n.trace('connector_received_envelope', {
|
|
2463
2463
|
envelope: env,
|
|
2464
2464
|
pretty: prettyEnvelope,
|
|
2465
2465
|
});
|
|
@@ -2488,7 +2488,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2488
2488
|
if (error instanceof TaskCancellationError) {
|
|
2489
2489
|
throw error;
|
|
2490
2490
|
}
|
|
2491
|
-
logger$
|
|
2491
|
+
logger$1n.error('handler_failed', {
|
|
2492
2492
|
error: error instanceof Error ? error.message : String(error),
|
|
2493
2493
|
envelope_id: env.id ?? null,
|
|
2494
2494
|
trace_id: env.traceId ?? null,
|
|
@@ -2509,14 +2509,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2509
2509
|
}
|
|
2510
2510
|
else if (error instanceof TaskCancellationError) {
|
|
2511
2511
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
2512
|
-
logger$
|
|
2512
|
+
logger$1n.debug('receive loop cancelled', {
|
|
2513
2513
|
connector: this.constructor.name,
|
|
2514
2514
|
reason: error.message,
|
|
2515
2515
|
});
|
|
2516
2516
|
// Don't re-throw - this is normal during shutdown
|
|
2517
2517
|
}
|
|
2518
2518
|
else {
|
|
2519
|
-
logger$
|
|
2519
|
+
logger$1n.critical('unexpected_error_in recv_loop', {
|
|
2520
2520
|
error: error instanceof Error ? error.message : String(error),
|
|
2521
2521
|
});
|
|
2522
2522
|
throw error;
|
|
@@ -2532,7 +2532,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2532
2532
|
async _maybeEmitCredit(flowId, traceId) {
|
|
2533
2533
|
const remainingCredits = this._flowCtrl.getCredits(flowId);
|
|
2534
2534
|
const needsRefill = this._flowCtrl.needsRefill(flowId);
|
|
2535
|
-
logger$
|
|
2535
|
+
logger$1n.debug('maybe_emit_credit_check', {
|
|
2536
2536
|
connector_id: this._connectorFlowId,
|
|
2537
2537
|
flow_id: flowId,
|
|
2538
2538
|
trace_id: traceId ?? null,
|
|
@@ -2548,7 +2548,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2548
2548
|
}
|
|
2549
2549
|
const delta = this._initialWindow;
|
|
2550
2550
|
this._flowCtrl.addCredits(flowId, delta);
|
|
2551
|
-
logger$
|
|
2551
|
+
logger$1n.debug('maybe_emit_credit_emit', {
|
|
2552
2552
|
connector_id: this._connectorFlowId,
|
|
2553
2553
|
flow_id: flowId,
|
|
2554
2554
|
trace_id: traceId ?? null,
|
|
@@ -2568,7 +2568,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2568
2568
|
});
|
|
2569
2569
|
try {
|
|
2570
2570
|
await this.send(ackEnv);
|
|
2571
|
-
logger$
|
|
2571
|
+
logger$1n.debug('maybe_emit_credit_sent', {
|
|
2572
2572
|
connector_id: this._connectorFlowId,
|
|
2573
2573
|
flow_id: flowId,
|
|
2574
2574
|
trace_id: traceId ?? null,
|
|
@@ -2576,7 +2576,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2576
2576
|
});
|
|
2577
2577
|
}
|
|
2578
2578
|
catch (error) {
|
|
2579
|
-
logger$
|
|
2579
|
+
logger$1n.error('maybe_emit_credit_send_failed', {
|
|
2580
2580
|
connector_id: this._connectorFlowId,
|
|
2581
2581
|
flow_id: flowId,
|
|
2582
2582
|
trace_id: traceId ?? null,
|
|
@@ -2601,13 +2601,13 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2601
2601
|
*/
|
|
2602
2602
|
async _shutdown(code, reason, gracePeriod, exc) {
|
|
2603
2603
|
if (this._closed) {
|
|
2604
|
-
logger$
|
|
2604
|
+
logger$1n.debug('shutdown_already_closed', {
|
|
2605
2605
|
connector_id: this._connectorFlowId,
|
|
2606
2606
|
current_state: this._state,
|
|
2607
2607
|
});
|
|
2608
2608
|
return;
|
|
2609
2609
|
}
|
|
2610
|
-
logger$
|
|
2610
|
+
logger$1n.debug('connector_shutdown_starting', {
|
|
2611
2611
|
connector_id: this._connectorFlowId,
|
|
2612
2612
|
connector_type: this.constructor.name,
|
|
2613
2613
|
code,
|
|
@@ -2637,19 +2637,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2637
2637
|
this._sendPromiseResolve = undefined;
|
|
2638
2638
|
}
|
|
2639
2639
|
// Close transport
|
|
2640
|
-
logger$
|
|
2640
|
+
logger$1n.debug('connector_closing_transport', {
|
|
2641
2641
|
connector_id: this._connectorFlowId,
|
|
2642
2642
|
connector_type: this.constructor.name,
|
|
2643
2643
|
timestamp: new Date().toISOString(),
|
|
2644
2644
|
});
|
|
2645
2645
|
await this._transportClose(code, reason);
|
|
2646
|
-
logger$
|
|
2646
|
+
logger$1n.debug('connector_transport_closed', {
|
|
2647
2647
|
connector_id: this._connectorFlowId,
|
|
2648
2648
|
connector_type: this.constructor.name,
|
|
2649
2649
|
timestamp: new Date().toISOString(),
|
|
2650
2650
|
});
|
|
2651
2651
|
// Shutdown spawned tasks
|
|
2652
|
-
logger$
|
|
2652
|
+
logger$1n.debug('connector_shutting_down_tasks', {
|
|
2653
2653
|
connector_id: this._connectorFlowId,
|
|
2654
2654
|
connector_type: this.constructor.name,
|
|
2655
2655
|
grace_period_ms: effectiveGracePeriod * 1000,
|
|
@@ -2661,14 +2661,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2661
2661
|
gracePeriod: effectiveGracePeriod * 1000, // Convert to milliseconds
|
|
2662
2662
|
joinTimeout: this._shutdownJoinTimeout,
|
|
2663
2663
|
});
|
|
2664
|
-
logger$
|
|
2664
|
+
logger$1n.debug('connector_tasks_shutdown_complete', {
|
|
2665
2665
|
connector_id: this._connectorFlowId,
|
|
2666
2666
|
connector_type: this.constructor.name,
|
|
2667
2667
|
timestamp: new Date().toISOString(),
|
|
2668
2668
|
});
|
|
2669
2669
|
}
|
|
2670
2670
|
catch (error) {
|
|
2671
|
-
logger$
|
|
2671
|
+
logger$1n.warning('task_shutdown_error', {
|
|
2672
2672
|
connector_id: this._connectorFlowId,
|
|
2673
2673
|
error: error instanceof Error ? error.message : String(error),
|
|
2674
2674
|
});
|
|
@@ -2681,7 +2681,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2681
2681
|
if (this._closeResolver) {
|
|
2682
2682
|
this._closeResolver();
|
|
2683
2683
|
}
|
|
2684
|
-
logger$
|
|
2684
|
+
logger$1n.debug('connector_shutdown_complete', {
|
|
2685
2685
|
connector_id: this._connectorFlowId,
|
|
2686
2686
|
connector_type: this.constructor.name,
|
|
2687
2687
|
final_state: this._state,
|
|
@@ -2702,7 +2702,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2702
2702
|
* A transport adapter that works with both Node.js and browser WebSocket APIs.
|
|
2703
2703
|
* Supports both native WebSocket clients and server-side WebSocket connections.
|
|
2704
2704
|
*/
|
|
2705
|
-
const logger$
|
|
2705
|
+
const logger$1m = getLogger('naylence.fame.connector.websocket_connector');
|
|
2706
2706
|
/**
|
|
2707
2707
|
* WebSocket state constants (mirrors standard WebSocket states)
|
|
2708
2708
|
*/
|
|
@@ -2743,7 +2743,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2743
2743
|
websocket.send_bytes &&
|
|
2744
2744
|
typeof websocket.receive_bytes === 'function' &&
|
|
2745
2745
|
typeof websocket.send_bytes === 'function');
|
|
2746
|
-
logger$
|
|
2746
|
+
logger$1m.debug('websocket_connector_created', {
|
|
2747
2747
|
is_fastapi_like: this._isFastApiLike,
|
|
2748
2748
|
ready_state: websocket.readyState,
|
|
2749
2749
|
url: websocket.url,
|
|
@@ -2758,7 +2758,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2758
2758
|
socketAny.binaryType = 'arraybuffer';
|
|
2759
2759
|
}
|
|
2760
2760
|
catch (error) {
|
|
2761
|
-
logger$
|
|
2761
|
+
logger$1m.debug('websocket_set_binary_type_failed', {
|
|
2762
2762
|
error: error instanceof Error ? error.message : String(error),
|
|
2763
2763
|
current_type: socketAny.binaryType,
|
|
2764
2764
|
});
|
|
@@ -2814,7 +2814,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2814
2814
|
else {
|
|
2815
2815
|
this._receiveQueue.push(data);
|
|
2816
2816
|
}
|
|
2817
|
-
logger$
|
|
2817
|
+
logger$1m.debug('websocket_message_pushed_to_queue', {
|
|
2818
2818
|
queueLength: this._receiveQueue.length,
|
|
2819
2819
|
waitersLength: this._receiveWaiters.length,
|
|
2820
2820
|
});
|
|
@@ -2867,7 +2867,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2867
2867
|
const result = receiveMethod.call(this._websocket);
|
|
2868
2868
|
// Ensure we have a Promise
|
|
2869
2869
|
if (!result || typeof result.then !== 'function') {
|
|
2870
|
-
logger$
|
|
2870
|
+
logger$1m.error('fastapi_receive_not_awaitable', {
|
|
2871
2871
|
result_type: typeof result,
|
|
2872
2872
|
result_str: String(result).substring(0, 100),
|
|
2873
2873
|
});
|
|
@@ -2883,7 +2883,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2883
2883
|
}
|
|
2884
2884
|
// Handle known WebSocket shutdown race condition
|
|
2885
2885
|
if (this._isAwaitFutureError(error)) {
|
|
2886
|
-
logger$
|
|
2886
|
+
logger$1m.debug('websocket_shutdown_race_condition_handled', {
|
|
2887
2887
|
note: 'Normal WebSocket close timing - converting to cancellation',
|
|
2888
2888
|
websocket_state: this._websocket.client_state || 'unknown',
|
|
2889
2889
|
});
|
|
@@ -2926,7 +2926,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2926
2926
|
}
|
|
2927
2927
|
catch (error) {
|
|
2928
2928
|
if (this._isAwaitFutureError(error)) {
|
|
2929
|
-
logger$
|
|
2929
|
+
logger$1m.debug('websocket_shutdown_race_condition_detected', {
|
|
2930
2930
|
websocket_type: this._websocket.constructor.name,
|
|
2931
2931
|
is_fastapi: this._isFastApiLike,
|
|
2932
2932
|
note: 'Normal WebSocket close timing during shutdown',
|
|
@@ -2972,12 +2972,12 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2972
2972
|
if (socketAny.readyState !== WebSocketState.CLOSED) {
|
|
2973
2973
|
try {
|
|
2974
2974
|
socketAny.terminate();
|
|
2975
|
-
logger$
|
|
2975
|
+
logger$1m.debug('websocket_force_terminated', {
|
|
2976
2976
|
ready_state: socketAny.readyState,
|
|
2977
2977
|
});
|
|
2978
2978
|
}
|
|
2979
2979
|
catch (error) {
|
|
2980
|
-
logger$
|
|
2980
|
+
logger$1m.debug('websocket_force_terminate_failed', {
|
|
2981
2981
|
error: error instanceof Error ? error.message : String(error),
|
|
2982
2982
|
});
|
|
2983
2983
|
}
|
|
@@ -2988,7 +2988,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2988
2988
|
}
|
|
2989
2989
|
}
|
|
2990
2990
|
catch (error) {
|
|
2991
|
-
logger$
|
|
2991
|
+
logger$1m.error('websocket_close_failed', {
|
|
2992
2992
|
error: error instanceof Error ? error.message : String(error),
|
|
2993
2993
|
});
|
|
2994
2994
|
// Don't re-throw - close errors are not critical during shutdown
|
|
@@ -3209,7 +3209,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
3209
3209
|
this._removeReceiveHandlers();
|
|
3210
3210
|
}
|
|
3211
3211
|
catch (error) {
|
|
3212
|
-
logger$
|
|
3212
|
+
logger$1m.debug('websocket_remove_handlers_failed', {
|
|
3213
3213
|
error: error instanceof Error ? error.message : String(error),
|
|
3214
3214
|
});
|
|
3215
3215
|
}
|
|
@@ -3263,7 +3263,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
3263
3263
|
* Concrete implementations must define supported grant types and provide grant-to-connector
|
|
3264
3264
|
* conversion logic.
|
|
3265
3265
|
*/
|
|
3266
|
-
const logger$
|
|
3266
|
+
const logger$1l = getLogger('naylence.fame.connector.connector_factory');
|
|
3267
3267
|
const CONNECTOR_FACTORY_BASE_TYPE = 'ConnectorFactory';
|
|
3268
3268
|
/**
|
|
3269
3269
|
* Abstract base class for connector factories
|
|
@@ -3299,7 +3299,7 @@ class ConnectorFactory {
|
|
|
3299
3299
|
}
|
|
3300
3300
|
}
|
|
3301
3301
|
catch (error) {
|
|
3302
|
-
logger$
|
|
3302
|
+
logger$1l.warning(`Failed to evaluate grant with factory ${factoryInfo.constructor.name}: ${error}`);
|
|
3303
3303
|
continue;
|
|
3304
3304
|
}
|
|
3305
3305
|
}
|
|
@@ -3342,7 +3342,7 @@ class ConnectorFactory {
|
|
|
3342
3342
|
}
|
|
3343
3343
|
}
|
|
3344
3344
|
catch (error) {
|
|
3345
|
-
logger$
|
|
3345
|
+
logger$1l.warning(`Failed to create connector config from grant: ${error}`);
|
|
3346
3346
|
continue;
|
|
3347
3347
|
}
|
|
3348
3348
|
}
|
|
@@ -3409,20 +3409,20 @@ class ConnectorFactory {
|
|
|
3409
3409
|
return existing;
|
|
3410
3410
|
}
|
|
3411
3411
|
if (existing && !this.isGrantAware(existing)) {
|
|
3412
|
-
logger$
|
|
3412
|
+
logger$1l.warning(`Factory ${factoryInfo.constructor.name} is registered under ${CONNECTOR_FACTORY_BASE_TYPE} but is missing grant conversion APIs; skipping.`);
|
|
3413
3413
|
return null;
|
|
3414
3414
|
}
|
|
3415
3415
|
try {
|
|
3416
3416
|
const instance = new factoryInfo.constructor();
|
|
3417
3417
|
if (!this.isGrantAware(instance)) {
|
|
3418
|
-
logger$
|
|
3418
|
+
logger$1l.warning(`Factory ${factoryInfo.constructor.name} does not implement grant conversion APIs required by ${CONNECTOR_FACTORY_BASE_TYPE}; skipping.`);
|
|
3419
3419
|
return null;
|
|
3420
3420
|
}
|
|
3421
3421
|
factoryInfo.instance = instance;
|
|
3422
3422
|
return instance;
|
|
3423
3423
|
}
|
|
3424
3424
|
catch (error) {
|
|
3425
|
-
logger$
|
|
3425
|
+
logger$1l.warning(`Failed to instantiate factory ${factoryInfo.constructor.name} while resolving grant conversion APIs: ${error}`);
|
|
3426
3426
|
return null;
|
|
3427
3427
|
}
|
|
3428
3428
|
}
|
|
@@ -3581,7 +3581,7 @@ class AuthInjectionStrategyFactory extends factory.AbstractResourceFactory {
|
|
|
3581
3581
|
}
|
|
3582
3582
|
}
|
|
3583
3583
|
|
|
3584
|
-
const logger$
|
|
3584
|
+
const logger$1k = getLogger('naylence.fame.connector.websocket_connector_factory');
|
|
3585
3585
|
let sslLoader = null;
|
|
3586
3586
|
function setWebSocketConnectorSslLoader(loader) {
|
|
3587
3587
|
sslLoader = loader;
|
|
@@ -3865,7 +3865,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
|
|
|
3865
3865
|
}
|
|
3866
3866
|
async _defaultWebSocketClient(url, subprotocols, headers) {
|
|
3867
3867
|
try {
|
|
3868
|
-
logger$
|
|
3868
|
+
logger$1k.debug('websocket_connector_connecting', { url, subprotocols });
|
|
3869
3869
|
if (typeof window !== 'undefined' &&
|
|
3870
3870
|
typeof window.WebSocket !== 'undefined') {
|
|
3871
3871
|
return await this._createBrowserWebSocket(url, subprotocols);
|
|
@@ -3948,7 +3948,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
|
|
|
3948
3948
|
await Promise.resolve().then(function () { return websocketConnectorNodeSsl; });
|
|
3949
3949
|
}
|
|
3950
3950
|
catch (error) {
|
|
3951
|
-
logger$
|
|
3951
|
+
logger$1k.debug('ssl_certificate_loader_import_failed', {
|
|
3952
3952
|
error: error instanceof Error ? error.message : String(error),
|
|
3953
3953
|
});
|
|
3954
3954
|
}
|
|
@@ -3957,7 +3957,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
|
|
|
3957
3957
|
if (!loader) {
|
|
3958
3958
|
return undefined;
|
|
3959
3959
|
}
|
|
3960
|
-
return await loader(logger$
|
|
3960
|
+
return await loader(logger$1k);
|
|
3961
3961
|
}
|
|
3962
3962
|
}
|
|
3963
3963
|
|
|
@@ -4436,12 +4436,12 @@ async function ensureRuntimeFactoriesRegistered(registry = factory.Registry) {
|
|
|
4436
4436
|
}
|
|
4437
4437
|
|
|
4438
4438
|
// This file is auto-generated during build - do not edit manually
|
|
4439
|
-
// Generated from package.json version: 0.4.
|
|
4439
|
+
// Generated from package.json version: 0.4.2
|
|
4440
4440
|
/**
|
|
4441
4441
|
* The package version, injected at build time.
|
|
4442
4442
|
* @internal
|
|
4443
4443
|
*/
|
|
4444
|
-
const VERSION = '0.4.
|
|
4444
|
+
const VERSION = '0.4.2';
|
|
4445
4445
|
|
|
4446
4446
|
let initialized = false;
|
|
4447
4447
|
const runtimePlugin = {
|
|
@@ -5648,7 +5648,7 @@ async function withLock(lock, operation) {
|
|
|
5648
5648
|
return await lock.runExclusive(operation);
|
|
5649
5649
|
}
|
|
5650
5650
|
|
|
5651
|
-
const logger$
|
|
5651
|
+
const logger$1j = getLogger('naylence.fame.storage.sqlite_storage_provider');
|
|
5652
5652
|
let cachedSqliteCtor;
|
|
5653
5653
|
async function loadSqliteConstructor() {
|
|
5654
5654
|
if (cachedSqliteCtor !== undefined) {
|
|
@@ -5672,7 +5672,7 @@ async function loadSqliteConstructor() {
|
|
|
5672
5672
|
}
|
|
5673
5673
|
catch (error) {
|
|
5674
5674
|
cachedSqliteCtor = null;
|
|
5675
|
-
logger$
|
|
5675
|
+
logger$1j.error('failed-to-load-better-sqlite3', {
|
|
5676
5676
|
error: error instanceof Error ? error.message : String(error),
|
|
5677
5677
|
});
|
|
5678
5678
|
throw new Error('Failed to load better-sqlite3. Install it to enable SQLite storage support.');
|
|
@@ -5707,7 +5707,7 @@ class SQLiteKeyValueStore {
|
|
|
5707
5707
|
}
|
|
5708
5708
|
catch (error) {
|
|
5709
5709
|
if (this.autoRecover && this.isCorruptionError(error)) {
|
|
5710
|
-
logger$
|
|
5710
|
+
logger$1j.warning('detected-corrupted-db', { path: this.dbPath });
|
|
5711
5711
|
await this.recoverCorruptedDb();
|
|
5712
5712
|
if (!this.db) {
|
|
5713
5713
|
throw new Error('Failed to recover SQLite database');
|
|
@@ -5762,7 +5762,7 @@ class SQLiteKeyValueStore {
|
|
|
5762
5762
|
await this.closeDatabase();
|
|
5763
5763
|
await this.quarantineCorruptedFiles();
|
|
5764
5764
|
await this.openDatabase();
|
|
5765
|
-
logger$
|
|
5765
|
+
logger$1j.warning('quarantined-corrupted-db', { path: this.dbPath });
|
|
5766
5766
|
}
|
|
5767
5767
|
async closeDatabase() {
|
|
5768
5768
|
if (this.db) {
|
|
@@ -5770,7 +5770,7 @@ class SQLiteKeyValueStore {
|
|
|
5770
5770
|
this.db.close();
|
|
5771
5771
|
}
|
|
5772
5772
|
catch (error) {
|
|
5773
|
-
logger$
|
|
5773
|
+
logger$1j.warning('failed-to-close-sqlite-db', {
|
|
5774
5774
|
path: this.dbPath,
|
|
5775
5775
|
error: error instanceof Error ? error.message : String(error),
|
|
5776
5776
|
});
|
|
@@ -5793,7 +5793,7 @@ class SQLiteKeyValueStore {
|
|
|
5793
5793
|
await fsPromises.rename(candidate, quarantinedName);
|
|
5794
5794
|
}
|
|
5795
5795
|
catch (error) {
|
|
5796
|
-
logger$
|
|
5796
|
+
logger$1j.error('failed-to-quarantine-sqlite-file', {
|
|
5797
5797
|
file: candidate,
|
|
5798
5798
|
error: error instanceof Error ? error.message : String(error),
|
|
5799
5799
|
});
|
|
@@ -5894,7 +5894,7 @@ class SQLiteKeyValueStore {
|
|
|
5894
5894
|
result[row.key] = this.deserialize(row.value);
|
|
5895
5895
|
}
|
|
5896
5896
|
catch (error) {
|
|
5897
|
-
logger$
|
|
5897
|
+
logger$1j.warning('skipping-corrupted-sqlite-entry', {
|
|
5898
5898
|
key: row.key,
|
|
5899
5899
|
error: error instanceof Error ? error.message : String(error),
|
|
5900
5900
|
});
|
|
@@ -6889,7 +6889,7 @@ class InMemoryBinding {
|
|
|
6889
6889
|
* TypeScript port of Python's InMemoryFanoutBroker that extends TaskSpawner
|
|
6890
6890
|
* to manage multiple WriteChannel subscribers with concurrent message distribution.
|
|
6891
6891
|
*/
|
|
6892
|
-
const logger$
|
|
6892
|
+
const logger$1i = getLogger('naylence.fame.channel.in_memory.in_memory_fanout_broker');
|
|
6893
6893
|
// Sentinel object for shutdown signaling
|
|
6894
6894
|
const SENTINEL = Symbol('fanout-broker-sentinel');
|
|
6895
6895
|
function isCloseable(obj) {
|
|
@@ -6942,7 +6942,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6942
6942
|
}
|
|
6943
6943
|
catch (error) {
|
|
6944
6944
|
// Ignore errors when sending sentinel (sink might be closed)
|
|
6945
|
-
logger$
|
|
6945
|
+
logger$1i.debug('error_sending_sentinel', {
|
|
6946
6946
|
error: error.message,
|
|
6947
6947
|
});
|
|
6948
6948
|
}
|
|
@@ -6956,7 +6956,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6956
6956
|
await sub.close();
|
|
6957
6957
|
}
|
|
6958
6958
|
catch (error) {
|
|
6959
|
-
logger$
|
|
6959
|
+
logger$1i.error('error_closing_subscriber', {
|
|
6960
6960
|
subscriber: sub.toString(),
|
|
6961
6961
|
error: error.message,
|
|
6962
6962
|
});
|
|
@@ -6996,7 +6996,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6996
6996
|
[envelope, context] = core.extractEnvelopeAndContext(msg);
|
|
6997
6997
|
}
|
|
6998
6998
|
catch (error) {
|
|
6999
|
-
logger$
|
|
6999
|
+
logger$1i.debug('failed_to_extract_envelope', {
|
|
7000
7000
|
error: error.message,
|
|
7001
7001
|
});
|
|
7002
7002
|
continue;
|
|
@@ -7018,7 +7018,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7018
7018
|
await sub.send(messageToSend);
|
|
7019
7019
|
}
|
|
7020
7020
|
catch (error) {
|
|
7021
|
-
logger$
|
|
7021
|
+
logger$1i.error('error_sending_to_subscriber', {
|
|
7022
7022
|
subscriber: sub.toString(),
|
|
7023
7023
|
error: error.message,
|
|
7024
7024
|
action: 'unsubscribing',
|
|
@@ -7034,7 +7034,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7034
7034
|
}
|
|
7035
7035
|
catch (error) {
|
|
7036
7036
|
// Critical broker-level error: log and back off, but keep the loop running
|
|
7037
|
-
logger$
|
|
7037
|
+
logger$1i.critical('receive_loop_failed_unexpectedly', {
|
|
7038
7038
|
error: error.message,
|
|
7039
7039
|
stack: error.stack,
|
|
7040
7040
|
});
|
|
@@ -7743,7 +7743,7 @@ function normalizeResponseType(value) {
|
|
|
7743
7743
|
return value;
|
|
7744
7744
|
}
|
|
7745
7745
|
|
|
7746
|
-
const logger$
|
|
7746
|
+
const logger$1h = getLogger('naylence.fame.node.binding_manager');
|
|
7747
7747
|
const SYSTEM_INBOX$3 = '__sys__';
|
|
7748
7748
|
const DEFAULT_ACK_TIMEOUT_MS = 20000;
|
|
7749
7749
|
class BindingStoreEntryRecord {
|
|
@@ -7829,7 +7829,7 @@ class BindingManager {
|
|
|
7829
7829
|
if (!this.bindings.has(key)) {
|
|
7830
7830
|
const binding = this.bindingFactory(new core.FameAddress(key));
|
|
7831
7831
|
this.bindings.set(key, binding);
|
|
7832
|
-
logger$
|
|
7832
|
+
logger$1h.debug('restored_binding', { address: key });
|
|
7833
7833
|
}
|
|
7834
7834
|
}
|
|
7835
7835
|
if (!this.hasUpstream) {
|
|
@@ -7839,13 +7839,13 @@ class BindingManager {
|
|
|
7839
7839
|
await this.readvertiseCapabilitiesUpstream();
|
|
7840
7840
|
}
|
|
7841
7841
|
async bind(participant, capabilities) {
|
|
7842
|
-
logger$
|
|
7842
|
+
logger$1h.debug('binding_participant', { participant });
|
|
7843
7843
|
const { prefixAddress, addresses, propagateAddress, capabilityAddress } = this.computeBindingAddresses(participant);
|
|
7844
7844
|
for (const address of addresses) {
|
|
7845
7845
|
if (!this.bindings.has(address)) {
|
|
7846
7846
|
const binding = this.bindingFactory(new core.FameAddress(address));
|
|
7847
7847
|
this.bindings.set(address, binding);
|
|
7848
|
-
logger$
|
|
7848
|
+
logger$1h.debug('bound_address', { address, participant });
|
|
7849
7849
|
}
|
|
7850
7850
|
}
|
|
7851
7851
|
let propagatedAddress = null;
|
|
@@ -7874,7 +7874,7 @@ class BindingManager {
|
|
|
7874
7874
|
await this.unbindAddressUpstream(propagatedAddress);
|
|
7875
7875
|
}
|
|
7876
7876
|
catch (rollbackError) {
|
|
7877
|
-
logger$
|
|
7877
|
+
logger$1h.error('bind_rollback_failed', {
|
|
7878
7878
|
address: propagatedAddress.toString(),
|
|
7879
7879
|
error: rollbackError.message,
|
|
7880
7880
|
});
|
|
@@ -7893,7 +7893,7 @@ class BindingManager {
|
|
|
7893
7893
|
physicalPath: null,
|
|
7894
7894
|
});
|
|
7895
7895
|
}
|
|
7896
|
-
logger$
|
|
7896
|
+
logger$1h.debug('bind_success', {
|
|
7897
7897
|
participant,
|
|
7898
7898
|
address: prefixAddress.toString(),
|
|
7899
7899
|
capabilities,
|
|
@@ -7929,7 +7929,7 @@ class BindingManager {
|
|
|
7929
7929
|
await this.bindingStore.delete(address);
|
|
7930
7930
|
}
|
|
7931
7931
|
}
|
|
7932
|
-
logger$
|
|
7932
|
+
logger$1h.debug('unbind_success', {
|
|
7933
7933
|
participant,
|
|
7934
7934
|
address: prefixAddress.toString(),
|
|
7935
7935
|
totalBindings: this.bindings.size,
|
|
@@ -7959,7 +7959,7 @@ class BindingManager {
|
|
|
7959
7959
|
await this.bindAddressUpstream(new core.FameAddress(address));
|
|
7960
7960
|
}
|
|
7961
7961
|
catch (error) {
|
|
7962
|
-
logger$
|
|
7962
|
+
logger$1h.error('rebind_failed', {
|
|
7963
7963
|
address,
|
|
7964
7964
|
error: error.message,
|
|
7965
7965
|
});
|
|
@@ -7978,7 +7978,7 @@ class BindingManager {
|
|
|
7978
7978
|
await this.advertiseCapabilities(new core.FameAddress(address), Array.from(capabilities));
|
|
7979
7979
|
}
|
|
7980
7980
|
catch (error) {
|
|
7981
|
-
logger$
|
|
7981
|
+
logger$1h.error('capability_replay_failed', {
|
|
7982
7982
|
address,
|
|
7983
7983
|
error: error.message,
|
|
7984
7984
|
});
|
|
@@ -8245,7 +8245,7 @@ class BindingManager {
|
|
|
8245
8245
|
}
|
|
8246
8246
|
}
|
|
8247
8247
|
|
|
8248
|
-
const logger$
|
|
8248
|
+
const logger$1g = getLogger('naylence.fame.node.response_context_manager');
|
|
8249
8249
|
function cloneSecurityContext(source) {
|
|
8250
8250
|
if (!source) {
|
|
8251
8251
|
return undefined;
|
|
@@ -8273,7 +8273,7 @@ class ResponseContextManager {
|
|
|
8273
8273
|
security: responseSecurity,
|
|
8274
8274
|
expectedResponseType: core.FameResponseType.NONE,
|
|
8275
8275
|
};
|
|
8276
|
-
logger$
|
|
8276
|
+
logger$1g.debug('created_response_context', {
|
|
8277
8277
|
request_id: requestEnvelope.id,
|
|
8278
8278
|
inherited_crypto_level: responseSecurity?.inboundCryptoLevel ?? null,
|
|
8279
8279
|
channel_id: responseSecurity?.cryptoChannelId ?? null,
|
|
@@ -8293,14 +8293,14 @@ class ResponseContextManager {
|
|
|
8293
8293
|
responseContext.fromSystemId = this.getId();
|
|
8294
8294
|
}
|
|
8295
8295
|
// Envelope-level metadata is intentionally omitted to defer to context usage.
|
|
8296
|
-
logger$
|
|
8296
|
+
logger$1g.debug('ensured_response_metadata', {
|
|
8297
8297
|
response_id: responseEnvelope.id,
|
|
8298
8298
|
request_id: requestEnvelope.id,
|
|
8299
8299
|
});
|
|
8300
8300
|
}
|
|
8301
8301
|
}
|
|
8302
8302
|
|
|
8303
|
-
const logger$
|
|
8303
|
+
const logger$1f = getLogger('naylence.fame.node.streaming_response_handler');
|
|
8304
8304
|
function isObject(value) {
|
|
8305
8305
|
return typeof value === 'object' && value !== null;
|
|
8306
8306
|
}
|
|
@@ -8419,12 +8419,12 @@ class StreamingResponseHandler {
|
|
|
8419
8419
|
}
|
|
8420
8420
|
async handleStreamingFameMessageResponses(responses, requestEnvelope, requestContext) {
|
|
8421
8421
|
const asyncResponses = toAsyncIterable(responses);
|
|
8422
|
-
logger$
|
|
8422
|
+
logger$1f.debug('handling_streaming_fame_message_responses', {
|
|
8423
8423
|
request_id: requestEnvelope.id,
|
|
8424
8424
|
});
|
|
8425
8425
|
for await (const response of asyncResponses) {
|
|
8426
8426
|
if (!response?.envelope) {
|
|
8427
|
-
logger$
|
|
8427
|
+
logger$1f.warning('invalid_streaming_response_type', {
|
|
8428
8428
|
request_id: requestEnvelope.id,
|
|
8429
8429
|
actual_type: typeof response,
|
|
8430
8430
|
});
|
|
@@ -8438,7 +8438,7 @@ class StreamingResponseHandler {
|
|
|
8438
8438
|
}
|
|
8439
8439
|
async handleStreamingResponse(result, requestEnvelope, requestContext, replyTo, requestId) {
|
|
8440
8440
|
const iterable = toAsyncIterable(result);
|
|
8441
|
-
logger$
|
|
8441
|
+
logger$1f.debug('handling_streaming_response', {
|
|
8442
8442
|
request_id: requestId,
|
|
8443
8443
|
reply_to: replyTo,
|
|
8444
8444
|
});
|
|
@@ -8449,7 +8449,7 @@ class StreamingResponseHandler {
|
|
|
8449
8449
|
await this.sendRpcResponse(null, requestEnvelope, requestContext, replyTo, requestId);
|
|
8450
8450
|
}
|
|
8451
8451
|
catch (error) {
|
|
8452
|
-
logger$
|
|
8452
|
+
logger$1f.error('streaming_response_handler_error', {
|
|
8453
8453
|
request_id: requestId,
|
|
8454
8454
|
error: error instanceof Error ? error.message : String(error),
|
|
8455
8455
|
});
|
|
@@ -8476,7 +8476,7 @@ class StreamingResponseHandler {
|
|
|
8476
8476
|
});
|
|
8477
8477
|
const responseContext = this.responseContextManager.createResponseContext(requestEnvelope, requestContext);
|
|
8478
8478
|
this.responseContextManager.ensureResponseMetadata(responseEnvelope, requestEnvelope, responseContext);
|
|
8479
|
-
logger$
|
|
8479
|
+
logger$1f.debug('sending_streaming_rpc_response', {
|
|
8480
8480
|
request_id: requestId,
|
|
8481
8481
|
response_envelope_id: responseEnvelope.id,
|
|
8482
8482
|
reply_to: replyTo,
|
|
@@ -8489,7 +8489,7 @@ class StreamingResponseHandler {
|
|
|
8489
8489
|
}
|
|
8490
8490
|
}
|
|
8491
8491
|
|
|
8492
|
-
const logger$
|
|
8492
|
+
const logger$1e = getLogger('naylence.fame.node.channel_polling_manager');
|
|
8493
8493
|
class ChannelPollingManager {
|
|
8494
8494
|
constructor(deliverWrapper, responseContextManager, streamingResponseHandler) {
|
|
8495
8495
|
this.deliverWrapper = deliverWrapper;
|
|
@@ -8497,7 +8497,7 @@ class ChannelPollingManager {
|
|
|
8497
8497
|
this.streamingResponseHandler = streamingResponseHandler;
|
|
8498
8498
|
}
|
|
8499
8499
|
async startPollingLoop(serviceName, channel, handler, stopState, pollTimeoutMs = core.DEFAULT_POLLING_TIMEOUT_MS) {
|
|
8500
|
-
logger$
|
|
8500
|
+
logger$1e.debug('poll_loop_started', {
|
|
8501
8501
|
recipient: serviceName,
|
|
8502
8502
|
});
|
|
8503
8503
|
try {
|
|
@@ -8505,7 +8505,7 @@ class ChannelPollingManager {
|
|
|
8505
8505
|
while (true) {
|
|
8506
8506
|
if (this.isStopRequested(stopState) && !draining) {
|
|
8507
8507
|
draining = true;
|
|
8508
|
-
logger$
|
|
8508
|
+
logger$1e.debug('poll_loop_draining_pending_messages', {
|
|
8509
8509
|
recipient: serviceName,
|
|
8510
8510
|
});
|
|
8511
8511
|
}
|
|
@@ -8515,7 +8515,7 @@ class ChannelPollingManager {
|
|
|
8515
8515
|
}
|
|
8516
8516
|
catch (error) {
|
|
8517
8517
|
if (error instanceof FameTransportClose) {
|
|
8518
|
-
logger$
|
|
8518
|
+
logger$1e.debug('channel_closed', {
|
|
8519
8519
|
recipient: serviceName,
|
|
8520
8520
|
message: error.message,
|
|
8521
8521
|
});
|
|
@@ -8528,7 +8528,7 @@ class ChannelPollingManager {
|
|
|
8528
8528
|
continue;
|
|
8529
8529
|
}
|
|
8530
8530
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
8531
|
-
logger$
|
|
8531
|
+
logger$1e.debug('listener_cancelled', {
|
|
8532
8532
|
recipient: serviceName,
|
|
8533
8533
|
});
|
|
8534
8534
|
throw error;
|
|
@@ -8540,13 +8540,13 @@ class ChannelPollingManager {
|
|
|
8540
8540
|
continue;
|
|
8541
8541
|
}
|
|
8542
8542
|
if (error instanceof Error && error.message === 'Channel is closed') {
|
|
8543
|
-
logger$
|
|
8543
|
+
logger$1e.debug('channel_closed', {
|
|
8544
8544
|
recipient: serviceName,
|
|
8545
8545
|
});
|
|
8546
8546
|
break;
|
|
8547
8547
|
}
|
|
8548
8548
|
if (error instanceof Error && error.name === 'TaskCancelledError') {
|
|
8549
|
-
logger$
|
|
8549
|
+
logger$1e.debug('listener_cancelled', {
|
|
8550
8550
|
recipient: serviceName,
|
|
8551
8551
|
});
|
|
8552
8552
|
throw error;
|
|
@@ -8558,12 +8558,12 @@ class ChannelPollingManager {
|
|
|
8558
8558
|
continue;
|
|
8559
8559
|
}
|
|
8560
8560
|
if (error instanceof Error && error.message.includes('closed')) {
|
|
8561
|
-
logger$
|
|
8561
|
+
logger$1e.debug('channel_closed', {
|
|
8562
8562
|
recipient: serviceName,
|
|
8563
8563
|
});
|
|
8564
8564
|
break;
|
|
8565
8565
|
}
|
|
8566
|
-
logger$
|
|
8566
|
+
logger$1e.error('transport_error', {
|
|
8567
8567
|
recipient: serviceName,
|
|
8568
8568
|
error: error instanceof Error ? error.message : String(error),
|
|
8569
8569
|
});
|
|
@@ -8579,7 +8579,7 @@ class ChannelPollingManager {
|
|
|
8579
8579
|
}
|
|
8580
8580
|
}
|
|
8581
8581
|
finally {
|
|
8582
|
-
logger$
|
|
8582
|
+
logger$1e.debug('poll_loop_exiting', {
|
|
8583
8583
|
recipient: serviceName,
|
|
8584
8584
|
});
|
|
8585
8585
|
}
|
|
@@ -8592,7 +8592,7 @@ class ChannelPollingManager {
|
|
|
8592
8592
|
await this.processHandlerResult(result, envelope, deliveryContext, serviceName);
|
|
8593
8593
|
}
|
|
8594
8594
|
catch (error) {
|
|
8595
|
-
logger$
|
|
8595
|
+
logger$1e.error('handler_crashed', {
|
|
8596
8596
|
recipient: serviceName,
|
|
8597
8597
|
error: error instanceof Error ? error.message : String(error),
|
|
8598
8598
|
});
|
|
@@ -8606,7 +8606,7 @@ class ChannelPollingManager {
|
|
|
8606
8606
|
return;
|
|
8607
8607
|
}
|
|
8608
8608
|
if (this.streamingResponseHandler.isStreamingFameMessageResponse(result)) {
|
|
8609
|
-
logger$
|
|
8609
|
+
logger$1e.debug('handling_streaming_fame_message_responses', {
|
|
8610
8610
|
service_name: serviceName,
|
|
8611
8611
|
envelope_id: envelope.id,
|
|
8612
8612
|
});
|
|
@@ -8614,7 +8614,7 @@ class ChannelPollingManager {
|
|
|
8614
8614
|
}
|
|
8615
8615
|
}
|
|
8616
8616
|
async handleMessageResponse(response, requestEnvelope, requestContext, serviceName) {
|
|
8617
|
-
logger$
|
|
8617
|
+
logger$1e.debug('delivering_envelope_response_message', {
|
|
8618
8618
|
service_name: serviceName,
|
|
8619
8619
|
response_envelope_id: response.envelope.id,
|
|
8620
8620
|
});
|
|
@@ -8634,7 +8634,7 @@ class ChannelPollingManager {
|
|
|
8634
8634
|
}
|
|
8635
8635
|
}
|
|
8636
8636
|
|
|
8637
|
-
const logger$
|
|
8637
|
+
const logger$1d = getLogger('naylence.fame.node.rpc_server_handler');
|
|
8638
8638
|
function isPlainRecord$6(value) {
|
|
8639
8639
|
if (typeof value !== 'object' || value === null) {
|
|
8640
8640
|
return false;
|
|
@@ -8678,13 +8678,13 @@ class RPCServerHandler {
|
|
|
8678
8678
|
}
|
|
8679
8679
|
async handleRpcRequest(envelope, handlerContext, handler, serviceName) {
|
|
8680
8680
|
if (!this.isDataFrame(envelope.frame)) {
|
|
8681
|
-
logger$
|
|
8681
|
+
logger$1d.warning('rpc_request_missing_data_frame', {
|
|
8682
8682
|
service_name: serviceName,
|
|
8683
8683
|
envelope_id: envelope.id,
|
|
8684
8684
|
});
|
|
8685
8685
|
return;
|
|
8686
8686
|
}
|
|
8687
|
-
logger$
|
|
8687
|
+
logger$1d.debug('rpc_request_received', {
|
|
8688
8688
|
service_name: serviceName,
|
|
8689
8689
|
envelope_id: envelope.id,
|
|
8690
8690
|
trace_id: envelope.traceId,
|
|
@@ -8696,7 +8696,7 @@ class RPCServerHandler {
|
|
|
8696
8696
|
request = core.parseRequest(envelope.frame.payload);
|
|
8697
8697
|
params = cloneParams(request.params);
|
|
8698
8698
|
const paramKeys = Object.keys(params);
|
|
8699
|
-
logger$
|
|
8699
|
+
logger$1d.debug('parsed_rpc_request', {
|
|
8700
8700
|
service_name: serviceName,
|
|
8701
8701
|
method: request.method,
|
|
8702
8702
|
request_id: request.id,
|
|
@@ -8705,7 +8705,7 @@ class RPCServerHandler {
|
|
|
8705
8705
|
});
|
|
8706
8706
|
}
|
|
8707
8707
|
catch (error) {
|
|
8708
|
-
logger$
|
|
8708
|
+
logger$1d.warning('request_decode_error', {
|
|
8709
8709
|
service_name: serviceName,
|
|
8710
8710
|
envelope_id: envelope.id,
|
|
8711
8711
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -8713,7 +8713,7 @@ class RPCServerHandler {
|
|
|
8713
8713
|
return;
|
|
8714
8714
|
}
|
|
8715
8715
|
if (request.id == null) {
|
|
8716
|
-
logger$
|
|
8716
|
+
logger$1d.warning('request_missing_id', {
|
|
8717
8717
|
service_name: serviceName,
|
|
8718
8718
|
envelope_id: envelope.id,
|
|
8719
8719
|
});
|
|
@@ -8721,7 +8721,7 @@ class RPCServerHandler {
|
|
|
8721
8721
|
}
|
|
8722
8722
|
const replyTo = this.resolveReplyTo(envelope, params);
|
|
8723
8723
|
if (!replyTo) {
|
|
8724
|
-
logger$
|
|
8724
|
+
logger$1d.warning('missing_reply_to', {
|
|
8725
8725
|
service_name: serviceName,
|
|
8726
8726
|
envelope_id: envelope.id,
|
|
8727
8727
|
request_id: request.id,
|
|
@@ -8730,13 +8730,13 @@ class RPCServerHandler {
|
|
|
8730
8730
|
}
|
|
8731
8731
|
let handlerResult;
|
|
8732
8732
|
try {
|
|
8733
|
-
logger$
|
|
8733
|
+
logger$1d.debug('calling_rpc_handler', {
|
|
8734
8734
|
service_name: serviceName,
|
|
8735
8735
|
method: request.method,
|
|
8736
8736
|
request_id: request.id,
|
|
8737
8737
|
});
|
|
8738
8738
|
handlerResult = await handler(request.method, params);
|
|
8739
|
-
logger$
|
|
8739
|
+
logger$1d.debug('rpc_handler_returned', {
|
|
8740
8740
|
service_name: serviceName,
|
|
8741
8741
|
method: request.method,
|
|
8742
8742
|
request_id: request.id,
|
|
@@ -8745,7 +8745,7 @@ class RPCServerHandler {
|
|
|
8745
8745
|
});
|
|
8746
8746
|
}
|
|
8747
8747
|
catch (error) {
|
|
8748
|
-
logger$
|
|
8748
|
+
logger$1d.error('rpc_handler_error', {
|
|
8749
8749
|
service_name: serviceName,
|
|
8750
8750
|
request_id: request.id,
|
|
8751
8751
|
envelope_id: envelope.id,
|
|
@@ -8755,7 +8755,7 @@ class RPCServerHandler {
|
|
|
8755
8755
|
return this.createTraditionalResponse(response, request.id, envelope, replyTo, handlerContext, serviceName);
|
|
8756
8756
|
}
|
|
8757
8757
|
if (core.isFameMessageResponse(handlerResult)) {
|
|
8758
|
-
logger$
|
|
8758
|
+
logger$1d.debug('returning_response_message', {
|
|
8759
8759
|
service_name: serviceName,
|
|
8760
8760
|
request_id: request.id,
|
|
8761
8761
|
response_envelope_id: handlerResult.envelope.id,
|
|
@@ -8763,7 +8763,7 @@ class RPCServerHandler {
|
|
|
8763
8763
|
return handlerResult;
|
|
8764
8764
|
}
|
|
8765
8765
|
if (this.streamingResponseHandler.isStreamingResult(handlerResult)) {
|
|
8766
|
-
logger$
|
|
8766
|
+
logger$1d.debug('handling_streaming_response', {
|
|
8767
8767
|
service_name: serviceName,
|
|
8768
8768
|
request_id: request.id,
|
|
8769
8769
|
envelope_id: envelope.id,
|
|
@@ -8792,7 +8792,7 @@ class RPCServerHandler {
|
|
|
8792
8792
|
return null;
|
|
8793
8793
|
}
|
|
8794
8794
|
async createTraditionalResponse(payload, requestId, requestEnvelope, replyTo, handlerContext, serviceName) {
|
|
8795
|
-
logger$
|
|
8795
|
+
logger$1d.debug('creating_traditional_response_envelope', {
|
|
8796
8796
|
service_name: serviceName,
|
|
8797
8797
|
request_id: requestId,
|
|
8798
8798
|
envelope_id: requestEnvelope.id,
|
|
@@ -8816,7 +8816,7 @@ class RPCServerHandler {
|
|
|
8816
8816
|
if (requestEnvelope.id) {
|
|
8817
8817
|
responseContext.meta['response-to-id'] = requestEnvelope.id;
|
|
8818
8818
|
}
|
|
8819
|
-
logger$
|
|
8819
|
+
logger$1d.debug('returning_traditional_response', {
|
|
8820
8820
|
service_name: serviceName,
|
|
8821
8821
|
request_id: requestId,
|
|
8822
8822
|
envelope_id: requestEnvelope.id,
|
|
@@ -8881,7 +8881,7 @@ function normalizeErrorCode(code) {
|
|
|
8881
8881
|
return code;
|
|
8882
8882
|
}
|
|
8883
8883
|
|
|
8884
|
-
const logger$
|
|
8884
|
+
const logger$1c = getLogger('naylence.fame.node.rpc_client_manager');
|
|
8885
8885
|
function isPlainRecord$5(value) {
|
|
8886
8886
|
if (typeof value !== 'object' || value === null) {
|
|
8887
8887
|
return false;
|
|
@@ -9098,7 +9098,7 @@ class RPCClientManager {
|
|
|
9098
9098
|
const metaReason = tracked.meta?.['nack_reason'];
|
|
9099
9099
|
const formattedMessage = formatDeliveryErrorMessage(typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR', reason ??
|
|
9100
9100
|
(typeof metaReason === 'string' ? metaReason : undefined));
|
|
9101
|
-
logger$
|
|
9101
|
+
logger$1c.debug('pending_request_rejected_by_delivery_nack', {
|
|
9102
9102
|
envelope_id: envelopeId,
|
|
9103
9103
|
request_id: requestId,
|
|
9104
9104
|
code: typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR',
|
|
@@ -9121,7 +9121,7 @@ class RPCClientManager {
|
|
|
9121
9121
|
this.trackerWithEvents.removeEventHandler?.(this.trackerEventHandler);
|
|
9122
9122
|
}
|
|
9123
9123
|
catch (error) {
|
|
9124
|
-
logger$
|
|
9124
|
+
logger$1c.debug('rpc_tracker_handler_remove_failed', {
|
|
9125
9125
|
error: error instanceof Error ? error.message : String(error),
|
|
9126
9126
|
});
|
|
9127
9127
|
}
|
|
@@ -9164,7 +9164,7 @@ class RPCClientManager {
|
|
|
9164
9164
|
this.rpcListenerAddress = await this.listenCallback(recipient, handler);
|
|
9165
9165
|
this.rpcBound = true;
|
|
9166
9166
|
this.boundPhysicalPath = currentPhysicalPath;
|
|
9167
|
-
logger$
|
|
9167
|
+
logger$1c.debug('rpc_reply_listener_bound', {
|
|
9168
9168
|
reply_recipient: recipient,
|
|
9169
9169
|
reply_address: this.rpcReplyAddress?.toString(),
|
|
9170
9170
|
listener_address: this.rpcListenerAddress?.toString(),
|
|
@@ -9258,7 +9258,7 @@ class RPCClientManager {
|
|
|
9258
9258
|
const finalizePromise = this.notifyStreamClosed(envelopeId);
|
|
9259
9259
|
if (finalizePromise) {
|
|
9260
9260
|
finalizePromise.catch((notifyError) => {
|
|
9261
|
-
logger$
|
|
9261
|
+
logger$1c.debug('stream_tracker_finalize_failed', {
|
|
9262
9262
|
request_id: requestId,
|
|
9263
9263
|
envelope_id: envelopeId,
|
|
9264
9264
|
error: notifyError instanceof Error
|
|
@@ -9319,7 +9319,7 @@ class RPCClientManager {
|
|
|
9319
9319
|
return iterator;
|
|
9320
9320
|
}
|
|
9321
9321
|
async sendRpcRequest(requestId, envelope, expectedResponseType, timeoutMs) {
|
|
9322
|
-
logger$
|
|
9322
|
+
logger$1c.debug('sending_rpc_request', {
|
|
9323
9323
|
envp_id: envelope.id,
|
|
9324
9324
|
corr_id: envelope.corrId,
|
|
9325
9325
|
request_id: requestId,
|
|
@@ -9335,7 +9335,7 @@ class RPCClientManager {
|
|
|
9335
9335
|
}
|
|
9336
9336
|
}
|
|
9337
9337
|
catch (error) {
|
|
9338
|
-
logger$
|
|
9338
|
+
logger$1c.warning('delivery_tracker_track_failed', {
|
|
9339
9339
|
request_id: requestId,
|
|
9340
9340
|
error: error instanceof Error ? error.message : String(error),
|
|
9341
9341
|
});
|
|
@@ -9348,14 +9348,14 @@ class RPCClientManager {
|
|
|
9348
9348
|
await this.deliverWrapper()(envelope, context);
|
|
9349
9349
|
}
|
|
9350
9350
|
async handleReplyEnvelope(envelope) {
|
|
9351
|
-
logger$
|
|
9351
|
+
logger$1c.debug('handle_reply_envelope_received', {
|
|
9352
9352
|
envelope_id: envelope.id,
|
|
9353
9353
|
corr_id: envelope.corrId,
|
|
9354
9354
|
frame_type: envelope.frame?.['type'],
|
|
9355
9355
|
});
|
|
9356
9356
|
let requestId = envelope.corrId ?? envelope.id;
|
|
9357
9357
|
if (!requestId) {
|
|
9358
|
-
logger$
|
|
9358
|
+
logger$1c.warning('reply_envelope_missing_corr_id', {
|
|
9359
9359
|
envelope_id: envelope.id,
|
|
9360
9360
|
});
|
|
9361
9361
|
return;
|
|
@@ -9373,12 +9373,12 @@ class RPCClientManager {
|
|
|
9373
9373
|
}
|
|
9374
9374
|
}
|
|
9375
9375
|
if (!entry) {
|
|
9376
|
-
logger$
|
|
9376
|
+
logger$1c.debug('no_pending_request_for_reply', {
|
|
9377
9377
|
request_id: requestId,
|
|
9378
9378
|
});
|
|
9379
9379
|
return;
|
|
9380
9380
|
}
|
|
9381
|
-
logger$
|
|
9381
|
+
logger$1c.debug('handle_reply_envelope', {
|
|
9382
9382
|
envelope_id: envelope.id,
|
|
9383
9383
|
request_id: requestId,
|
|
9384
9384
|
corr_id: envelope.corrId,
|
|
@@ -9391,7 +9391,7 @@ class RPCClientManager {
|
|
|
9391
9391
|
const ackIndicatesSuccess = frame.ok === true ||
|
|
9392
9392
|
(frame.ok === undefined && !frame.code && !frame.reason);
|
|
9393
9393
|
if (ackIndicatesSuccess) {
|
|
9394
|
-
logger$
|
|
9394
|
+
logger$1c.debug('pending_request_delivery_acknowledged', {
|
|
9395
9395
|
request_id: requestId,
|
|
9396
9396
|
envelope_id: envelope.id,
|
|
9397
9397
|
ref_id: frame.refId ?? null,
|
|
@@ -9419,7 +9419,7 @@ class RPCClientManager {
|
|
|
9419
9419
|
entry.timer = null;
|
|
9420
9420
|
}
|
|
9421
9421
|
if (!this.isDataFrame(envelope.frame)) {
|
|
9422
|
-
logger$
|
|
9422
|
+
logger$1c.warning('unexpected_reply_frame_type', {
|
|
9423
9423
|
request_id: requestId,
|
|
9424
9424
|
frame_type: envelope.frame?.['type'],
|
|
9425
9425
|
});
|
|
@@ -9485,7 +9485,7 @@ class RPCClientManager {
|
|
|
9485
9485
|
return;
|
|
9486
9486
|
}
|
|
9487
9487
|
Promise.resolve(this.deliveryTracker.onStreamItem(envelopeId, envelope)).catch((error) => {
|
|
9488
|
-
logger$
|
|
9488
|
+
logger$1c.debug('stream_tracker_push_failed', {
|
|
9489
9489
|
envelope_id: envelopeId,
|
|
9490
9490
|
error: error instanceof Error ? error.message : String(error),
|
|
9491
9491
|
});
|
|
@@ -9600,7 +9600,7 @@ function normalizeMailbox(mailbox) {
|
|
|
9600
9600
|
return mailbox;
|
|
9601
9601
|
}
|
|
9602
9602
|
|
|
9603
|
-
const logger$
|
|
9603
|
+
const logger$1b = getLogger('naylence.fame.node.envelope_listener_manager');
|
|
9604
9604
|
const SYSTEM_INBOX$2 = '__sys__';
|
|
9605
9605
|
class EnvelopeListener {
|
|
9606
9606
|
constructor(stopFn, task) {
|
|
@@ -9608,7 +9608,7 @@ class EnvelopeListener {
|
|
|
9608
9608
|
this.task = task;
|
|
9609
9609
|
}
|
|
9610
9610
|
stop() {
|
|
9611
|
-
logger$
|
|
9611
|
+
logger$1b.debug('stopping_listener', {
|
|
9612
9612
|
task_name: this.task.name,
|
|
9613
9613
|
});
|
|
9614
9614
|
try {
|
|
@@ -9616,7 +9616,7 @@ class EnvelopeListener {
|
|
|
9616
9616
|
if (maybeCleanup &&
|
|
9617
9617
|
typeof maybeCleanup.then === 'function') {
|
|
9618
9618
|
void maybeCleanup.catch((error) => {
|
|
9619
|
-
logger$
|
|
9619
|
+
logger$1b.debug('listener_stop_cleanup_failed', {
|
|
9620
9620
|
task_name: this.task.name,
|
|
9621
9621
|
error: error instanceof Error ? error.message : String(error),
|
|
9622
9622
|
});
|
|
@@ -9624,7 +9624,7 @@ class EnvelopeListener {
|
|
|
9624
9624
|
}
|
|
9625
9625
|
}
|
|
9626
9626
|
catch (error) {
|
|
9627
|
-
logger$
|
|
9627
|
+
logger$1b.debug('listener_stop_cleanup_failed', {
|
|
9628
9628
|
task_name: this.task.name,
|
|
9629
9629
|
error: error instanceof Error ? error.message : String(error),
|
|
9630
9630
|
});
|
|
@@ -9654,7 +9654,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9654
9654
|
envelope.replyTo = core.formatAddress(SYSTEM_INBOX$2, this.nodeLike.physicalPath);
|
|
9655
9655
|
}
|
|
9656
9656
|
catch (error) {
|
|
9657
|
-
logger$
|
|
9657
|
+
logger$1b.warning('default_reply_to_assignment_failed', {
|
|
9658
9658
|
envelope_id: envelope.id,
|
|
9659
9659
|
service_name: envelope.capabilities?.[0] ?? null,
|
|
9660
9660
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -9679,7 +9679,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9679
9679
|
if (serviceName === SYSTEM_INBOX$2) {
|
|
9680
9680
|
continue;
|
|
9681
9681
|
}
|
|
9682
|
-
logger$
|
|
9682
|
+
logger$1b.debug('stopping_listener_for_service', {
|
|
9683
9683
|
service_name: serviceName,
|
|
9684
9684
|
});
|
|
9685
9685
|
entry.listener.stop();
|
|
@@ -9689,7 +9689,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9689
9689
|
catch (error) {
|
|
9690
9690
|
if (!(error instanceof Error) ||
|
|
9691
9691
|
error.name !== 'TaskCancelledError') {
|
|
9692
|
-
logger$
|
|
9692
|
+
logger$1b.debug('listener_task_stopped', {
|
|
9693
9693
|
service_name: serviceName,
|
|
9694
9694
|
error: error instanceof Error ? error.message : String(error),
|
|
9695
9695
|
});
|
|
@@ -9697,7 +9697,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9697
9697
|
}
|
|
9698
9698
|
}
|
|
9699
9699
|
if (systemEntry) {
|
|
9700
|
-
logger$
|
|
9700
|
+
logger$1b.debug('stopping_listener_for_service', {
|
|
9701
9701
|
service_name: SYSTEM_INBOX$2,
|
|
9702
9702
|
});
|
|
9703
9703
|
systemEntry.listener.stop();
|
|
@@ -9707,7 +9707,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9707
9707
|
catch (error) {
|
|
9708
9708
|
if (!(error instanceof Error) ||
|
|
9709
9709
|
error.name !== 'TaskCancelledError') {
|
|
9710
|
-
logger$
|
|
9710
|
+
logger$1b.debug('listener_task_stopped', {
|
|
9711
9711
|
service_name: SYSTEM_INBOX$2,
|
|
9712
9712
|
error: error instanceof Error ? error.message : String(error),
|
|
9713
9713
|
});
|
|
@@ -9724,13 +9724,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9724
9724
|
}
|
|
9725
9725
|
async recoverUnhandledInboundEnvelopes() {
|
|
9726
9726
|
if (typeof this.deliveryTracker.listInbound !== 'function') {
|
|
9727
|
-
logger$
|
|
9727
|
+
logger$1b.debug('delivery_tracker_missing_inbound_listing');
|
|
9728
9728
|
return;
|
|
9729
9729
|
}
|
|
9730
9730
|
const failedInbound = await this.deliveryTracker.listInbound((env) => env.status === EnvelopeStatus.RECEIVED ||
|
|
9731
9731
|
env.status === EnvelopeStatus.FAILED_TO_HANDLE);
|
|
9732
9732
|
if (!failedInbound.length) {
|
|
9733
|
-
logger$
|
|
9733
|
+
logger$1b.debug('no_failed_inbound_envelopes_to_recover');
|
|
9734
9734
|
return;
|
|
9735
9735
|
}
|
|
9736
9736
|
const grouped = new Map();
|
|
@@ -9747,7 +9747,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9747
9747
|
this.pendingRecoveryEnvelopes.set(serviceName, envelopes);
|
|
9748
9748
|
}
|
|
9749
9749
|
});
|
|
9750
|
-
logger$
|
|
9750
|
+
logger$1b.debug('discovered_failed_inbound_envelopes', {
|
|
9751
9751
|
total: failedInbound.length,
|
|
9752
9752
|
services: Array.from(grouped.keys()),
|
|
9753
9753
|
});
|
|
@@ -9757,7 +9757,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9757
9757
|
const pollTimeoutMs = options.pollTimeoutMs ??
|
|
9758
9758
|
options.poll_timeout_ms ??
|
|
9759
9759
|
core.DEFAULT_POLLING_TIMEOUT_MS;
|
|
9760
|
-
logger$
|
|
9760
|
+
logger$1b.debug('listen_start', {
|
|
9761
9761
|
recipient: serviceName,
|
|
9762
9762
|
poll_timeout_ms: pollTimeoutMs ?? core.DEFAULT_POLLING_TIMEOUT_MS,
|
|
9763
9763
|
});
|
|
@@ -9788,7 +9788,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9788
9788
|
tracked?.mailboxType === MailboxType.OUTBOX ||
|
|
9789
9789
|
envelope.frame?.['type'] === 'DeliveryAck';
|
|
9790
9790
|
if (!shouldInvoke) {
|
|
9791
|
-
logger$
|
|
9791
|
+
logger$1b.debug('skipping_listener_handler', {
|
|
9792
9792
|
recipient: serviceName,
|
|
9793
9793
|
envelope_id: envelope.id,
|
|
9794
9794
|
tracked_status: tracked?.status,
|
|
@@ -9802,13 +9802,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9802
9802
|
? undefined
|
|
9803
9803
|
: (tracked ?? undefined);
|
|
9804
9804
|
if (trackedForHandler && trackedForHandler.attempt > 0) {
|
|
9805
|
-
logger$
|
|
9805
|
+
logger$1b.info('resuming_handler_retry_after_restart', {
|
|
9806
9806
|
envelope_id: envelope.id,
|
|
9807
9807
|
current_attempts: trackedForHandler.attempt,
|
|
9808
9808
|
service_name: serviceName,
|
|
9809
9809
|
});
|
|
9810
9810
|
}
|
|
9811
|
-
logger$
|
|
9811
|
+
logger$1b.debug('forwarding_to_listener_handler', {
|
|
9812
9812
|
recipient: serviceName,
|
|
9813
9813
|
envelope_id: envelope.id,
|
|
9814
9814
|
frame_type: envelope.frame?.['type'],
|
|
@@ -9827,7 +9827,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9827
9827
|
await channel.send(null);
|
|
9828
9828
|
}
|
|
9829
9829
|
catch (error) {
|
|
9830
|
-
logger$
|
|
9830
|
+
logger$1b.debug('listener_stop_signal_failed', {
|
|
9831
9831
|
service_name: serviceName,
|
|
9832
9832
|
error: error instanceof Error ? error.message : String(error),
|
|
9833
9833
|
});
|
|
@@ -9836,7 +9836,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9836
9836
|
await this.listenersLock.runExclusive(async () => {
|
|
9837
9837
|
const existing = this.listeners.get(serviceName);
|
|
9838
9838
|
if (existing) {
|
|
9839
|
-
logger$
|
|
9839
|
+
logger$1b.debug('replacing_envelope_listener', { recipient: serviceName });
|
|
9840
9840
|
existing.listener.stop();
|
|
9841
9841
|
try {
|
|
9842
9842
|
await existing.listener.task.promise;
|
|
@@ -9854,13 +9854,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9854
9854
|
return binding.address;
|
|
9855
9855
|
}
|
|
9856
9856
|
async listenRpc(serviceName, handler, options = {}) {
|
|
9857
|
-
logger$
|
|
9857
|
+
logger$1b.debug('rpc_listen_start', { service_name: serviceName });
|
|
9858
9858
|
const rpcHandler = async (envelope, context) => {
|
|
9859
9859
|
const result = await this.rpcServerHandler.handleRpcRequest(envelope, context, handler, serviceName);
|
|
9860
9860
|
return result ?? null;
|
|
9861
9861
|
};
|
|
9862
9862
|
const address = await this.listen(serviceName, rpcHandler, options);
|
|
9863
|
-
logger$
|
|
9863
|
+
logger$1b.debug('rpc_listen_bound', {
|
|
9864
9864
|
service_name: serviceName,
|
|
9865
9865
|
address: address.toString(),
|
|
9866
9866
|
});
|
|
@@ -9929,12 +9929,12 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9929
9929
|
return cached;
|
|
9930
9930
|
});
|
|
9931
9931
|
if (!envelopes.length) {
|
|
9932
|
-
logger$
|
|
9932
|
+
logger$1b.debug('no_cached_recovery_for_service', {
|
|
9933
9933
|
service_name: serviceName,
|
|
9934
9934
|
});
|
|
9935
9935
|
return;
|
|
9936
9936
|
}
|
|
9937
|
-
logger$
|
|
9937
|
+
logger$1b.debug('recovering_unhandled_envelopes_on_listen', {
|
|
9938
9938
|
service_name: serviceName,
|
|
9939
9939
|
count: envelopes.length,
|
|
9940
9940
|
envelope_ids: envelopes.map((trackedEnvelope) => trackedEnvelope.envelopeId),
|
|
@@ -9945,7 +9945,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9945
9945
|
async recoverServiceEnvelopes(serviceName, envelopes, handler) {
|
|
9946
9946
|
for (const tracked of envelopes) {
|
|
9947
9947
|
try {
|
|
9948
|
-
logger$
|
|
9948
|
+
logger$1b.warning('recovering_unhandled_envelope', {
|
|
9949
9949
|
envelope_id: tracked.envelopeId,
|
|
9950
9950
|
service_name: serviceName,
|
|
9951
9951
|
current_attempts: tracked.attempt,
|
|
@@ -9954,13 +9954,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9954
9954
|
const originalEnvelope = tracked.originalEnvelope;
|
|
9955
9955
|
const receiverPolicy = this.nodeLike.deliveryPolicy?.receiverRetryPolicy ?? undefined;
|
|
9956
9956
|
await this.executeHandlerWithRetries(handler, originalEnvelope, undefined, receiverPolicy, tracked, serviceName);
|
|
9957
|
-
logger$
|
|
9957
|
+
logger$1b.debug('envelope_recovery_completed', {
|
|
9958
9958
|
envelope_id: tracked.envelopeId,
|
|
9959
9959
|
service_name: serviceName,
|
|
9960
9960
|
});
|
|
9961
9961
|
}
|
|
9962
9962
|
catch (error) {
|
|
9963
|
-
logger$
|
|
9963
|
+
logger$1b.error('envelope_recovery_failed', {
|
|
9964
9964
|
envelope_id: tracked.envelopeId,
|
|
9965
9965
|
service_name: serviceName,
|
|
9966
9966
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -10006,7 +10006,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10006
10006
|
await this.deliveryTracker.onEnvelopeHandled(trackedEnvelope);
|
|
10007
10007
|
}
|
|
10008
10008
|
if (currentAttempt > 0) {
|
|
10009
|
-
logger$
|
|
10009
|
+
logger$1b.info('handler_retry_succeeded', {
|
|
10010
10010
|
envelope_id: envelope.id,
|
|
10011
10011
|
attempt: currentAttempt + 1,
|
|
10012
10012
|
total_attempts: currentAttempt + 1,
|
|
@@ -10022,7 +10022,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10022
10022
|
await this.deliveryTracker.onEnvelopeHandleFailed(inboxName, trackedEnvelope, context, error instanceof Error ? error : new Error(String(error)), isFinalAttempt);
|
|
10023
10023
|
}
|
|
10024
10024
|
if (isFinalAttempt) {
|
|
10025
|
-
logger$
|
|
10025
|
+
logger$1b.error('handler_execution_failed_exhausted_retries', {
|
|
10026
10026
|
envelope_id: envelope.id,
|
|
10027
10027
|
total_attempts: attemptNumber,
|
|
10028
10028
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10031,7 +10031,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10031
10031
|
break;
|
|
10032
10032
|
}
|
|
10033
10033
|
const delayMs = retryPolicy?.nextDelayMs(attemptNumber) ?? 0;
|
|
10034
|
-
logger$
|
|
10034
|
+
logger$1b.warning('handler_execution_failed_will_retry', {
|
|
10035
10035
|
envelope_id: envelope.id,
|
|
10036
10036
|
attempt: attemptNumber,
|
|
10037
10037
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10061,7 +10061,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10061
10061
|
}
|
|
10062
10062
|
}
|
|
10063
10063
|
|
|
10064
|
-
const logger$
|
|
10064
|
+
const logger$1a = getLogger('naylence.fame.delivery.default_delivery_tracker');
|
|
10065
10065
|
const STREAM_END = Symbol('stream-end');
|
|
10066
10066
|
const SWEEPER_TICK = Symbol('tracker-sweeper-tick');
|
|
10067
10067
|
function createDeferred$2() {
|
|
@@ -10293,7 +10293,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10293
10293
|
const expectedResponseType = options.expectedResponseType;
|
|
10294
10294
|
const tracked = await this.lock.runExclusive(async () => {
|
|
10295
10295
|
if (this.ackFutures.has(envelope.id)) {
|
|
10296
|
-
logger$
|
|
10296
|
+
logger$1a.debug('tracker_envelope_already_tracked', {
|
|
10297
10297
|
envp_id: envelope.id,
|
|
10298
10298
|
});
|
|
10299
10299
|
return null;
|
|
@@ -10303,7 +10303,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10303
10303
|
if (expectedResponseType & core.FameResponseType.REPLY ||
|
|
10304
10304
|
expectedResponseType & core.FameResponseType.STREAM) {
|
|
10305
10305
|
if (existingEnvId && existingEnvId !== envelope.id) {
|
|
10306
|
-
logger$
|
|
10306
|
+
logger$1a.debug('envelope_already_tracked_for_replies', {
|
|
10307
10307
|
envp_id: envelope.id,
|
|
10308
10308
|
corr_id: corrId,
|
|
10309
10309
|
expected_response_type: expectedResponseType,
|
|
@@ -10352,7 +10352,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10352
10352
|
return null;
|
|
10353
10353
|
}
|
|
10354
10354
|
await this.scheduleTimer(tracked, options.retryPolicy ?? null, options.retryHandler ?? null);
|
|
10355
|
-
logger$
|
|
10355
|
+
logger$1a.debug('tracker_registered_envelope', {
|
|
10356
10356
|
envp_id: envelope.id,
|
|
10357
10357
|
corr_id: tracked.originalEnvelope.corrId,
|
|
10358
10358
|
expected_response: tracked.expectedResponseType,
|
|
@@ -10376,21 +10376,21 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10376
10376
|
return this.awaitEnvelopeFuture(envelopeId, core.FameResponseType.REPLY | core.FameResponseType.STREAM, future, timeoutMs);
|
|
10377
10377
|
}
|
|
10378
10378
|
async onEnvelopeDelivered(inboxName, envelope, context) {
|
|
10379
|
-
logger$
|
|
10379
|
+
logger$1a.debug('envelope_delivered', {
|
|
10380
10380
|
envp_id: envelope.id,
|
|
10381
10381
|
corr_id: envelope.corrId,
|
|
10382
10382
|
rtype: envelope.rtype ?? core.FameResponseType.NONE,
|
|
10383
10383
|
frame_type: envelope.frame?.type ?? 'unknown',
|
|
10384
10384
|
});
|
|
10385
10385
|
if (!envelope.corrId) {
|
|
10386
|
-
logger$
|
|
10386
|
+
logger$1a.debug('envelope_delivered_no_corr_id', {
|
|
10387
10387
|
envelope_id: envelope.id,
|
|
10388
10388
|
});
|
|
10389
10389
|
return null;
|
|
10390
10390
|
}
|
|
10391
10391
|
if (this.isDeliveryAckFrame(envelope.frame)) {
|
|
10392
10392
|
if (!envelope.frame.refId) {
|
|
10393
|
-
logger$
|
|
10393
|
+
logger$1a.debug('envelope_delivered_no_ref_id', {
|
|
10394
10394
|
envelope_id: envelope.id,
|
|
10395
10395
|
});
|
|
10396
10396
|
return null;
|
|
@@ -10428,7 +10428,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10428
10428
|
await inbox.set(envelope.id, tracked);
|
|
10429
10429
|
}
|
|
10430
10430
|
else {
|
|
10431
|
-
logger$
|
|
10431
|
+
logger$1a.debug('tracker_duplicate_envelope_already_handled', {
|
|
10432
10432
|
envp_id: envelope.id,
|
|
10433
10433
|
status: tracked.status,
|
|
10434
10434
|
});
|
|
@@ -10471,7 +10471,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10471
10471
|
}
|
|
10472
10472
|
if (isFinalFailure) {
|
|
10473
10473
|
envelope.status = EnvelopeStatus.FAILED_TO_HANDLE;
|
|
10474
|
-
logger$
|
|
10474
|
+
logger$1a.error('envelope_handle_failed_final', {
|
|
10475
10475
|
inbox_name: inboxName,
|
|
10476
10476
|
envp_id: envelope.originalEnvelope.id,
|
|
10477
10477
|
error: error?.message ?? 'unknown',
|
|
@@ -10482,7 +10482,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10482
10482
|
await inbox.delete(envelope.originalEnvelope.id);
|
|
10483
10483
|
return;
|
|
10484
10484
|
}
|
|
10485
|
-
logger$
|
|
10485
|
+
logger$1a.warning('envelope_handle_failed_retry', {
|
|
10486
10486
|
inbox_name: inboxName,
|
|
10487
10487
|
envp_id: envelope.originalEnvelope.id,
|
|
10488
10488
|
error: error?.message ?? 'unknown',
|
|
@@ -10528,14 +10528,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10528
10528
|
if (handledViaFuture) {
|
|
10529
10529
|
await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
|
|
10530
10530
|
await this.clearTimer(refId);
|
|
10531
|
-
logger$
|
|
10531
|
+
logger$1a.debug('tracker_ack_resolved_without_tracked_envelope', {
|
|
10532
10532
|
envp_id: envelope.id,
|
|
10533
10533
|
ref_id: refId,
|
|
10534
10534
|
corr_id: envelope.corrId,
|
|
10535
10535
|
});
|
|
10536
10536
|
return;
|
|
10537
10537
|
}
|
|
10538
|
-
logger$
|
|
10538
|
+
logger$1a.debug('tracker_ack_for_unknown_envelope', {
|
|
10539
10539
|
envp_id: envelope.id,
|
|
10540
10540
|
ref_id: refId,
|
|
10541
10541
|
corr_id: envelope.corrId,
|
|
@@ -10543,7 +10543,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10543
10543
|
return;
|
|
10544
10544
|
}
|
|
10545
10545
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10546
|
-
logger$
|
|
10546
|
+
logger$1a.debug('tracker_ack_corr_id_mismatch', {
|
|
10547
10547
|
envp_id: envelope.id,
|
|
10548
10548
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10549
10549
|
actual_corr_id: envelope.corrId,
|
|
@@ -10568,7 +10568,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10568
10568
|
for (const handler of this.eventHandlers) {
|
|
10569
10569
|
await handler.onEnvelopeAcked?.(tracked);
|
|
10570
10570
|
}
|
|
10571
|
-
logger$
|
|
10571
|
+
logger$1a.debug('tracker_envelope_acked', {
|
|
10572
10572
|
envp_id: tracked.originalEnvelope.id,
|
|
10573
10573
|
});
|
|
10574
10574
|
}
|
|
@@ -10586,13 +10586,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10586
10586
|
const outbox = this.ensureOutbox();
|
|
10587
10587
|
const tracked = await outbox.get(envelope.frame.refId);
|
|
10588
10588
|
if (!tracked) {
|
|
10589
|
-
logger$
|
|
10589
|
+
logger$1a.debug('tracker_nack_for_unknown_envelope', {
|
|
10590
10590
|
envp_id: envelope.id,
|
|
10591
10591
|
});
|
|
10592
10592
|
return;
|
|
10593
10593
|
}
|
|
10594
10594
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10595
|
-
logger$
|
|
10595
|
+
logger$1a.debug('tracker_nack_corr_id_mismatch', {
|
|
10596
10596
|
envp_id: envelope.id,
|
|
10597
10597
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10598
10598
|
actual_corr_id: envelope.corrId,
|
|
@@ -10634,7 +10634,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10634
10634
|
for (const handler of this.eventHandlers) {
|
|
10635
10635
|
await handler.onEnvelopeNacked?.(tracked, ackFrame.reason ?? null);
|
|
10636
10636
|
}
|
|
10637
|
-
logger$
|
|
10637
|
+
logger$1a.debug('tracker_envelope_nacked', {
|
|
10638
10638
|
envp_id: tracked.originalEnvelope.id,
|
|
10639
10639
|
reason: ackFrame.reason,
|
|
10640
10640
|
});
|
|
@@ -10682,7 +10682,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10682
10682
|
for (const handler of this.eventHandlers) {
|
|
10683
10683
|
await handler.onEnvelopeReplied?.(trackedEnvelope, envelope);
|
|
10684
10684
|
}
|
|
10685
|
-
logger$
|
|
10685
|
+
logger$1a.debug('tracked_envelope_replied', {
|
|
10686
10686
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10687
10687
|
corr_id: envelope.corrId,
|
|
10688
10688
|
});
|
|
@@ -10756,7 +10756,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10756
10756
|
async addToInboxDlq(trackedEnvelope, reason = null) {
|
|
10757
10757
|
const dlq = this.inboxDlq;
|
|
10758
10758
|
if (!dlq) {
|
|
10759
|
-
logger$
|
|
10759
|
+
logger$1a.error('dlq_not_initialized', {
|
|
10760
10760
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10761
10761
|
});
|
|
10762
10762
|
return;
|
|
@@ -10771,7 +10771,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10771
10771
|
const deadLetteredAt = Date.now();
|
|
10772
10772
|
setMetaWithLegacy(trackedEnvelope.meta, 'deadLetteredAtMs', 'dead_lettered_at_ms', deadLetteredAt);
|
|
10773
10773
|
await dlq.set(trackedEnvelope.originalEnvelope.id, trackedEnvelope);
|
|
10774
|
-
logger$
|
|
10774
|
+
logger$1a.warning('envelope_moved_to_dlq', {
|
|
10775
10775
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10776
10776
|
service_name: trackedEnvelope.serviceName,
|
|
10777
10777
|
});
|
|
@@ -10800,7 +10800,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10800
10800
|
const toDelete = Object.entries(items).filter(([, value]) => predicate ? predicate(value) : true);
|
|
10801
10801
|
await Promise.all(toDelete.map(([key]) => dlq.delete(key)));
|
|
10802
10802
|
if (toDelete.length) {
|
|
10803
|
-
logger$
|
|
10803
|
+
logger$1a.debug('dlq_purged', { count: toDelete.length });
|
|
10804
10804
|
}
|
|
10805
10805
|
return toDelete.length;
|
|
10806
10806
|
}
|
|
@@ -10853,11 +10853,11 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10853
10853
|
}
|
|
10854
10854
|
this.futuresSweeper = null;
|
|
10855
10855
|
}
|
|
10856
|
-
logger$
|
|
10856
|
+
logger$1a.debug('tracker_cleanup_completed');
|
|
10857
10857
|
}
|
|
10858
10858
|
async recoverPending() {
|
|
10859
10859
|
const pending = await this.listPending();
|
|
10860
|
-
logger$
|
|
10860
|
+
logger$1a.debug('tracker_recovering_pending', { count: pending.length });
|
|
10861
10861
|
await this.lock.runExclusive(async () => {
|
|
10862
10862
|
for (const tracked of pending) {
|
|
10863
10863
|
if (tracked.expectedResponseType & core.FameResponseType.ACK) {
|
|
@@ -10883,7 +10883,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10883
10883
|
for (const tracked of pending) {
|
|
10884
10884
|
await this.scheduleTimer(tracked, null, null);
|
|
10885
10885
|
}
|
|
10886
|
-
logger$
|
|
10886
|
+
logger$1a.debug('tracker_recovery_completed', { count: pending.length });
|
|
10887
10887
|
}
|
|
10888
10888
|
ensureOutbox() {
|
|
10889
10889
|
if (!this.outbox) {
|
|
@@ -10898,7 +10898,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10898
10898
|
return this.inbox;
|
|
10899
10899
|
}
|
|
10900
10900
|
async waitForPendingAcks() {
|
|
10901
|
-
logger$
|
|
10901
|
+
logger$1a.debug('tracker_node_preparing_to_stop_waiting_for_pending_acks');
|
|
10902
10902
|
const outbox = this.outbox;
|
|
10903
10903
|
if (!outbox) {
|
|
10904
10904
|
return;
|
|
@@ -10910,7 +10910,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10910
10910
|
continue;
|
|
10911
10911
|
}
|
|
10912
10912
|
if (!future.done) {
|
|
10913
|
-
logger$
|
|
10913
|
+
logger$1a.debug('tracker_pending_ack_future_detected', {
|
|
10914
10914
|
envelope_id: envelopeId,
|
|
10915
10915
|
});
|
|
10916
10916
|
pending.push({ envelopeId, future });
|
|
@@ -10918,10 +10918,10 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10918
10918
|
}
|
|
10919
10919
|
});
|
|
10920
10920
|
if (!pending.length) {
|
|
10921
|
-
logger$
|
|
10921
|
+
logger$1a.debug('tracker_no_pending_acks_to_wait_for');
|
|
10922
10922
|
return;
|
|
10923
10923
|
}
|
|
10924
|
-
logger$
|
|
10924
|
+
logger$1a.debug('tracker_waiting_for_pending_acks', { count: pending.length });
|
|
10925
10925
|
for (const entry of pending) {
|
|
10926
10926
|
if (!entry) {
|
|
10927
10927
|
continue;
|
|
@@ -10938,19 +10938,19 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10938
10938
|
}
|
|
10939
10939
|
try {
|
|
10940
10940
|
await this.awaitWithTimeout(entry.future.promise, remainingMs);
|
|
10941
|
-
logger$
|
|
10941
|
+
logger$1a.debug('tracker_received_ack', {
|
|
10942
10942
|
envelope_id: entry.envelopeId,
|
|
10943
10943
|
});
|
|
10944
10944
|
await outbox.delete(entry.envelopeId);
|
|
10945
10945
|
}
|
|
10946
10946
|
catch (error) {
|
|
10947
10947
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
10948
|
-
logger$
|
|
10948
|
+
logger$1a.debug('tracker_ack_timeout_expired', {
|
|
10949
10949
|
envelope_id: entry.envelopeId,
|
|
10950
10950
|
});
|
|
10951
10951
|
}
|
|
10952
10952
|
else {
|
|
10953
|
-
logger$
|
|
10953
|
+
logger$1a.debug('tracker_ack_wait_error', {
|
|
10954
10954
|
envelope_id: entry.envelopeId,
|
|
10955
10955
|
error: error instanceof Error ? error.message : String(error),
|
|
10956
10956
|
});
|
|
@@ -10958,13 +10958,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10958
10958
|
}
|
|
10959
10959
|
}
|
|
10960
10960
|
catch (error) {
|
|
10961
|
-
logger$
|
|
10961
|
+
logger$1a.error('tracker_error_waiting_for_ack', {
|
|
10962
10962
|
envelope_id: entry.envelopeId,
|
|
10963
10963
|
error: error instanceof Error ? error.message : String(error),
|
|
10964
10964
|
});
|
|
10965
10965
|
}
|
|
10966
10966
|
}
|
|
10967
|
-
logger$
|
|
10967
|
+
logger$1a.debug('tracker_finished_waiting_for_pending_acks');
|
|
10968
10968
|
}
|
|
10969
10969
|
async waitForPendingAckDispatches() {
|
|
10970
10970
|
while (this.pendingAckDispatches.size > 0) {
|
|
@@ -11022,7 +11022,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11022
11022
|
for (const handler of this.eventHandlers) {
|
|
11023
11023
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11024
11024
|
}
|
|
11025
|
-
logger$
|
|
11025
|
+
logger$1a.debug('tracker_envelope_timed_out', {
|
|
11026
11026
|
envp_id: tracked.originalEnvelope.id,
|
|
11027
11027
|
});
|
|
11028
11028
|
return;
|
|
@@ -11035,7 +11035,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11035
11035
|
currentTracked.timeoutAtMs = nextTimeoutAt;
|
|
11036
11036
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11037
11037
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11038
|
-
logger$
|
|
11038
|
+
logger$1a.debug('tracker_retry_deferred_during_shutdown', {
|
|
11039
11039
|
envp_id: tracked.originalEnvelope.id,
|
|
11040
11040
|
defer_ms: shutdownDeferMs,
|
|
11041
11041
|
});
|
|
@@ -11058,7 +11058,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11058
11058
|
});
|
|
11059
11059
|
}
|
|
11060
11060
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11061
|
-
logger$
|
|
11061
|
+
logger$1a.debug('envelope_delivery_retry_scheduled', {
|
|
11062
11062
|
envp_id: tracked.originalEnvelope.id,
|
|
11063
11063
|
attempt: currentTracked.attempt,
|
|
11064
11064
|
max_retries: retryPolicy.maxRetries,
|
|
@@ -11070,7 +11070,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11070
11070
|
currentTracked.timeoutAtMs = currentTracked.overallTimeoutAtMs;
|
|
11071
11071
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11072
11072
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11073
|
-
logger$
|
|
11073
|
+
logger$1a.debug('envelope_retries_exhausted_waiting_until_overall_timeout', {
|
|
11074
11074
|
envp_id: tracked.originalEnvelope.id,
|
|
11075
11075
|
attempt: currentTracked.attempt,
|
|
11076
11076
|
overall_timeout_at_ms: currentTracked.overallTimeoutAtMs,
|
|
@@ -11090,7 +11090,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11090
11090
|
for (const handler of this.eventHandlers) {
|
|
11091
11091
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11092
11092
|
}
|
|
11093
|
-
logger$
|
|
11093
|
+
logger$1a.debug('tracker_envelope_timed_out', {
|
|
11094
11094
|
envp_id: tracked.originalEnvelope.id,
|
|
11095
11095
|
});
|
|
11096
11096
|
}
|
|
@@ -11098,7 +11098,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11098
11098
|
if (error instanceof TaskCancelledError) {
|
|
11099
11099
|
return;
|
|
11100
11100
|
}
|
|
11101
|
-
logger$
|
|
11101
|
+
logger$1a.error('tracker_timer_error', {
|
|
11102
11102
|
envp_id: tracked.originalEnvelope.id,
|
|
11103
11103
|
error: error instanceof Error ? error.message : String(error),
|
|
11104
11104
|
});
|
|
@@ -11153,7 +11153,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11153
11153
|
if (timeoutSeconds !== null) {
|
|
11154
11154
|
return await this.awaitWithTimeout(future.promise, timeoutSeconds);
|
|
11155
11155
|
}
|
|
11156
|
-
logger$
|
|
11156
|
+
logger$1a.debug('await_envelope_no_timeout_wait', {
|
|
11157
11157
|
envelope_id: envelopeId,
|
|
11158
11158
|
});
|
|
11159
11159
|
return await future.promise;
|
|
@@ -11162,7 +11162,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11162
11162
|
if (error instanceof Error && error.name !== 'TimeoutError') {
|
|
11163
11163
|
throw error;
|
|
11164
11164
|
}
|
|
11165
|
-
logger$
|
|
11165
|
+
logger$1a.error('await_envelope_timeout_error', {
|
|
11166
11166
|
envelope_id: envelopeId,
|
|
11167
11167
|
timeout_ms: timeoutSeconds,
|
|
11168
11168
|
future_done: false,
|
|
@@ -11323,7 +11323,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11323
11323
|
this.replyDoneSince.delete(envId);
|
|
11324
11324
|
}
|
|
11325
11325
|
});
|
|
11326
|
-
logger$
|
|
11326
|
+
logger$1a.debug('tracker_swept_completed_futures', {
|
|
11327
11327
|
ack_removed: toRemoveAck.length,
|
|
11328
11328
|
reply_removed: toRemoveReply.length,
|
|
11329
11329
|
grace_secs: this.futGcGraceSecs,
|
|
@@ -11337,7 +11337,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11337
11337
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
11338
11338
|
continue;
|
|
11339
11339
|
}
|
|
11340
|
-
logger$
|
|
11340
|
+
logger$1a.error('tracker_sweeper_error', {
|
|
11341
11341
|
error: error instanceof Error ? error.message : String(error),
|
|
11342
11342
|
});
|
|
11343
11343
|
}
|
|
@@ -11368,14 +11368,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11368
11368
|
}
|
|
11369
11369
|
const node = this.node;
|
|
11370
11370
|
if (!envelope.replyTo) {
|
|
11371
|
-
logger$
|
|
11371
|
+
logger$1a.error('cannot_send_ack_no_reply_to', { envp_id: envelope.id });
|
|
11372
11372
|
return;
|
|
11373
11373
|
}
|
|
11374
11374
|
if (!envelope.corrId) {
|
|
11375
|
-
logger$
|
|
11375
|
+
logger$1a.error('cannot_send_ack_no_corr_id', { envp_id: envelope.id });
|
|
11376
11376
|
return;
|
|
11377
11377
|
}
|
|
11378
|
-
logger$
|
|
11378
|
+
logger$1a.debug('tracker_sending_ack', {
|
|
11379
11379
|
envp_id: envelope.id,
|
|
11380
11380
|
ref_id: envelope.id,
|
|
11381
11381
|
to: envelope.replyTo,
|
|
@@ -11395,7 +11395,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11395
11395
|
.send(ackEnvelope)
|
|
11396
11396
|
.then(() => undefined)
|
|
11397
11397
|
.catch((error) => {
|
|
11398
|
-
logger$
|
|
11398
|
+
logger$1a.error('tracker_ack_dispatch_failed', {
|
|
11399
11399
|
envp_id: envelope.id,
|
|
11400
11400
|
error: error instanceof Error ? error.message : String(error),
|
|
11401
11401
|
});
|
|
@@ -11481,7 +11481,7 @@ class AsyncEvent {
|
|
|
11481
11481
|
}
|
|
11482
11482
|
}
|
|
11483
11483
|
|
|
11484
|
-
const logger$
|
|
11484
|
+
const logger$19 = getLogger('naylence.fame.node.root_session_manager');
|
|
11485
11485
|
function resolveOption$1(options, primary, ...aliases) {
|
|
11486
11486
|
const record = options;
|
|
11487
11487
|
const primaryKey = primary;
|
|
@@ -11562,7 +11562,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11562
11562
|
this.onAdmissionFailed =
|
|
11563
11563
|
typeof onAdmissionFailed === 'function' ? onAdmissionFailed : undefined;
|
|
11564
11564
|
this.enableContinuousRefresh = enableContinuousRefresh ?? true;
|
|
11565
|
-
logger$
|
|
11565
|
+
logger$19.debug('created_root_session_manager');
|
|
11566
11566
|
}
|
|
11567
11567
|
get isReady() {
|
|
11568
11568
|
return this.readyEvent.isSet();
|
|
@@ -11587,7 +11587,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11587
11587
|
if (this.admissionTask) {
|
|
11588
11588
|
return;
|
|
11589
11589
|
}
|
|
11590
|
-
logger$
|
|
11590
|
+
logger$19.debug('root_session_manager_starting');
|
|
11591
11591
|
this.stopEvent.clear();
|
|
11592
11592
|
this.readyEvent.clear();
|
|
11593
11593
|
const taskName = `root-admission-${this.admissionEpoch}`;
|
|
@@ -11607,10 +11607,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11607
11607
|
await this.admissionTask.promise;
|
|
11608
11608
|
throw new FameConnectError('Root session manager failed to become ready');
|
|
11609
11609
|
}
|
|
11610
|
-
logger$
|
|
11610
|
+
logger$19.debug('root_session_manager_started');
|
|
11611
11611
|
}
|
|
11612
11612
|
async stop() {
|
|
11613
|
-
logger$
|
|
11613
|
+
logger$19.debug('root_session_manager_stopping');
|
|
11614
11614
|
this.stopEvent.set();
|
|
11615
11615
|
if (this.admissionTask) {
|
|
11616
11616
|
this.admissionTask.cancel();
|
|
@@ -11622,7 +11622,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11622
11622
|
await this.consumeTask(this.expiryGuardTask);
|
|
11623
11623
|
this.expiryGuardTask = null;
|
|
11624
11624
|
}
|
|
11625
|
-
logger$
|
|
11625
|
+
logger$19.debug('root_session_manager_stopped');
|
|
11626
11626
|
}
|
|
11627
11627
|
async awaitReady(timeoutMs) {
|
|
11628
11628
|
if (this.isReady) {
|
|
@@ -11663,12 +11663,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11663
11663
|
await this.onEpochChange(epoch);
|
|
11664
11664
|
}
|
|
11665
11665
|
else {
|
|
11666
|
-
logger$
|
|
11666
|
+
logger$19.debug('epoch_change_ignored_no_handler', { epoch });
|
|
11667
11667
|
}
|
|
11668
11668
|
}
|
|
11669
11669
|
static createForRootSentinel(node, admissionClient, requestedLogicals = [], enableContinuousRefresh = true, onEpochChange) {
|
|
11670
11670
|
const handleWelcome = async (frame) => {
|
|
11671
|
-
logger$
|
|
11671
|
+
logger$19.info('root_admission_successful', {
|
|
11672
11672
|
system_id: frame.systemId,
|
|
11673
11673
|
assigned_path: frame.assignedPath ?? null,
|
|
11674
11674
|
accepted_logicals: frame.acceptedLogicals ?? [],
|
|
@@ -11679,12 +11679,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11679
11679
|
? grant.purpose
|
|
11680
11680
|
: undefined;
|
|
11681
11681
|
if (purpose) {
|
|
11682
|
-
logger$
|
|
11682
|
+
logger$19.debug('received_admission_grant', { purpose });
|
|
11683
11683
|
}
|
|
11684
11684
|
}
|
|
11685
11685
|
};
|
|
11686
11686
|
const handleFailure = async (error) => {
|
|
11687
|
-
logger$
|
|
11687
|
+
logger$19.error('root_admission_failed_permanently', {
|
|
11688
11688
|
error: error.message,
|
|
11689
11689
|
});
|
|
11690
11690
|
};
|
|
@@ -11713,10 +11713,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11713
11713
|
this.readyEvent.set();
|
|
11714
11714
|
}
|
|
11715
11715
|
if (this.hadSuccessfulAdmission) {
|
|
11716
|
-
logger$
|
|
11716
|
+
logger$19.debug('root_admission_refreshed');
|
|
11717
11717
|
}
|
|
11718
11718
|
else {
|
|
11719
|
-
logger$
|
|
11719
|
+
logger$19.debug('root_admission_completed');
|
|
11720
11720
|
}
|
|
11721
11721
|
this.hadSuccessfulAdmission = true;
|
|
11722
11722
|
delay = RootSessionManager.BACKOFF_INITIAL;
|
|
@@ -11725,7 +11725,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11725
11725
|
await this.startExpiryGuard(welcomeFrame);
|
|
11726
11726
|
const expiryTriggered = await this.waitForExpiryOrStop();
|
|
11727
11727
|
if (expiryTriggered && !this.stopEvent.isSet()) {
|
|
11728
|
-
logger$
|
|
11728
|
+
logger$19.debug('performing_scheduled_re_admission');
|
|
11729
11729
|
continue;
|
|
11730
11730
|
}
|
|
11731
11731
|
}
|
|
@@ -11737,7 +11737,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11737
11737
|
}
|
|
11738
11738
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11739
11739
|
const willRetry = attempts < RootSessionManager.RETRY_MAX_ATTEMPTS;
|
|
11740
|
-
logger$
|
|
11740
|
+
logger$19.warning('root_admission_failed', {
|
|
11741
11741
|
error: errorObject.message,
|
|
11742
11742
|
attempt: attempts,
|
|
11743
11743
|
will_retry: willRetry,
|
|
@@ -11755,7 +11755,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11755
11755
|
}
|
|
11756
11756
|
}
|
|
11757
11757
|
if (attempts >= RootSessionManager.RETRY_MAX_ATTEMPTS) {
|
|
11758
|
-
logger$
|
|
11758
|
+
logger$19.error('root_admission_max_attempts_exceeded', {
|
|
11759
11759
|
max_attempts: RootSessionManager.RETRY_MAX_ATTEMPTS,
|
|
11760
11760
|
});
|
|
11761
11761
|
}
|
|
@@ -11832,7 +11832,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11832
11832
|
}
|
|
11833
11833
|
async expiryGuard(welcomeFrame, signal) {
|
|
11834
11834
|
if (!welcomeFrame.expiresAt) {
|
|
11835
|
-
logger$
|
|
11835
|
+
logger$19.debug('no_admission_expiry_configured');
|
|
11836
11836
|
await Promise.race([this.stopEvent.wait(), this.waitForAbort(signal)]);
|
|
11837
11837
|
return;
|
|
11838
11838
|
}
|
|
@@ -11841,7 +11841,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11841
11841
|
let delaySeconds = (expiresAt.getTime() - now.getTime()) / 1000 -
|
|
11842
11842
|
RootSessionManager.JWT_REFRESH_SAFETY;
|
|
11843
11843
|
delaySeconds = Math.max(delaySeconds, 0);
|
|
11844
|
-
logger$
|
|
11844
|
+
logger$19.debug('admission_expiry_guard_started', {
|
|
11845
11845
|
welcome_expires_at: expiresAt.toISOString(),
|
|
11846
11846
|
delay_seconds: delaySeconds,
|
|
11847
11847
|
refresh_safety_seconds: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11850,7 +11850,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11850
11850
|
if (this.stopEvent.isSet() || signal?.aborted) {
|
|
11851
11851
|
return;
|
|
11852
11852
|
}
|
|
11853
|
-
logger$
|
|
11853
|
+
logger$19.debug('admission_expiry_triggered_refresh', {
|
|
11854
11854
|
expires_at: expiresAt.toISOString(),
|
|
11855
11855
|
current_time: new Date().toISOString(),
|
|
11856
11856
|
seconds_before_expiry: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11865,7 +11865,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11865
11865
|
return;
|
|
11866
11866
|
}
|
|
11867
11867
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11868
|
-
logger$
|
|
11868
|
+
logger$19.debug('background_task_error', {
|
|
11869
11869
|
task_name: task.name,
|
|
11870
11870
|
error: errorObject.message,
|
|
11871
11871
|
});
|
|
@@ -11961,7 +11961,7 @@ class BoundedAsyncQueue {
|
|
|
11961
11961
|
}
|
|
11962
11962
|
}
|
|
11963
11963
|
|
|
11964
|
-
const logger$
|
|
11964
|
+
const logger$18 = getLogger('naylence.fame.connector.broadcast_channel_connector');
|
|
11965
11965
|
const BROADCAST_CHANNEL_CONNECTOR_TYPE$1 = 'broadcast-channel-connector';
|
|
11966
11966
|
const DEFAULT_CHANNEL$7 = 'naylence-fabric';
|
|
11967
11967
|
const DEFAULT_INBOX_CAPACITY$7 = 2048;
|
|
@@ -12050,7 +12050,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12050
12050
|
this.localNodeId = normalizedLocalNodeId;
|
|
12051
12051
|
this.targetNodeId = BroadcastChannelConnector.normalizeTargetNodeId(config.initialTargetNodeId);
|
|
12052
12052
|
this.channel = new BroadcastChannel(this.channelName);
|
|
12053
|
-
logger$
|
|
12053
|
+
logger$18.debug('broadcast_channel_connector_created', {
|
|
12054
12054
|
channel: this.channelName,
|
|
12055
12055
|
connector_id: this.connectorId,
|
|
12056
12056
|
local_node_id: this.localNodeId,
|
|
@@ -12062,7 +12062,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12062
12062
|
this.onMsg = (event) => {
|
|
12063
12063
|
// Guard: Don't process if listener was unregistered
|
|
12064
12064
|
if (!this.listenerRegistered) {
|
|
12065
|
-
logger$
|
|
12065
|
+
logger$18.warning('broadcast_channel_message_after_unregister', {
|
|
12066
12066
|
channel: this.channelName,
|
|
12067
12067
|
connector_id: this.connectorId,
|
|
12068
12068
|
timestamp: new Date().toISOString(),
|
|
@@ -12070,7 +12070,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12070
12070
|
return;
|
|
12071
12071
|
}
|
|
12072
12072
|
const message = event.data;
|
|
12073
|
-
logger$
|
|
12073
|
+
logger$18.debug('broadcast_channel_raw_event', {
|
|
12074
12074
|
channel: this.channelName,
|
|
12075
12075
|
connector_id: this.connectorId,
|
|
12076
12076
|
message_type: message && typeof message === 'object'
|
|
@@ -12086,7 +12086,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12086
12086
|
const busMessage = message;
|
|
12087
12087
|
const senderNodeId = BroadcastChannelConnector.normalizeNodeId(busMessage.senderNodeId);
|
|
12088
12088
|
if (!senderNodeId) {
|
|
12089
|
-
logger$
|
|
12089
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12090
12090
|
channel: this.channelName,
|
|
12091
12091
|
connector_id: this.connectorId,
|
|
12092
12092
|
reason: 'missing_sender_node_id',
|
|
@@ -12094,7 +12094,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12094
12094
|
return;
|
|
12095
12095
|
}
|
|
12096
12096
|
if (senderNodeId === this.localNodeId) {
|
|
12097
|
-
logger$
|
|
12097
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12098
12098
|
channel: this.channelName,
|
|
12099
12099
|
connector_id: this.connectorId,
|
|
12100
12100
|
reason: 'self_echo',
|
|
@@ -12108,14 +12108,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12108
12108
|
}
|
|
12109
12109
|
const payload = BroadcastChannelConnector.coercePayload(busMessage.payload);
|
|
12110
12110
|
if (!payload) {
|
|
12111
|
-
logger$
|
|
12111
|
+
logger$18.debug('broadcast_channel_payload_rejected', {
|
|
12112
12112
|
channel: this.channelName,
|
|
12113
12113
|
connector_id: this.connectorId,
|
|
12114
12114
|
reason: 'unrecognized_payload_type',
|
|
12115
12115
|
});
|
|
12116
12116
|
return;
|
|
12117
12117
|
}
|
|
12118
|
-
logger$
|
|
12118
|
+
logger$18.debug('broadcast_channel_message_received', {
|
|
12119
12119
|
channel: this.channelName,
|
|
12120
12120
|
sender_id: message?.senderId,
|
|
12121
12121
|
sender_node_id: senderNodeId,
|
|
@@ -12144,14 +12144,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12144
12144
|
}
|
|
12145
12145
|
catch (error) {
|
|
12146
12146
|
if (error instanceof QueueFullError) {
|
|
12147
|
-
logger$
|
|
12147
|
+
logger$18.warning('broadcast_channel_receive_queue_full', {
|
|
12148
12148
|
channel: this.channelName,
|
|
12149
12149
|
inbox_capacity: this.inboxCapacity,
|
|
12150
12150
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12151
12151
|
});
|
|
12152
12152
|
}
|
|
12153
12153
|
else {
|
|
12154
|
-
logger$
|
|
12154
|
+
logger$18.error('broadcast_channel_receive_error', {
|
|
12155
12155
|
channel: this.channelName,
|
|
12156
12156
|
error: error instanceof Error ? error.message : String(error),
|
|
12157
12157
|
});
|
|
@@ -12165,7 +12165,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12165
12165
|
// Setup visibility change monitoring
|
|
12166
12166
|
this.visibilityChangeHandler = () => {
|
|
12167
12167
|
const isHidden = document.hidden;
|
|
12168
|
-
logger$
|
|
12168
|
+
logger$18.debug('broadcast_channel_visibility_changed', {
|
|
12169
12169
|
channel: this.channelName,
|
|
12170
12170
|
connector_id: this.connectorId,
|
|
12171
12171
|
visibility: isHidden ? 'hidden' : 'visible',
|
|
@@ -12174,7 +12174,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12174
12174
|
// Pause/resume connector based on visibility
|
|
12175
12175
|
if (isHidden && this.state === core.ConnectorState.STARTED) {
|
|
12176
12176
|
this.pause().catch((err) => {
|
|
12177
|
-
logger$
|
|
12177
|
+
logger$18.warning('broadcast_channel_pause_failed', {
|
|
12178
12178
|
channel: this.channelName,
|
|
12179
12179
|
connector_id: this.connectorId,
|
|
12180
12180
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12183,7 +12183,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12183
12183
|
}
|
|
12184
12184
|
else if (!isHidden && this.state === core.ConnectorState.PAUSED) {
|
|
12185
12185
|
this.resume().catch((err) => {
|
|
12186
|
-
logger$
|
|
12186
|
+
logger$18.warning('broadcast_channel_resume_failed', {
|
|
12187
12187
|
channel: this.channelName,
|
|
12188
12188
|
connector_id: this.connectorId,
|
|
12189
12189
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12197,7 +12197,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12197
12197
|
// Track page lifecycle events to detect browser unload/discard
|
|
12198
12198
|
if (typeof window !== 'undefined') {
|
|
12199
12199
|
const lifecycleLogger = (event) => {
|
|
12200
|
-
logger$
|
|
12200
|
+
logger$18.debug('broadcast_channel_page_lifecycle', {
|
|
12201
12201
|
channel: this.channelName,
|
|
12202
12202
|
connector_id: this.connectorId,
|
|
12203
12203
|
event_type: event.type,
|
|
@@ -12213,7 +12213,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12213
12213
|
document.addEventListener('resume', lifecycleLogger);
|
|
12214
12214
|
}
|
|
12215
12215
|
// Log initial state with detailed visibility info
|
|
12216
|
-
logger$
|
|
12216
|
+
logger$18.debug('broadcast_channel_initial_visibility', {
|
|
12217
12217
|
channel: this.channelName,
|
|
12218
12218
|
connector_id: this.connectorId,
|
|
12219
12219
|
visibility: document.hidden ? 'hidden' : 'visible',
|
|
@@ -12245,14 +12245,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12245
12245
|
}
|
|
12246
12246
|
catch (error) {
|
|
12247
12247
|
if (error instanceof QueueFullError) {
|
|
12248
|
-
logger$
|
|
12248
|
+
logger$18.warning('broadcast_channel_push_queue_full', {
|
|
12249
12249
|
channel: this.channelName,
|
|
12250
12250
|
inbox_capacity: this.inboxCapacity,
|
|
12251
12251
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12252
12252
|
});
|
|
12253
12253
|
throw error;
|
|
12254
12254
|
}
|
|
12255
|
-
logger$
|
|
12255
|
+
logger$18.error('broadcast_channel_push_failed', {
|
|
12256
12256
|
channel: this.channelName,
|
|
12257
12257
|
error: error instanceof Error ? error.message : String(error),
|
|
12258
12258
|
});
|
|
@@ -12262,7 +12262,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12262
12262
|
async _transportSendBytes(data) {
|
|
12263
12263
|
ensureBroadcastEnvironment();
|
|
12264
12264
|
const targetNodeId = this.targetNodeId ?? '*';
|
|
12265
|
-
logger$
|
|
12265
|
+
logger$18.debug('broadcast_channel_message_sending', {
|
|
12266
12266
|
channel: this.channelName,
|
|
12267
12267
|
sender_id: this.connectorId,
|
|
12268
12268
|
sender_node_id: this.localNodeId,
|
|
@@ -12283,7 +12283,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12283
12283
|
return item;
|
|
12284
12284
|
}
|
|
12285
12285
|
async _transportClose(code, reason) {
|
|
12286
|
-
logger$
|
|
12286
|
+
logger$18.debug('broadcast_channel_transport_closing', {
|
|
12287
12287
|
channel: this.channelName,
|
|
12288
12288
|
connector_id: this.connectorId,
|
|
12289
12289
|
code,
|
|
@@ -12292,14 +12292,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12292
12292
|
timestamp: new Date().toISOString(),
|
|
12293
12293
|
});
|
|
12294
12294
|
if (this.listenerRegistered) {
|
|
12295
|
-
logger$
|
|
12295
|
+
logger$18.debug('broadcast_channel_removing_listener', {
|
|
12296
12296
|
channel: this.channelName,
|
|
12297
12297
|
connector_id: this.connectorId,
|
|
12298
12298
|
timestamp: new Date().toISOString(),
|
|
12299
12299
|
});
|
|
12300
12300
|
this.channel.removeEventListener('message', this.onMsg);
|
|
12301
12301
|
this.listenerRegistered = false;
|
|
12302
|
-
logger$
|
|
12302
|
+
logger$18.debug('broadcast_channel_listener_removed', {
|
|
12303
12303
|
channel: this.channelName,
|
|
12304
12304
|
connector_id: this.connectorId,
|
|
12305
12305
|
timestamp: new Date().toISOString(),
|
|
@@ -12312,13 +12312,13 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12312
12312
|
this.visibilityChangeListenerRegistered = false;
|
|
12313
12313
|
this.visibilityChangeHandler = undefined;
|
|
12314
12314
|
}
|
|
12315
|
-
logger$
|
|
12315
|
+
logger$18.debug('broadcast_channel_closing', {
|
|
12316
12316
|
channel: this.channelName,
|
|
12317
12317
|
connector_id: this.connectorId,
|
|
12318
12318
|
timestamp: new Date().toISOString(),
|
|
12319
12319
|
});
|
|
12320
12320
|
this.channel.close();
|
|
12321
|
-
logger$
|
|
12321
|
+
logger$18.debug('broadcast_channel_closed', {
|
|
12322
12322
|
channel: this.channelName,
|
|
12323
12323
|
connector_id: this.connectorId,
|
|
12324
12324
|
timestamp: new Date().toISOString(),
|
|
@@ -12342,7 +12342,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12342
12342
|
if (targetNodeId &&
|
|
12343
12343
|
targetNodeId !== '*' &&
|
|
12344
12344
|
targetNodeId !== this.localNodeId) {
|
|
12345
|
-
logger$
|
|
12345
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12346
12346
|
channel: this.channelName,
|
|
12347
12347
|
connector_id: this.connectorId,
|
|
12348
12348
|
reason: 'wildcard_target_mismatch',
|
|
@@ -12358,7 +12358,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12358
12358
|
if (expectedSender &&
|
|
12359
12359
|
expectedSender !== '*' &&
|
|
12360
12360
|
senderNodeId !== expectedSender) {
|
|
12361
|
-
logger$
|
|
12361
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12362
12362
|
channel: this.channelName,
|
|
12363
12363
|
connector_id: this.connectorId,
|
|
12364
12364
|
reason: 'unexpected_sender',
|
|
@@ -12371,7 +12371,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12371
12371
|
if (targetNodeId &&
|
|
12372
12372
|
targetNodeId !== '*' &&
|
|
12373
12373
|
targetNodeId !== this.localNodeId) {
|
|
12374
|
-
logger$
|
|
12374
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12375
12375
|
channel: this.channelName,
|
|
12376
12376
|
connector_id: this.connectorId,
|
|
12377
12377
|
reason: 'unexpected_target',
|
|
@@ -12396,7 +12396,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12396
12396
|
return 'unknown';
|
|
12397
12397
|
}
|
|
12398
12398
|
logInboxSnapshot(event, extra = {}) {
|
|
12399
|
-
logger$
|
|
12399
|
+
logger$18.debug(event, {
|
|
12400
12400
|
channel: this.channelName,
|
|
12401
12401
|
connector_id: this.connectorId,
|
|
12402
12402
|
connector_state: this.state,
|
|
@@ -12412,7 +12412,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12412
12412
|
await super.start(inboundHandler);
|
|
12413
12413
|
// After transitioning to STARTED, check if tab is already hidden
|
|
12414
12414
|
if (typeof document !== 'undefined' && document.hidden) {
|
|
12415
|
-
logger$
|
|
12415
|
+
logger$18.debug('broadcast_channel_start_in_hidden_tab', {
|
|
12416
12416
|
channel: this.channelName,
|
|
12417
12417
|
connector_id: this.connectorId,
|
|
12418
12418
|
document_hidden: document.hidden,
|
|
@@ -12422,7 +12422,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12422
12422
|
});
|
|
12423
12423
|
// Immediately pause if tab is hidden at start time
|
|
12424
12424
|
await this.pause().catch((err) => {
|
|
12425
|
-
logger$
|
|
12425
|
+
logger$18.warning('broadcast_channel_initial_pause_failed', {
|
|
12426
12426
|
channel: this.channelName,
|
|
12427
12427
|
connector_id: this.connectorId,
|
|
12428
12428
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12440,7 +12440,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12440
12440
|
return;
|
|
12441
12441
|
}
|
|
12442
12442
|
this.targetNodeId = normalized;
|
|
12443
|
-
logger$
|
|
12443
|
+
logger$18.debug('broadcast_channel_target_updated', {
|
|
12444
12444
|
channel: this.channelName,
|
|
12445
12445
|
connector_id: this.connectorId,
|
|
12446
12446
|
local_node_id: this.localNodeId,
|
|
@@ -12450,7 +12450,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12450
12450
|
}
|
|
12451
12451
|
setWildcardTarget() {
|
|
12452
12452
|
this.targetNodeId = '*';
|
|
12453
|
-
logger$
|
|
12453
|
+
logger$18.debug('broadcast_channel_target_updated', {
|
|
12454
12454
|
channel: this.channelName,
|
|
12455
12455
|
connector_id: this.connectorId,
|
|
12456
12456
|
local_node_id: this.localNodeId,
|
|
@@ -12578,7 +12578,7 @@ function broadcastChannelGrantToConnectorConfig(grant) {
|
|
|
12578
12578
|
return config;
|
|
12579
12579
|
}
|
|
12580
12580
|
|
|
12581
|
-
const logger$
|
|
12581
|
+
const logger$17 = getLogger('naylence.fame.node.upstream_session_manager');
|
|
12582
12582
|
function isPlainRecord$4(value) {
|
|
12583
12583
|
if (typeof value !== 'object' || value === null) {
|
|
12584
12584
|
return false;
|
|
@@ -12699,7 +12699,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12699
12699
|
this.wrappedHandler = this.makeHeartbeatEnabledHandler(options.inboundHandler);
|
|
12700
12700
|
// Store the connection retry policy (can be null, in which case default behavior applies)
|
|
12701
12701
|
this.connectionRetryPolicy = options.retryPolicy ?? null;
|
|
12702
|
-
logger$
|
|
12702
|
+
logger$17.debug('created_upstream_session_manager', {
|
|
12703
12703
|
target_system_id: this.targetSystemId,
|
|
12704
12704
|
has_retry_policy: this.connectionRetryPolicy !== null,
|
|
12705
12705
|
});
|
|
@@ -12708,23 +12708,23 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12708
12708
|
return this.targetSystemId;
|
|
12709
12709
|
}
|
|
12710
12710
|
setupVisibilityListener() {
|
|
12711
|
-
logger$
|
|
12711
|
+
logger$17.debug('setup_visibility_listener_called', {
|
|
12712
12712
|
has_document: typeof document !== 'undefined',
|
|
12713
12713
|
});
|
|
12714
12714
|
if (typeof document !== 'undefined' && document.addEventListener) {
|
|
12715
12715
|
this._visibilityHandler = () => {
|
|
12716
|
-
logger$
|
|
12716
|
+
logger$17.debug('visibility_change_event_fired', {
|
|
12717
12717
|
state: document.visibilityState,
|
|
12718
12718
|
});
|
|
12719
12719
|
if (document.visibilityState === 'visible') {
|
|
12720
|
-
logger$
|
|
12720
|
+
logger$17.debug('visibility_change_detected_waking_up');
|
|
12721
12721
|
this.wakeEvent.set();
|
|
12722
12722
|
}
|
|
12723
12723
|
};
|
|
12724
12724
|
document.addEventListener('visibilitychange', this._visibilityHandler);
|
|
12725
12725
|
}
|
|
12726
12726
|
else {
|
|
12727
|
-
logger$
|
|
12727
|
+
logger$17.debug('setup_visibility_listener_skipped_no_document');
|
|
12728
12728
|
}
|
|
12729
12729
|
}
|
|
12730
12730
|
teardownVisibilityListener() {
|
|
@@ -12757,13 +12757,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12757
12757
|
}
|
|
12758
12758
|
throw new FameConnectError('Upstream session manager failed to attach');
|
|
12759
12759
|
}
|
|
12760
|
-
logger$
|
|
12760
|
+
logger$17.debug('upstream_session_manager_started');
|
|
12761
12761
|
}
|
|
12762
12762
|
getActiveConnector() {
|
|
12763
12763
|
return this.connector;
|
|
12764
12764
|
}
|
|
12765
12765
|
async stop() {
|
|
12766
|
-
logger$
|
|
12766
|
+
logger$17.debug('upstream_session_manager_stopping');
|
|
12767
12767
|
this.teardownVisibilityListener();
|
|
12768
12768
|
this.stopEvent.set();
|
|
12769
12769
|
this.currentStopSubtasks?.set();
|
|
@@ -12774,7 +12774,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12774
12774
|
}
|
|
12775
12775
|
catch (error) {
|
|
12776
12776
|
if (!(error instanceof TaskCancelledError)) {
|
|
12777
|
-
logger$
|
|
12777
|
+
logger$17.debug('fsm_task_stopped_with_error', {
|
|
12778
12778
|
error: error.message,
|
|
12779
12779
|
});
|
|
12780
12780
|
}
|
|
@@ -12783,13 +12783,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12783
12783
|
}
|
|
12784
12784
|
if (this.connector) {
|
|
12785
12785
|
await this.connector.stop().catch((error) => {
|
|
12786
|
-
logger$
|
|
12786
|
+
logger$17.debug('connector_stop_error', {
|
|
12787
12787
|
error: error.message,
|
|
12788
12788
|
});
|
|
12789
12789
|
});
|
|
12790
12790
|
this.connector = null;
|
|
12791
12791
|
}
|
|
12792
|
-
logger$
|
|
12792
|
+
logger$17.debug('upstream_session_manager_stopped');
|
|
12793
12793
|
}
|
|
12794
12794
|
async send(envelope) {
|
|
12795
12795
|
if (this.messageQueue.length >= UpstreamSessionManager.TX_QUEUE_MAX) {
|
|
@@ -12838,7 +12838,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12838
12838
|
const shouldFailFast = this.shouldFailFastOnError(error);
|
|
12839
12839
|
if (error instanceof FameTransportClose ||
|
|
12840
12840
|
error instanceof FameConnectError) {
|
|
12841
|
-
logger$
|
|
12841
|
+
logger$17.warning('upstream_link_closed', {
|
|
12842
12842
|
error: error.message,
|
|
12843
12843
|
will_retry: !shouldFailFast,
|
|
12844
12844
|
attempt: this.initialAttempts,
|
|
@@ -12851,13 +12851,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12851
12851
|
else {
|
|
12852
12852
|
const err = error;
|
|
12853
12853
|
if (err.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
12854
|
-
logger$
|
|
12854
|
+
logger$17.info('upstream_link_redirecting', {
|
|
12855
12855
|
error: err.message,
|
|
12856
12856
|
will_retry: true,
|
|
12857
12857
|
});
|
|
12858
12858
|
}
|
|
12859
12859
|
else {
|
|
12860
|
-
logger$
|
|
12860
|
+
logger$17.warning('upstream_link_closed', {
|
|
12861
12861
|
error: err.message,
|
|
12862
12862
|
will_retry: !shouldFailFast,
|
|
12863
12863
|
attempt: this.initialAttempts,
|
|
@@ -12901,7 +12901,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12901
12901
|
// If sleep was interrupted by visibility change (user returned to tab),
|
|
12902
12902
|
// reset backoff to initial delay for immediate retry with fresh backoff
|
|
12903
12903
|
if (wasWoken) {
|
|
12904
|
-
logger$
|
|
12904
|
+
logger$17.debug('backoff_reset_on_visibility_change', {
|
|
12905
12905
|
previous_delay: delay,
|
|
12906
12906
|
new_delay: UpstreamSessionManager.BACKOFF_INITIAL,
|
|
12907
12907
|
});
|
|
@@ -12920,7 +12920,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12920
12920
|
// Check if wake event is already set (e.g., visibility just changed)
|
|
12921
12921
|
if (this.wakeEvent.isSet()) {
|
|
12922
12922
|
this.wakeEvent.clear();
|
|
12923
|
-
logger$
|
|
12923
|
+
logger$17.debug('sleep_skipped_wake_event_pending');
|
|
12924
12924
|
return true;
|
|
12925
12925
|
}
|
|
12926
12926
|
let timeout;
|
|
@@ -12937,7 +12937,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12937
12937
|
]);
|
|
12938
12938
|
const wasWoken = this.wakeEvent.isSet();
|
|
12939
12939
|
if (wasWoken) {
|
|
12940
|
-
logger$
|
|
12940
|
+
logger$17.debug('sleep_interrupted_by_wake_event');
|
|
12941
12941
|
this.wakeEvent.clear();
|
|
12942
12942
|
}
|
|
12943
12943
|
if (timeout !== undefined) {
|
|
@@ -13000,7 +13000,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13000
13000
|
await connector.start(this.wrappedHandler);
|
|
13001
13001
|
this.connector = connector;
|
|
13002
13002
|
const callbackGrants = this.node.gatherSupportedCallbackGrants();
|
|
13003
|
-
logger$
|
|
13003
|
+
logger$17.debug('callback_grants_before_augmentation', {
|
|
13004
13004
|
count: callbackGrants.length,
|
|
13005
13005
|
types: callbackGrants.map((g) => g.type),
|
|
13006
13006
|
});
|
|
@@ -13010,7 +13010,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13010
13010
|
const broadcastCallbackGrant = shouldAddBroadcastGrant
|
|
13011
13011
|
? this.createBroadcastCallbackGrant(grant)
|
|
13012
13012
|
: null;
|
|
13013
|
-
logger$
|
|
13013
|
+
logger$17.debug('broadcast_callback_grant_check', {
|
|
13014
13014
|
should_add: shouldAddBroadcastGrant,
|
|
13015
13015
|
grant_created: !!broadcastCallbackGrant,
|
|
13016
13016
|
});
|
|
@@ -13029,12 +13029,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13029
13029
|
const isDuplicate = callbackGrants.some((existing) => JSON.stringify(existing) === JSON.stringify(grant));
|
|
13030
13030
|
if (!isDuplicate) {
|
|
13031
13031
|
callbackGrants.push(grant);
|
|
13032
|
-
logger$
|
|
13032
|
+
logger$17.debug('added_connection_grant_as_callback', {
|
|
13033
13033
|
type: grant.type,
|
|
13034
13034
|
});
|
|
13035
13035
|
}
|
|
13036
13036
|
else {
|
|
13037
|
-
logger$
|
|
13037
|
+
logger$17.debug('skipped_duplicate_connection_grant', {
|
|
13038
13038
|
type: grant.type,
|
|
13039
13039
|
});
|
|
13040
13040
|
}
|
|
@@ -13046,12 +13046,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13046
13046
|
if (broadcastCallbackGrant &&
|
|
13047
13047
|
this.shouldAdvertiseBroadcastGrant(grant, callbackGrants)) {
|
|
13048
13048
|
callbackGrants.push(broadcastCallbackGrant);
|
|
13049
|
-
logger$
|
|
13049
|
+
logger$17.debug('added_broadcast_callback_grant');
|
|
13050
13050
|
}
|
|
13051
13051
|
else if (broadcastCallbackGrant) {
|
|
13052
|
-
logger$
|
|
13052
|
+
logger$17.debug('skipped_duplicate_broadcast_callback_grant');
|
|
13053
13053
|
}
|
|
13054
|
-
logger$
|
|
13054
|
+
logger$17.debug('callback_grants_after_augmentation', {
|
|
13055
13055
|
count: callbackGrants.length,
|
|
13056
13056
|
types: callbackGrants.map((g) => g.type),
|
|
13057
13057
|
});
|
|
@@ -13064,7 +13064,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13064
13064
|
targetAware.setTargetNodeId(this.targetSystemId);
|
|
13065
13065
|
}
|
|
13066
13066
|
catch (error) {
|
|
13067
|
-
logger$
|
|
13067
|
+
logger$17.warning('broadcast_channel_target_apply_failed', {
|
|
13068
13068
|
error: error instanceof Error ? error.message : String(error),
|
|
13069
13069
|
target_node_id: this.targetSystemId,
|
|
13070
13070
|
});
|
|
@@ -13086,14 +13086,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13086
13086
|
});
|
|
13087
13087
|
}
|
|
13088
13088
|
else {
|
|
13089
|
-
logger$
|
|
13089
|
+
logger$17.warning('parent_epoch_changed', { epoch });
|
|
13090
13090
|
}
|
|
13091
13091
|
}
|
|
13092
13092
|
if (!this.readyEvent.isSet()) {
|
|
13093
13093
|
this.readyEvent.set();
|
|
13094
13094
|
}
|
|
13095
13095
|
if (this.messageQueue.length > 0) {
|
|
13096
|
-
logger$
|
|
13096
|
+
logger$17.debug('flushing_buffered_frames', {
|
|
13097
13097
|
queue_size: this.messageQueue.length,
|
|
13098
13098
|
});
|
|
13099
13099
|
this.queueEvent.set();
|
|
@@ -13110,12 +13110,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13110
13110
|
name: `expiry-guard-${this.connectEpoch}`,
|
|
13111
13111
|
});
|
|
13112
13112
|
if (this.hadSuccessfulAttach) {
|
|
13113
|
-
logger$
|
|
13113
|
+
logger$17.debug('reconnected_to_upstream', {
|
|
13114
13114
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13115
13115
|
});
|
|
13116
13116
|
}
|
|
13117
13117
|
else {
|
|
13118
|
-
logger$
|
|
13118
|
+
logger$17.debug('connected_to_upstream', {
|
|
13119
13119
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13120
13120
|
});
|
|
13121
13121
|
}
|
|
@@ -13133,18 +13133,18 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13133
13133
|
this.currentStopSubtasks = null;
|
|
13134
13134
|
await Promise.allSettled(tasks.map((task) => task.promise));
|
|
13135
13135
|
if (this.connector) {
|
|
13136
|
-
logger$
|
|
13136
|
+
logger$17.debug('upstream_stopping_old_connector', {
|
|
13137
13137
|
connect_epoch: this.connectEpoch,
|
|
13138
13138
|
target_system_id: this.targetSystemId,
|
|
13139
13139
|
timestamp: new Date().toISOString(),
|
|
13140
13140
|
});
|
|
13141
13141
|
await this.connector.stop().catch((err) => {
|
|
13142
|
-
logger$
|
|
13142
|
+
logger$17.warning('upstream_connector_stop_error', {
|
|
13143
13143
|
connect_epoch: this.connectEpoch,
|
|
13144
13144
|
error: err instanceof Error ? err.message : String(err),
|
|
13145
13145
|
});
|
|
13146
13146
|
});
|
|
13147
|
-
logger$
|
|
13147
|
+
logger$17.debug('upstream_old_connector_stopped', {
|
|
13148
13148
|
connect_epoch: this.connectEpoch,
|
|
13149
13149
|
target_system_id: this.targetSystemId,
|
|
13150
13150
|
timestamp: new Date().toISOString(),
|
|
@@ -13197,7 +13197,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13197
13197
|
});
|
|
13198
13198
|
}
|
|
13199
13199
|
catch (error) {
|
|
13200
|
-
logger$
|
|
13200
|
+
logger$17.debug('broadcast_callback_grant_generation_failed', {
|
|
13201
13201
|
error: error instanceof Error ? error.message : String(error),
|
|
13202
13202
|
});
|
|
13203
13203
|
return null;
|
|
@@ -13252,7 +13252,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13252
13252
|
}
|
|
13253
13253
|
}
|
|
13254
13254
|
async heartbeatLoop(connector, stopEvt, signal) {
|
|
13255
|
-
logger$
|
|
13255
|
+
logger$17.debug('starting_heartbeat_loop');
|
|
13256
13256
|
const intervalMs = UpstreamSessionManager.HEARTBEAT_INTERVAL * 1000;
|
|
13257
13257
|
const graceMs = intervalMs * UpstreamSessionManager.HEARTBEAT_GRACE;
|
|
13258
13258
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13288,7 +13288,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13288
13288
|
// Skip heartbeat if connector is paused (e.g., tab is hidden)
|
|
13289
13289
|
// Keep ack time current so we don't timeout immediately after resuming
|
|
13290
13290
|
if (currentState === core.ConnectorState.PAUSED) {
|
|
13291
|
-
logger$
|
|
13291
|
+
logger$17.debug('skipping_heartbeat_connector_paused', {
|
|
13292
13292
|
connector_state: currentState,
|
|
13293
13293
|
});
|
|
13294
13294
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13297,14 +13297,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13297
13297
|
// Reset ack time if just resumed from pause (prevents immediate timeout)
|
|
13298
13298
|
if (previousState === core.ConnectorState.PAUSED &&
|
|
13299
13299
|
currentState === core.ConnectorState.STARTED) {
|
|
13300
|
-
logger$
|
|
13300
|
+
logger$17.debug('connector_just_resumed_resetting_ack_time', {
|
|
13301
13301
|
previous_state: previousState,
|
|
13302
13302
|
current_state: currentState,
|
|
13303
13303
|
});
|
|
13304
13304
|
this.lastHeartbeatAckTime = Date.now();
|
|
13305
13305
|
}
|
|
13306
13306
|
const envelope = await this.makeHeartbeatEnvelope();
|
|
13307
|
-
logger$
|
|
13307
|
+
logger$17.debug('sending_heartbeat', {
|
|
13308
13308
|
hb_corr_id: envelope.corrId,
|
|
13309
13309
|
hb_env_id: envelope.id,
|
|
13310
13310
|
});
|
|
@@ -13330,7 +13330,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13330
13330
|
throw new FameConnectError('missed heartbeat acknowledgement');
|
|
13331
13331
|
}
|
|
13332
13332
|
}
|
|
13333
|
-
logger$
|
|
13333
|
+
logger$17.debug('completed_heartbeat_loop');
|
|
13334
13334
|
}
|
|
13335
13335
|
async messagePumpLoop(connector, stopEvt, signal) {
|
|
13336
13336
|
while (!stopEvt.isSet() && !signal?.aborted) {
|
|
@@ -13347,19 +13347,19 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13347
13347
|
if (!envelope) {
|
|
13348
13348
|
continue;
|
|
13349
13349
|
}
|
|
13350
|
-
logger$
|
|
13350
|
+
logger$17.debug('upstream_pump_sending_envelope', {
|
|
13351
13351
|
envelopeId: envelope.id,
|
|
13352
13352
|
type: envelope.frame?.type,
|
|
13353
13353
|
});
|
|
13354
13354
|
try {
|
|
13355
13355
|
await connector.send(envelope);
|
|
13356
|
-
logger$
|
|
13356
|
+
logger$17.debug('upstream_pump_sent_envelope', {
|
|
13357
13357
|
envelopeId: envelope.id,
|
|
13358
13358
|
});
|
|
13359
13359
|
}
|
|
13360
13360
|
catch (error) {
|
|
13361
13361
|
if (error instanceof FameMessageTooLarge) {
|
|
13362
|
-
logger$
|
|
13362
|
+
logger$17.error('failed_to_send_message', { error: error.message });
|
|
13363
13363
|
await this.handleMessageTooLarge(envelope, error.message);
|
|
13364
13364
|
}
|
|
13365
13365
|
else if (error instanceof FameTransportClose) {
|
|
@@ -13421,7 +13421,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13421
13421
|
await fabric.send(ackEnvelope);
|
|
13422
13422
|
}
|
|
13423
13423
|
catch (error) {
|
|
13424
|
-
logger$
|
|
13424
|
+
logger$17.warning('failed_to_send_nack', {
|
|
13425
13425
|
error: error.message,
|
|
13426
13426
|
});
|
|
13427
13427
|
}
|
|
@@ -13435,7 +13435,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13435
13435
|
timestamps.push(info.attachExpiresAt);
|
|
13436
13436
|
}
|
|
13437
13437
|
if (!timestamps.length) {
|
|
13438
|
-
logger$
|
|
13438
|
+
logger$17.debug('no_ttl_expiry_configured');
|
|
13439
13439
|
await this.waitEvent(stopEvt, signal);
|
|
13440
13440
|
return;
|
|
13441
13441
|
}
|
|
@@ -13444,7 +13444,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13444
13444
|
let delaySeconds = (earliest.getTime() - now.getTime()) / 1000 -
|
|
13445
13445
|
UpstreamSessionManager.JWT_REFRESH_SAFETY;
|
|
13446
13446
|
delaySeconds = Math.max(delaySeconds, UpstreamSessionManager.JWT_REFRESH_SAFETY);
|
|
13447
|
-
logger$
|
|
13447
|
+
logger$17.debug('ttl_expiry_guard_started', {
|
|
13448
13448
|
welcome_expires_at: welcome.frame.expiresAt ?? null,
|
|
13449
13449
|
attach_expires_at: info.attachExpiresAt?.toISOString?.() ?? null,
|
|
13450
13450
|
earliest_expiry: earliest.toISOString(),
|
|
@@ -13472,7 +13472,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13472
13472
|
}
|
|
13473
13473
|
}
|
|
13474
13474
|
if (!stopEvt.isSet()) {
|
|
13475
|
-
logger$
|
|
13475
|
+
logger$17.debug('ttl_expiry_triggered_reconnect', {
|
|
13476
13476
|
expires_at: earliest.toISOString(),
|
|
13477
13477
|
current_time: new Date().toISOString(),
|
|
13478
13478
|
seconds_before_expiry: UpstreamSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -13517,7 +13517,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13517
13517
|
}
|
|
13518
13518
|
await this.node.dispatchEnvelopeEvent('onEnvelopeReceived', this.node, env, context);
|
|
13519
13519
|
if (env.frame.type === 'NodeHeartbeatAck') {
|
|
13520
|
-
logger$
|
|
13520
|
+
logger$17.debug('received_heartbeat_ack', {
|
|
13521
13521
|
hb_ack_env_id: env.id,
|
|
13522
13522
|
hb_ack_corr_id: env.corrId,
|
|
13523
13523
|
hb_routing_epoch: env.frame.routingEpoch,
|
|
@@ -13531,7 +13531,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13531
13531
|
await this.onEpochChange(epoch);
|
|
13532
13532
|
}
|
|
13533
13533
|
else {
|
|
13534
|
-
logger$
|
|
13534
|
+
logger$17.warning('parent_epoch_changed', { epoch });
|
|
13535
13535
|
}
|
|
13536
13536
|
}
|
|
13537
13537
|
return;
|
|
@@ -13550,7 +13550,7 @@ UpstreamSessionManager.TX_QUEUE_MAX = 512;
|
|
|
13550
13550
|
UpstreamSessionManager.BACKOFF_INITIAL = 1; // seconds
|
|
13551
13551
|
UpstreamSessionManager.BACKOFF_CAP = 30; // seconds
|
|
13552
13552
|
|
|
13553
|
-
const logger$
|
|
13553
|
+
const logger$16 = getLogger('naylence.fame.node.admission.noop_admission_client');
|
|
13554
13554
|
class NoopAdmissionClient {
|
|
13555
13555
|
constructor(options = {}) {
|
|
13556
13556
|
this.hasUpstream = false;
|
|
@@ -13564,7 +13564,7 @@ class NoopAdmissionClient {
|
|
|
13564
13564
|
const acceptedLogicals = this.autoAcceptLogicals
|
|
13565
13565
|
? [...(requestedLogicals ?? [])]
|
|
13566
13566
|
: [];
|
|
13567
|
-
logger$
|
|
13567
|
+
logger$16.debug('noop_admission_hello', {
|
|
13568
13568
|
systemId: effectiveSystemId,
|
|
13569
13569
|
instanceId,
|
|
13570
13570
|
requestedLogicals,
|
|
@@ -13582,7 +13582,7 @@ class NoopAdmissionClient {
|
|
|
13582
13582
|
});
|
|
13583
13583
|
}
|
|
13584
13584
|
async close() {
|
|
13585
|
-
logger$
|
|
13585
|
+
logger$16.debug('noop_admission_close');
|
|
13586
13586
|
}
|
|
13587
13587
|
}
|
|
13588
13588
|
|
|
@@ -13788,7 +13788,7 @@ class DefaultServiceManager {
|
|
|
13788
13788
|
}
|
|
13789
13789
|
|
|
13790
13790
|
const SYSTEM_INBOX$1 = '__sys__';
|
|
13791
|
-
const logger$
|
|
13791
|
+
const logger$15 = getLogger('naylence.fame.node.node');
|
|
13792
13792
|
function isSnakeCase(name) {
|
|
13793
13793
|
return name.includes('_');
|
|
13794
13794
|
}
|
|
@@ -14058,7 +14058,7 @@ class FameNode extends TaskSpawner {
|
|
|
14058
14058
|
confirmIdentity(systemId, source) {
|
|
14059
14059
|
if (this._confirmedId) {
|
|
14060
14060
|
if (this._confirmedId !== systemId) {
|
|
14061
|
-
logger$
|
|
14061
|
+
logger$15.error('node_identity_mismatch', {
|
|
14062
14062
|
current_id: this._confirmedId,
|
|
14063
14063
|
new_id: systemId,
|
|
14064
14064
|
source,
|
|
@@ -14070,14 +14070,14 @@ class FameNode extends TaskSpawner {
|
|
|
14070
14070
|
const isReassignment = this._provisionalId !== systemId;
|
|
14071
14071
|
this._confirmedId = systemId;
|
|
14072
14072
|
if (isReassignment) {
|
|
14073
|
-
logger$
|
|
14073
|
+
logger$15.debug('node_identity_reassigned', {
|
|
14074
14074
|
system_id: systemId,
|
|
14075
14075
|
previous_id: this._provisionalId,
|
|
14076
14076
|
source,
|
|
14077
14077
|
});
|
|
14078
14078
|
}
|
|
14079
14079
|
else {
|
|
14080
|
-
logger$
|
|
14080
|
+
logger$15.debug('node_identity_confirmed', {
|
|
14081
14081
|
system_id: systemId,
|
|
14082
14082
|
source,
|
|
14083
14083
|
});
|
|
@@ -14145,7 +14145,7 @@ class FameNode extends TaskSpawner {
|
|
|
14145
14145
|
return;
|
|
14146
14146
|
}
|
|
14147
14147
|
if (frameType === 'NodeHeartbeat') {
|
|
14148
|
-
logger$
|
|
14148
|
+
logger$15.debug('received_heartbeat_frame', {
|
|
14149
14149
|
envelopeId: envelope.id,
|
|
14150
14150
|
corrId: envelope.corrId ?? null,
|
|
14151
14151
|
});
|
|
@@ -14157,7 +14157,7 @@ class FameNode extends TaskSpawner {
|
|
|
14157
14157
|
await this.handleDeliveryAck(envelope, context);
|
|
14158
14158
|
return;
|
|
14159
14159
|
}
|
|
14160
|
-
logger$
|
|
14160
|
+
logger$15.debug('unhandled_system_frame', {
|
|
14161
14161
|
envelopeId: envelope.id,
|
|
14162
14162
|
frameType,
|
|
14163
14163
|
});
|
|
@@ -14169,13 +14169,13 @@ class FameNode extends TaskSpawner {
|
|
|
14169
14169
|
}
|
|
14170
14170
|
await this._deliveryTracker.onEnvelopeDelivered(SYSTEM_INBOX$1, envelope, context);
|
|
14171
14171
|
if (frame.ok !== false) {
|
|
14172
|
-
logger$
|
|
14172
|
+
logger$15.debug('delivery_ack_received', {
|
|
14173
14173
|
envelopeId: envelope.id,
|
|
14174
14174
|
corrId: envelope.corrId ?? null,
|
|
14175
14175
|
});
|
|
14176
14176
|
return;
|
|
14177
14177
|
}
|
|
14178
|
-
logger$
|
|
14178
|
+
logger$15.warning('delivery_nack_received', {
|
|
14179
14179
|
envelopeId: envelope.id,
|
|
14180
14180
|
corrId: envelope.corrId ?? null,
|
|
14181
14181
|
code: frame.code ?? null,
|
|
@@ -14185,7 +14185,7 @@ class FameNode extends TaskSpawner {
|
|
|
14185
14185
|
await this.onDeliveryNack(frame, envelope, context);
|
|
14186
14186
|
}
|
|
14187
14187
|
async onDeliveryNack(frame, envelope, _context) {
|
|
14188
|
-
logger$
|
|
14188
|
+
logger$15.debug('delivery_nack_processed', {
|
|
14189
14189
|
envelopeId: envelope.id,
|
|
14190
14190
|
code: frame.code ?? null,
|
|
14191
14191
|
reason: frame.reason ?? null,
|
|
@@ -14300,7 +14300,7 @@ class FameNode extends TaskSpawner {
|
|
|
14300
14300
|
await this._bindingManager.restore();
|
|
14301
14301
|
await this._envelopeListenerManager.start();
|
|
14302
14302
|
this._isStarted = true;
|
|
14303
|
-
logger$
|
|
14303
|
+
logger$15.debug('node_started', {
|
|
14304
14304
|
node_id: this.id,
|
|
14305
14305
|
sid: this.sid,
|
|
14306
14306
|
path: this.physicalPath,
|
|
@@ -14332,7 +14332,7 @@ class FameNode extends TaskSpawner {
|
|
|
14332
14332
|
await this._serviceManager.stop();
|
|
14333
14333
|
await this.dispatchEvent('onNodeStopped', this);
|
|
14334
14334
|
this._isStarted = false;
|
|
14335
|
-
logger$
|
|
14335
|
+
logger$15.debug('node_stopped', {
|
|
14336
14336
|
node_id: this.id,
|
|
14337
14337
|
});
|
|
14338
14338
|
}
|
|
@@ -14522,20 +14522,20 @@ class FameNode extends TaskSpawner {
|
|
|
14522
14522
|
await this.forwardUpstream(processedEnvelope, context);
|
|
14523
14523
|
}
|
|
14524
14524
|
else {
|
|
14525
|
-
logger$
|
|
14525
|
+
logger$15.error('attempted_upstream_loop', {
|
|
14526
14526
|
envelopeId: processedEnvelope.id,
|
|
14527
14527
|
});
|
|
14528
14528
|
}
|
|
14529
14529
|
return;
|
|
14530
14530
|
}
|
|
14531
14531
|
if (!processedEnvelope.to) {
|
|
14532
|
-
logger$
|
|
14532
|
+
logger$15.error('dropping_envelope_without_destination', {
|
|
14533
14533
|
envelopeId: processedEnvelope.id,
|
|
14534
14534
|
capabilities: processedEnvelope.capabilities ?? [],
|
|
14535
14535
|
});
|
|
14536
14536
|
return;
|
|
14537
14537
|
}
|
|
14538
|
-
logger$
|
|
14538
|
+
logger$15.warning('no_local_handler_for_address', {
|
|
14539
14539
|
address: processedEnvelope.to.toString?.() ?? String(processedEnvelope.to),
|
|
14540
14540
|
originType: context?.originType ?? null,
|
|
14541
14541
|
});
|
|
@@ -14659,7 +14659,7 @@ class FameNode extends TaskSpawner {
|
|
|
14659
14659
|
}
|
|
14660
14660
|
}
|
|
14661
14661
|
catch (error) {
|
|
14662
|
-
logger$
|
|
14662
|
+
logger$15.warning('callback_grant_collection_failed', {
|
|
14663
14663
|
error: error instanceof Error ? error.message : String(error),
|
|
14664
14664
|
});
|
|
14665
14665
|
}
|
|
@@ -14722,7 +14722,7 @@ class FameNode extends TaskSpawner {
|
|
|
14722
14722
|
await store.set('self', record);
|
|
14723
14723
|
}
|
|
14724
14724
|
catch (error) {
|
|
14725
|
-
logger$
|
|
14725
|
+
logger$15.warning('node_meta_persist_failed', {
|
|
14726
14726
|
error: error instanceof Error ? error.message : String(error),
|
|
14727
14727
|
});
|
|
14728
14728
|
}
|
|
@@ -14860,44 +14860,12 @@ class ConnectionRetryPolicyFactory extends factory.AbstractResourceFactory {
|
|
|
14860
14860
|
}
|
|
14861
14861
|
}
|
|
14862
14862
|
|
|
14863
|
-
|
|
14864
|
-
|
|
14865
|
-
|
|
14866
|
-
|
|
14867
|
-
|
|
14868
|
-
|
|
14869
|
-
throw new Error('Failed to create token provider from configuration');
|
|
14870
|
-
}
|
|
14871
|
-
return provider;
|
|
14872
|
-
}
|
|
14873
|
-
let provider = null;
|
|
14874
|
-
try {
|
|
14875
|
-
provider = await factory.createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
14876
|
-
}
|
|
14877
|
-
catch (error) {
|
|
14878
|
-
const message = 'Failed to create default token provider' +
|
|
14879
|
-
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
14880
|
-
throw new Error(message);
|
|
14881
|
-
}
|
|
14882
|
-
if (!provider) {
|
|
14883
|
-
throw new Error('Failed to create default token provider');
|
|
14884
|
-
}
|
|
14885
|
-
return provider;
|
|
14886
|
-
}
|
|
14887
|
-
}
|
|
14888
|
-
|
|
14889
|
-
function isTokenProvider(candidate) {
|
|
14890
|
-
return (typeof candidate === 'object' &&
|
|
14891
|
-
candidate !== null &&
|
|
14892
|
-
typeof candidate.getToken === 'function');
|
|
14893
|
-
}
|
|
14894
|
-
function isIdentityExposingTokenProvider(candidate) {
|
|
14895
|
-
return (isTokenProvider(candidate) &&
|
|
14896
|
-
typeof candidate.getIdentity ===
|
|
14897
|
-
'function');
|
|
14898
|
-
}
|
|
14899
|
-
|
|
14900
|
-
const logger$15 = getLogger('naylence.fame.node.default_node_identity_policy');
|
|
14863
|
+
/**
|
|
14864
|
+
* Default node identity policy that preserves the current node ID.
|
|
14865
|
+
*
|
|
14866
|
+
* This policy does NOT derive identity from tokens or grants.
|
|
14867
|
+
* For token-subject-based identity, use TokenSubjectNodeIdentityPolicy.
|
|
14868
|
+
*/
|
|
14901
14869
|
class DefaultNodeIdentityPolicy {
|
|
14902
14870
|
async resolveInitialNodeId(context) {
|
|
14903
14871
|
if (context.configuredId) {
|
|
@@ -14909,44 +14877,10 @@ class DefaultNodeIdentityPolicy {
|
|
|
14909
14877
|
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
14910
14878
|
}
|
|
14911
14879
|
async resolveAdmissionNodeId(context) {
|
|
14912
|
-
|
|
14913
|
-
|
|
14914
|
-
for (const grant of context.grants) {
|
|
14915
|
-
try {
|
|
14916
|
-
const auth = grant.auth;
|
|
14917
|
-
if (!auth) {
|
|
14918
|
-
continue;
|
|
14919
|
-
}
|
|
14920
|
-
const tokenProviderConfig = (auth.tokenProvider ??
|
|
14921
|
-
auth.token_provider);
|
|
14922
|
-
if (!tokenProviderConfig ||
|
|
14923
|
-
typeof tokenProviderConfig.type !== 'string') {
|
|
14924
|
-
continue;
|
|
14925
|
-
}
|
|
14926
|
-
const provider = await TokenProviderFactory.createTokenProvider(tokenProviderConfig);
|
|
14927
|
-
if (isIdentityExposingTokenProvider(provider)) {
|
|
14928
|
-
const identity = await provider.getIdentity();
|
|
14929
|
-
if (identity && identity.subject) {
|
|
14930
|
-
logger$15.debug('identity_extracted_from_grant', {
|
|
14931
|
-
identity_id: identity.subject,
|
|
14932
|
-
grant_type: grant.type,
|
|
14933
|
-
});
|
|
14934
|
-
return identity.subject;
|
|
14935
|
-
}
|
|
14936
|
-
}
|
|
14937
|
-
}
|
|
14938
|
-
catch (error) {
|
|
14939
|
-
logger$15.warning('identity_extraction_failed', {
|
|
14940
|
-
error: error instanceof Error ? error.message : String(error),
|
|
14941
|
-
grant_type: grant.type,
|
|
14942
|
-
});
|
|
14943
|
-
}
|
|
14944
|
-
}
|
|
14945
|
-
}
|
|
14946
|
-
if (!context.currentNodeId) {
|
|
14947
|
-
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
14880
|
+
if (context.currentNodeId) {
|
|
14881
|
+
return context.currentNodeId;
|
|
14948
14882
|
}
|
|
14949
|
-
return
|
|
14883
|
+
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
14950
14884
|
}
|
|
14951
14885
|
}
|
|
14952
14886
|
|
|
@@ -17718,6 +17652,43 @@ var defaultNodeIdentityPolicyFactory = /*#__PURE__*/Object.freeze({
|
|
|
17718
17652
|
default: DefaultNodeIdentityPolicyFactory
|
|
17719
17653
|
});
|
|
17720
17654
|
|
|
17655
|
+
const TOKEN_PROVIDER_FACTORY_BASE_TYPE = 'TokenProviderFactory';
|
|
17656
|
+
class TokenProviderFactory extends factory.AbstractResourceFactory {
|
|
17657
|
+
static async createTokenProvider(config, options = {}) {
|
|
17658
|
+
if (config) {
|
|
17659
|
+
const provider = await factory.createResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, config, options);
|
|
17660
|
+
if (!provider) {
|
|
17661
|
+
throw new Error('Failed to create token provider from configuration');
|
|
17662
|
+
}
|
|
17663
|
+
return provider;
|
|
17664
|
+
}
|
|
17665
|
+
let provider = null;
|
|
17666
|
+
try {
|
|
17667
|
+
provider = await factory.createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
17668
|
+
}
|
|
17669
|
+
catch (error) {
|
|
17670
|
+
const message = 'Failed to create default token provider' +
|
|
17671
|
+
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
17672
|
+
throw new Error(message);
|
|
17673
|
+
}
|
|
17674
|
+
if (!provider) {
|
|
17675
|
+
throw new Error('Failed to create default token provider');
|
|
17676
|
+
}
|
|
17677
|
+
return provider;
|
|
17678
|
+
}
|
|
17679
|
+
}
|
|
17680
|
+
|
|
17681
|
+
function isTokenProvider(candidate) {
|
|
17682
|
+
return (typeof candidate === 'object' &&
|
|
17683
|
+
candidate !== null &&
|
|
17684
|
+
typeof candidate.getToken === 'function');
|
|
17685
|
+
}
|
|
17686
|
+
function isIdentityExposingTokenProvider(candidate) {
|
|
17687
|
+
return (isTokenProvider(candidate) &&
|
|
17688
|
+
typeof candidate.getIdentity ===
|
|
17689
|
+
'function');
|
|
17690
|
+
}
|
|
17691
|
+
|
|
17721
17692
|
const logger$10 = getLogger('naylence.fame.node.token_subject_node_identity_policy');
|
|
17722
17693
|
class TokenSubjectNodeIdentityPolicy {
|
|
17723
17694
|
async resolveInitialNodeId(context) {
|