@naylence/runtime 0.3.21 → 0.3.22
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$1l = 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$1l.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$1l.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$1l.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$1l.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$1l.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$1l.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$1l.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$1l.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$1l.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$1l.debug('shutdown_tasks_no_tasks_to_shutdown');
|
|
1038
1038
|
return;
|
|
1039
1039
|
}
|
|
1040
1040
|
this._suppressCompletionLogging = true;
|
|
1041
|
-
logger$
|
|
1041
|
+
logger$1l.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$1l.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$1l.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$1l.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$1k = 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$1k.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$1k.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$1k.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$1k.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$1k.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$1k.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$1k.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$1j = 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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1j.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$1i = 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$1i.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$1i.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$1i.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$1i.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$1i.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$1i.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$1i.debug('websocket_force_terminated', {
|
|
2976
2976
|
ready_state: socketAny.readyState,
|
|
2977
2977
|
});
|
|
2978
2978
|
}
|
|
2979
2979
|
catch (error) {
|
|
2980
|
-
logger$
|
|
2980
|
+
logger$1i.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$1i.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$1i.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$1h = 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$1h.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$1h.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$1h.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$1h.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$1h.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$1g = 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$1g.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$1g.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$1g);
|
|
3961
3961
|
}
|
|
3962
3962
|
}
|
|
3963
3963
|
|
|
@@ -4426,12 +4426,12 @@ async function ensureRuntimeFactoriesRegistered(registry = factory.Registry) {
|
|
|
4426
4426
|
}
|
|
4427
4427
|
|
|
4428
4428
|
// This file is auto-generated during build - do not edit manually
|
|
4429
|
-
// Generated from package.json version: 0.3.
|
|
4429
|
+
// Generated from package.json version: 0.3.22
|
|
4430
4430
|
/**
|
|
4431
4431
|
* The package version, injected at build time.
|
|
4432
4432
|
* @internal
|
|
4433
4433
|
*/
|
|
4434
|
-
const VERSION = '0.3.
|
|
4434
|
+
const VERSION = '0.3.22';
|
|
4435
4435
|
|
|
4436
4436
|
let initialized = false;
|
|
4437
4437
|
const runtimePlugin = {
|
|
@@ -5638,7 +5638,7 @@ async function withLock(lock, operation) {
|
|
|
5638
5638
|
return await lock.runExclusive(operation);
|
|
5639
5639
|
}
|
|
5640
5640
|
|
|
5641
|
-
const logger$
|
|
5641
|
+
const logger$1f = getLogger('naylence.fame.storage.sqlite_storage_provider');
|
|
5642
5642
|
let cachedSqliteCtor;
|
|
5643
5643
|
async function loadSqliteConstructor() {
|
|
5644
5644
|
if (cachedSqliteCtor !== undefined) {
|
|
@@ -5662,7 +5662,7 @@ async function loadSqliteConstructor() {
|
|
|
5662
5662
|
}
|
|
5663
5663
|
catch (error) {
|
|
5664
5664
|
cachedSqliteCtor = null;
|
|
5665
|
-
logger$
|
|
5665
|
+
logger$1f.error('failed-to-load-better-sqlite3', {
|
|
5666
5666
|
error: error instanceof Error ? error.message : String(error),
|
|
5667
5667
|
});
|
|
5668
5668
|
throw new Error('Failed to load better-sqlite3. Install it to enable SQLite storage support.');
|
|
@@ -5697,7 +5697,7 @@ class SQLiteKeyValueStore {
|
|
|
5697
5697
|
}
|
|
5698
5698
|
catch (error) {
|
|
5699
5699
|
if (this.autoRecover && this.isCorruptionError(error)) {
|
|
5700
|
-
logger$
|
|
5700
|
+
logger$1f.warning('detected-corrupted-db', { path: this.dbPath });
|
|
5701
5701
|
await this.recoverCorruptedDb();
|
|
5702
5702
|
if (!this.db) {
|
|
5703
5703
|
throw new Error('Failed to recover SQLite database');
|
|
@@ -5752,7 +5752,7 @@ class SQLiteKeyValueStore {
|
|
|
5752
5752
|
await this.closeDatabase();
|
|
5753
5753
|
await this.quarantineCorruptedFiles();
|
|
5754
5754
|
await this.openDatabase();
|
|
5755
|
-
logger$
|
|
5755
|
+
logger$1f.warning('quarantined-corrupted-db', { path: this.dbPath });
|
|
5756
5756
|
}
|
|
5757
5757
|
async closeDatabase() {
|
|
5758
5758
|
if (this.db) {
|
|
@@ -5760,7 +5760,7 @@ class SQLiteKeyValueStore {
|
|
|
5760
5760
|
this.db.close();
|
|
5761
5761
|
}
|
|
5762
5762
|
catch (error) {
|
|
5763
|
-
logger$
|
|
5763
|
+
logger$1f.warning('failed-to-close-sqlite-db', {
|
|
5764
5764
|
path: this.dbPath,
|
|
5765
5765
|
error: error instanceof Error ? error.message : String(error),
|
|
5766
5766
|
});
|
|
@@ -5783,7 +5783,7 @@ class SQLiteKeyValueStore {
|
|
|
5783
5783
|
await fsPromises.rename(candidate, quarantinedName);
|
|
5784
5784
|
}
|
|
5785
5785
|
catch (error) {
|
|
5786
|
-
logger$
|
|
5786
|
+
logger$1f.error('failed-to-quarantine-sqlite-file', {
|
|
5787
5787
|
file: candidate,
|
|
5788
5788
|
error: error instanceof Error ? error.message : String(error),
|
|
5789
5789
|
});
|
|
@@ -5884,7 +5884,7 @@ class SQLiteKeyValueStore {
|
|
|
5884
5884
|
result[row.key] = this.deserialize(row.value);
|
|
5885
5885
|
}
|
|
5886
5886
|
catch (error) {
|
|
5887
|
-
logger$
|
|
5887
|
+
logger$1f.warning('skipping-corrupted-sqlite-entry', {
|
|
5888
5888
|
key: row.key,
|
|
5889
5889
|
error: error instanceof Error ? error.message : String(error),
|
|
5890
5890
|
});
|
|
@@ -6879,7 +6879,7 @@ class InMemoryBinding {
|
|
|
6879
6879
|
* TypeScript port of Python's InMemoryFanoutBroker that extends TaskSpawner
|
|
6880
6880
|
* to manage multiple WriteChannel subscribers with concurrent message distribution.
|
|
6881
6881
|
*/
|
|
6882
|
-
const logger$
|
|
6882
|
+
const logger$1e = getLogger('naylence.fame.channel.in_memory.in_memory_fanout_broker');
|
|
6883
6883
|
// Sentinel object for shutdown signaling
|
|
6884
6884
|
const SENTINEL = Symbol('fanout-broker-sentinel');
|
|
6885
6885
|
function isCloseable(obj) {
|
|
@@ -6932,7 +6932,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6932
6932
|
}
|
|
6933
6933
|
catch (error) {
|
|
6934
6934
|
// Ignore errors when sending sentinel (sink might be closed)
|
|
6935
|
-
logger$
|
|
6935
|
+
logger$1e.debug('error_sending_sentinel', {
|
|
6936
6936
|
error: error.message,
|
|
6937
6937
|
});
|
|
6938
6938
|
}
|
|
@@ -6946,7 +6946,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6946
6946
|
await sub.close();
|
|
6947
6947
|
}
|
|
6948
6948
|
catch (error) {
|
|
6949
|
-
logger$
|
|
6949
|
+
logger$1e.error('error_closing_subscriber', {
|
|
6950
6950
|
subscriber: sub.toString(),
|
|
6951
6951
|
error: error.message,
|
|
6952
6952
|
});
|
|
@@ -6986,7 +6986,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6986
6986
|
[envelope, context] = core.extractEnvelopeAndContext(msg);
|
|
6987
6987
|
}
|
|
6988
6988
|
catch (error) {
|
|
6989
|
-
logger$
|
|
6989
|
+
logger$1e.debug('failed_to_extract_envelope', {
|
|
6990
6990
|
error: error.message,
|
|
6991
6991
|
});
|
|
6992
6992
|
continue;
|
|
@@ -7008,7 +7008,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7008
7008
|
await sub.send(messageToSend);
|
|
7009
7009
|
}
|
|
7010
7010
|
catch (error) {
|
|
7011
|
-
logger$
|
|
7011
|
+
logger$1e.error('error_sending_to_subscriber', {
|
|
7012
7012
|
subscriber: sub.toString(),
|
|
7013
7013
|
error: error.message,
|
|
7014
7014
|
action: 'unsubscribing',
|
|
@@ -7024,7 +7024,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7024
7024
|
}
|
|
7025
7025
|
catch (error) {
|
|
7026
7026
|
// Critical broker-level error: log and back off, but keep the loop running
|
|
7027
|
-
logger$
|
|
7027
|
+
logger$1e.critical('receive_loop_failed_unexpectedly', {
|
|
7028
7028
|
error: error.message,
|
|
7029
7029
|
stack: error.stack,
|
|
7030
7030
|
});
|
|
@@ -7733,7 +7733,7 @@ function normalizeResponseType(value) {
|
|
|
7733
7733
|
return value;
|
|
7734
7734
|
}
|
|
7735
7735
|
|
|
7736
|
-
const logger$
|
|
7736
|
+
const logger$1d = getLogger('naylence.fame.node.binding_manager');
|
|
7737
7737
|
const SYSTEM_INBOX$3 = '__sys__';
|
|
7738
7738
|
const DEFAULT_ACK_TIMEOUT_MS = 20000;
|
|
7739
7739
|
class BindingStoreEntryRecord {
|
|
@@ -7819,7 +7819,7 @@ class BindingManager {
|
|
|
7819
7819
|
if (!this.bindings.has(key)) {
|
|
7820
7820
|
const binding = this.bindingFactory(new core.FameAddress(key));
|
|
7821
7821
|
this.bindings.set(key, binding);
|
|
7822
|
-
logger$
|
|
7822
|
+
logger$1d.debug('restored_binding', { address: key });
|
|
7823
7823
|
}
|
|
7824
7824
|
}
|
|
7825
7825
|
if (!this.hasUpstream) {
|
|
@@ -7829,13 +7829,13 @@ class BindingManager {
|
|
|
7829
7829
|
await this.readvertiseCapabilitiesUpstream();
|
|
7830
7830
|
}
|
|
7831
7831
|
async bind(participant, capabilities) {
|
|
7832
|
-
logger$
|
|
7832
|
+
logger$1d.debug('binding_participant', { participant });
|
|
7833
7833
|
const { prefixAddress, addresses, propagateAddress, capabilityAddress } = this.computeBindingAddresses(participant);
|
|
7834
7834
|
for (const address of addresses) {
|
|
7835
7835
|
if (!this.bindings.has(address)) {
|
|
7836
7836
|
const binding = this.bindingFactory(new core.FameAddress(address));
|
|
7837
7837
|
this.bindings.set(address, binding);
|
|
7838
|
-
logger$
|
|
7838
|
+
logger$1d.debug('bound_address', { address, participant });
|
|
7839
7839
|
}
|
|
7840
7840
|
}
|
|
7841
7841
|
let propagatedAddress = null;
|
|
@@ -7864,7 +7864,7 @@ class BindingManager {
|
|
|
7864
7864
|
await this.unbindAddressUpstream(propagatedAddress);
|
|
7865
7865
|
}
|
|
7866
7866
|
catch (rollbackError) {
|
|
7867
|
-
logger$
|
|
7867
|
+
logger$1d.error('bind_rollback_failed', {
|
|
7868
7868
|
address: propagatedAddress.toString(),
|
|
7869
7869
|
error: rollbackError.message,
|
|
7870
7870
|
});
|
|
@@ -7883,7 +7883,7 @@ class BindingManager {
|
|
|
7883
7883
|
physicalPath: null,
|
|
7884
7884
|
});
|
|
7885
7885
|
}
|
|
7886
|
-
logger$
|
|
7886
|
+
logger$1d.debug('bind_success', {
|
|
7887
7887
|
participant,
|
|
7888
7888
|
address: prefixAddress.toString(),
|
|
7889
7889
|
capabilities,
|
|
@@ -7919,7 +7919,7 @@ class BindingManager {
|
|
|
7919
7919
|
await this.bindingStore.delete(address);
|
|
7920
7920
|
}
|
|
7921
7921
|
}
|
|
7922
|
-
logger$
|
|
7922
|
+
logger$1d.debug('unbind_success', {
|
|
7923
7923
|
participant,
|
|
7924
7924
|
address: prefixAddress.toString(),
|
|
7925
7925
|
totalBindings: this.bindings.size,
|
|
@@ -7949,7 +7949,7 @@ class BindingManager {
|
|
|
7949
7949
|
await this.bindAddressUpstream(new core.FameAddress(address));
|
|
7950
7950
|
}
|
|
7951
7951
|
catch (error) {
|
|
7952
|
-
logger$
|
|
7952
|
+
logger$1d.error('rebind_failed', {
|
|
7953
7953
|
address,
|
|
7954
7954
|
error: error.message,
|
|
7955
7955
|
});
|
|
@@ -7968,7 +7968,7 @@ class BindingManager {
|
|
|
7968
7968
|
await this.advertiseCapabilities(new core.FameAddress(address), Array.from(capabilities));
|
|
7969
7969
|
}
|
|
7970
7970
|
catch (error) {
|
|
7971
|
-
logger$
|
|
7971
|
+
logger$1d.error('capability_replay_failed', {
|
|
7972
7972
|
address,
|
|
7973
7973
|
error: error.message,
|
|
7974
7974
|
});
|
|
@@ -8235,7 +8235,7 @@ class BindingManager {
|
|
|
8235
8235
|
}
|
|
8236
8236
|
}
|
|
8237
8237
|
|
|
8238
|
-
const logger$
|
|
8238
|
+
const logger$1c = getLogger('naylence.fame.node.response_context_manager');
|
|
8239
8239
|
function cloneSecurityContext(source) {
|
|
8240
8240
|
if (!source) {
|
|
8241
8241
|
return undefined;
|
|
@@ -8263,7 +8263,7 @@ class ResponseContextManager {
|
|
|
8263
8263
|
security: responseSecurity,
|
|
8264
8264
|
expectedResponseType: core.FameResponseType.NONE,
|
|
8265
8265
|
};
|
|
8266
|
-
logger$
|
|
8266
|
+
logger$1c.debug('created_response_context', {
|
|
8267
8267
|
request_id: requestEnvelope.id,
|
|
8268
8268
|
inherited_crypto_level: responseSecurity?.inboundCryptoLevel ?? null,
|
|
8269
8269
|
channel_id: responseSecurity?.cryptoChannelId ?? null,
|
|
@@ -8283,14 +8283,14 @@ class ResponseContextManager {
|
|
|
8283
8283
|
responseContext.fromSystemId = this.getId();
|
|
8284
8284
|
}
|
|
8285
8285
|
// Envelope-level metadata is intentionally omitted to defer to context usage.
|
|
8286
|
-
logger$
|
|
8286
|
+
logger$1c.debug('ensured_response_metadata', {
|
|
8287
8287
|
response_id: responseEnvelope.id,
|
|
8288
8288
|
request_id: requestEnvelope.id,
|
|
8289
8289
|
});
|
|
8290
8290
|
}
|
|
8291
8291
|
}
|
|
8292
8292
|
|
|
8293
|
-
const logger$
|
|
8293
|
+
const logger$1b = getLogger('naylence.fame.node.streaming_response_handler');
|
|
8294
8294
|
function isObject(value) {
|
|
8295
8295
|
return typeof value === 'object' && value !== null;
|
|
8296
8296
|
}
|
|
@@ -8409,12 +8409,12 @@ class StreamingResponseHandler {
|
|
|
8409
8409
|
}
|
|
8410
8410
|
async handleStreamingFameMessageResponses(responses, requestEnvelope, requestContext) {
|
|
8411
8411
|
const asyncResponses = toAsyncIterable(responses);
|
|
8412
|
-
logger$
|
|
8412
|
+
logger$1b.debug('handling_streaming_fame_message_responses', {
|
|
8413
8413
|
request_id: requestEnvelope.id,
|
|
8414
8414
|
});
|
|
8415
8415
|
for await (const response of asyncResponses) {
|
|
8416
8416
|
if (!response?.envelope) {
|
|
8417
|
-
logger$
|
|
8417
|
+
logger$1b.warning('invalid_streaming_response_type', {
|
|
8418
8418
|
request_id: requestEnvelope.id,
|
|
8419
8419
|
actual_type: typeof response,
|
|
8420
8420
|
});
|
|
@@ -8428,7 +8428,7 @@ class StreamingResponseHandler {
|
|
|
8428
8428
|
}
|
|
8429
8429
|
async handleStreamingResponse(result, requestEnvelope, requestContext, replyTo, requestId) {
|
|
8430
8430
|
const iterable = toAsyncIterable(result);
|
|
8431
|
-
logger$
|
|
8431
|
+
logger$1b.debug('handling_streaming_response', {
|
|
8432
8432
|
request_id: requestId,
|
|
8433
8433
|
reply_to: replyTo,
|
|
8434
8434
|
});
|
|
@@ -8439,7 +8439,7 @@ class StreamingResponseHandler {
|
|
|
8439
8439
|
await this.sendRpcResponse(null, requestEnvelope, requestContext, replyTo, requestId);
|
|
8440
8440
|
}
|
|
8441
8441
|
catch (error) {
|
|
8442
|
-
logger$
|
|
8442
|
+
logger$1b.error('streaming_response_handler_error', {
|
|
8443
8443
|
request_id: requestId,
|
|
8444
8444
|
error: error instanceof Error ? error.message : String(error),
|
|
8445
8445
|
});
|
|
@@ -8466,7 +8466,7 @@ class StreamingResponseHandler {
|
|
|
8466
8466
|
});
|
|
8467
8467
|
const responseContext = this.responseContextManager.createResponseContext(requestEnvelope, requestContext);
|
|
8468
8468
|
this.responseContextManager.ensureResponseMetadata(responseEnvelope, requestEnvelope, responseContext);
|
|
8469
|
-
logger$
|
|
8469
|
+
logger$1b.debug('sending_streaming_rpc_response', {
|
|
8470
8470
|
request_id: requestId,
|
|
8471
8471
|
response_envelope_id: responseEnvelope.id,
|
|
8472
8472
|
reply_to: replyTo,
|
|
@@ -8479,7 +8479,7 @@ class StreamingResponseHandler {
|
|
|
8479
8479
|
}
|
|
8480
8480
|
}
|
|
8481
8481
|
|
|
8482
|
-
const logger$
|
|
8482
|
+
const logger$1a = getLogger('naylence.fame.node.channel_polling_manager');
|
|
8483
8483
|
class ChannelPollingManager {
|
|
8484
8484
|
constructor(deliverWrapper, responseContextManager, streamingResponseHandler) {
|
|
8485
8485
|
this.deliverWrapper = deliverWrapper;
|
|
@@ -8487,7 +8487,7 @@ class ChannelPollingManager {
|
|
|
8487
8487
|
this.streamingResponseHandler = streamingResponseHandler;
|
|
8488
8488
|
}
|
|
8489
8489
|
async startPollingLoop(serviceName, channel, handler, stopState, pollTimeoutMs = core.DEFAULT_POLLING_TIMEOUT_MS) {
|
|
8490
|
-
logger$
|
|
8490
|
+
logger$1a.debug('poll_loop_started', {
|
|
8491
8491
|
recipient: serviceName,
|
|
8492
8492
|
});
|
|
8493
8493
|
try {
|
|
@@ -8495,7 +8495,7 @@ class ChannelPollingManager {
|
|
|
8495
8495
|
while (true) {
|
|
8496
8496
|
if (this.isStopRequested(stopState) && !draining) {
|
|
8497
8497
|
draining = true;
|
|
8498
|
-
logger$
|
|
8498
|
+
logger$1a.debug('poll_loop_draining_pending_messages', {
|
|
8499
8499
|
recipient: serviceName,
|
|
8500
8500
|
});
|
|
8501
8501
|
}
|
|
@@ -8505,7 +8505,7 @@ class ChannelPollingManager {
|
|
|
8505
8505
|
}
|
|
8506
8506
|
catch (error) {
|
|
8507
8507
|
if (error instanceof FameTransportClose) {
|
|
8508
|
-
logger$
|
|
8508
|
+
logger$1a.debug('channel_closed', {
|
|
8509
8509
|
recipient: serviceName,
|
|
8510
8510
|
message: error.message,
|
|
8511
8511
|
});
|
|
@@ -8518,7 +8518,7 @@ class ChannelPollingManager {
|
|
|
8518
8518
|
continue;
|
|
8519
8519
|
}
|
|
8520
8520
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
8521
|
-
logger$
|
|
8521
|
+
logger$1a.debug('listener_cancelled', {
|
|
8522
8522
|
recipient: serviceName,
|
|
8523
8523
|
});
|
|
8524
8524
|
throw error;
|
|
@@ -8530,13 +8530,13 @@ class ChannelPollingManager {
|
|
|
8530
8530
|
continue;
|
|
8531
8531
|
}
|
|
8532
8532
|
if (error instanceof Error && error.message === 'Channel is closed') {
|
|
8533
|
-
logger$
|
|
8533
|
+
logger$1a.debug('channel_closed', {
|
|
8534
8534
|
recipient: serviceName,
|
|
8535
8535
|
});
|
|
8536
8536
|
break;
|
|
8537
8537
|
}
|
|
8538
8538
|
if (error instanceof Error && error.name === 'TaskCancelledError') {
|
|
8539
|
-
logger$
|
|
8539
|
+
logger$1a.debug('listener_cancelled', {
|
|
8540
8540
|
recipient: serviceName,
|
|
8541
8541
|
});
|
|
8542
8542
|
throw error;
|
|
@@ -8548,12 +8548,12 @@ class ChannelPollingManager {
|
|
|
8548
8548
|
continue;
|
|
8549
8549
|
}
|
|
8550
8550
|
if (error instanceof Error && error.message.includes('closed')) {
|
|
8551
|
-
logger$
|
|
8551
|
+
logger$1a.debug('channel_closed', {
|
|
8552
8552
|
recipient: serviceName,
|
|
8553
8553
|
});
|
|
8554
8554
|
break;
|
|
8555
8555
|
}
|
|
8556
|
-
logger$
|
|
8556
|
+
logger$1a.error('transport_error', {
|
|
8557
8557
|
recipient: serviceName,
|
|
8558
8558
|
error: error instanceof Error ? error.message : String(error),
|
|
8559
8559
|
});
|
|
@@ -8569,7 +8569,7 @@ class ChannelPollingManager {
|
|
|
8569
8569
|
}
|
|
8570
8570
|
}
|
|
8571
8571
|
finally {
|
|
8572
|
-
logger$
|
|
8572
|
+
logger$1a.debug('poll_loop_exiting', {
|
|
8573
8573
|
recipient: serviceName,
|
|
8574
8574
|
});
|
|
8575
8575
|
}
|
|
@@ -8582,7 +8582,7 @@ class ChannelPollingManager {
|
|
|
8582
8582
|
await this.processHandlerResult(result, envelope, deliveryContext, serviceName);
|
|
8583
8583
|
}
|
|
8584
8584
|
catch (error) {
|
|
8585
|
-
logger$
|
|
8585
|
+
logger$1a.error('handler_crashed', {
|
|
8586
8586
|
recipient: serviceName,
|
|
8587
8587
|
error: error instanceof Error ? error.message : String(error),
|
|
8588
8588
|
});
|
|
@@ -8596,7 +8596,7 @@ class ChannelPollingManager {
|
|
|
8596
8596
|
return;
|
|
8597
8597
|
}
|
|
8598
8598
|
if (this.streamingResponseHandler.isStreamingFameMessageResponse(result)) {
|
|
8599
|
-
logger$
|
|
8599
|
+
logger$1a.debug('handling_streaming_fame_message_responses', {
|
|
8600
8600
|
service_name: serviceName,
|
|
8601
8601
|
envelope_id: envelope.id,
|
|
8602
8602
|
});
|
|
@@ -8604,7 +8604,7 @@ class ChannelPollingManager {
|
|
|
8604
8604
|
}
|
|
8605
8605
|
}
|
|
8606
8606
|
async handleMessageResponse(response, requestEnvelope, requestContext, serviceName) {
|
|
8607
|
-
logger$
|
|
8607
|
+
logger$1a.debug('delivering_envelope_response_message', {
|
|
8608
8608
|
service_name: serviceName,
|
|
8609
8609
|
response_envelope_id: response.envelope.id,
|
|
8610
8610
|
});
|
|
@@ -8624,7 +8624,7 @@ class ChannelPollingManager {
|
|
|
8624
8624
|
}
|
|
8625
8625
|
}
|
|
8626
8626
|
|
|
8627
|
-
const logger$
|
|
8627
|
+
const logger$19 = getLogger('naylence.fame.node.rpc_server_handler');
|
|
8628
8628
|
function isPlainRecord$6(value) {
|
|
8629
8629
|
if (typeof value !== 'object' || value === null) {
|
|
8630
8630
|
return false;
|
|
@@ -8668,13 +8668,13 @@ class RPCServerHandler {
|
|
|
8668
8668
|
}
|
|
8669
8669
|
async handleRpcRequest(envelope, handlerContext, handler, serviceName) {
|
|
8670
8670
|
if (!this.isDataFrame(envelope.frame)) {
|
|
8671
|
-
logger$
|
|
8671
|
+
logger$19.warning('rpc_request_missing_data_frame', {
|
|
8672
8672
|
service_name: serviceName,
|
|
8673
8673
|
envelope_id: envelope.id,
|
|
8674
8674
|
});
|
|
8675
8675
|
return;
|
|
8676
8676
|
}
|
|
8677
|
-
logger$
|
|
8677
|
+
logger$19.debug('rpc_request_received', {
|
|
8678
8678
|
service_name: serviceName,
|
|
8679
8679
|
envelope_id: envelope.id,
|
|
8680
8680
|
trace_id: envelope.traceId,
|
|
@@ -8686,7 +8686,7 @@ class RPCServerHandler {
|
|
|
8686
8686
|
request = core.parseRequest(envelope.frame.payload);
|
|
8687
8687
|
params = cloneParams(request.params);
|
|
8688
8688
|
const paramKeys = Object.keys(params);
|
|
8689
|
-
logger$
|
|
8689
|
+
logger$19.debug('parsed_rpc_request', {
|
|
8690
8690
|
service_name: serviceName,
|
|
8691
8691
|
method: request.method,
|
|
8692
8692
|
request_id: request.id,
|
|
@@ -8695,7 +8695,7 @@ class RPCServerHandler {
|
|
|
8695
8695
|
});
|
|
8696
8696
|
}
|
|
8697
8697
|
catch (error) {
|
|
8698
|
-
logger$
|
|
8698
|
+
logger$19.warning('request_decode_error', {
|
|
8699
8699
|
service_name: serviceName,
|
|
8700
8700
|
envelope_id: envelope.id,
|
|
8701
8701
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -8703,7 +8703,7 @@ class RPCServerHandler {
|
|
|
8703
8703
|
return;
|
|
8704
8704
|
}
|
|
8705
8705
|
if (request.id == null) {
|
|
8706
|
-
logger$
|
|
8706
|
+
logger$19.warning('request_missing_id', {
|
|
8707
8707
|
service_name: serviceName,
|
|
8708
8708
|
envelope_id: envelope.id,
|
|
8709
8709
|
});
|
|
@@ -8711,7 +8711,7 @@ class RPCServerHandler {
|
|
|
8711
8711
|
}
|
|
8712
8712
|
const replyTo = this.resolveReplyTo(envelope, params);
|
|
8713
8713
|
if (!replyTo) {
|
|
8714
|
-
logger$
|
|
8714
|
+
logger$19.warning('missing_reply_to', {
|
|
8715
8715
|
service_name: serviceName,
|
|
8716
8716
|
envelope_id: envelope.id,
|
|
8717
8717
|
request_id: request.id,
|
|
@@ -8720,13 +8720,13 @@ class RPCServerHandler {
|
|
|
8720
8720
|
}
|
|
8721
8721
|
let handlerResult;
|
|
8722
8722
|
try {
|
|
8723
|
-
logger$
|
|
8723
|
+
logger$19.debug('calling_rpc_handler', {
|
|
8724
8724
|
service_name: serviceName,
|
|
8725
8725
|
method: request.method,
|
|
8726
8726
|
request_id: request.id,
|
|
8727
8727
|
});
|
|
8728
8728
|
handlerResult = await handler(request.method, params);
|
|
8729
|
-
logger$
|
|
8729
|
+
logger$19.debug('rpc_handler_returned', {
|
|
8730
8730
|
service_name: serviceName,
|
|
8731
8731
|
method: request.method,
|
|
8732
8732
|
request_id: request.id,
|
|
@@ -8735,7 +8735,7 @@ class RPCServerHandler {
|
|
|
8735
8735
|
});
|
|
8736
8736
|
}
|
|
8737
8737
|
catch (error) {
|
|
8738
|
-
logger$
|
|
8738
|
+
logger$19.error('rpc_handler_error', {
|
|
8739
8739
|
service_name: serviceName,
|
|
8740
8740
|
request_id: request.id,
|
|
8741
8741
|
envelope_id: envelope.id,
|
|
@@ -8745,7 +8745,7 @@ class RPCServerHandler {
|
|
|
8745
8745
|
return this.createTraditionalResponse(response, request.id, envelope, replyTo, handlerContext, serviceName);
|
|
8746
8746
|
}
|
|
8747
8747
|
if (core.isFameMessageResponse(handlerResult)) {
|
|
8748
|
-
logger$
|
|
8748
|
+
logger$19.debug('returning_response_message', {
|
|
8749
8749
|
service_name: serviceName,
|
|
8750
8750
|
request_id: request.id,
|
|
8751
8751
|
response_envelope_id: handlerResult.envelope.id,
|
|
@@ -8753,7 +8753,7 @@ class RPCServerHandler {
|
|
|
8753
8753
|
return handlerResult;
|
|
8754
8754
|
}
|
|
8755
8755
|
if (this.streamingResponseHandler.isStreamingResult(handlerResult)) {
|
|
8756
|
-
logger$
|
|
8756
|
+
logger$19.debug('handling_streaming_response', {
|
|
8757
8757
|
service_name: serviceName,
|
|
8758
8758
|
request_id: request.id,
|
|
8759
8759
|
envelope_id: envelope.id,
|
|
@@ -8782,7 +8782,7 @@ class RPCServerHandler {
|
|
|
8782
8782
|
return null;
|
|
8783
8783
|
}
|
|
8784
8784
|
async createTraditionalResponse(payload, requestId, requestEnvelope, replyTo, handlerContext, serviceName) {
|
|
8785
|
-
logger$
|
|
8785
|
+
logger$19.debug('creating_traditional_response_envelope', {
|
|
8786
8786
|
service_name: serviceName,
|
|
8787
8787
|
request_id: requestId,
|
|
8788
8788
|
envelope_id: requestEnvelope.id,
|
|
@@ -8806,7 +8806,7 @@ class RPCServerHandler {
|
|
|
8806
8806
|
if (requestEnvelope.id) {
|
|
8807
8807
|
responseContext.meta['response-to-id'] = requestEnvelope.id;
|
|
8808
8808
|
}
|
|
8809
|
-
logger$
|
|
8809
|
+
logger$19.debug('returning_traditional_response', {
|
|
8810
8810
|
service_name: serviceName,
|
|
8811
8811
|
request_id: requestId,
|
|
8812
8812
|
envelope_id: requestEnvelope.id,
|
|
@@ -8871,7 +8871,7 @@ function normalizeErrorCode(code) {
|
|
|
8871
8871
|
return code;
|
|
8872
8872
|
}
|
|
8873
8873
|
|
|
8874
|
-
const logger$
|
|
8874
|
+
const logger$18 = getLogger('naylence.fame.node.rpc_client_manager');
|
|
8875
8875
|
function isPlainRecord$5(value) {
|
|
8876
8876
|
if (typeof value !== 'object' || value === null) {
|
|
8877
8877
|
return false;
|
|
@@ -9088,7 +9088,7 @@ class RPCClientManager {
|
|
|
9088
9088
|
const metaReason = tracked.meta?.['nack_reason'];
|
|
9089
9089
|
const formattedMessage = formatDeliveryErrorMessage(typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR', reason ??
|
|
9090
9090
|
(typeof metaReason === 'string' ? metaReason : undefined));
|
|
9091
|
-
logger$
|
|
9091
|
+
logger$18.debug('pending_request_rejected_by_delivery_nack', {
|
|
9092
9092
|
envelope_id: envelopeId,
|
|
9093
9093
|
request_id: requestId,
|
|
9094
9094
|
code: typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR',
|
|
@@ -9111,7 +9111,7 @@ class RPCClientManager {
|
|
|
9111
9111
|
this.trackerWithEvents.removeEventHandler?.(this.trackerEventHandler);
|
|
9112
9112
|
}
|
|
9113
9113
|
catch (error) {
|
|
9114
|
-
logger$
|
|
9114
|
+
logger$18.debug('rpc_tracker_handler_remove_failed', {
|
|
9115
9115
|
error: error instanceof Error ? error.message : String(error),
|
|
9116
9116
|
});
|
|
9117
9117
|
}
|
|
@@ -9154,7 +9154,7 @@ class RPCClientManager {
|
|
|
9154
9154
|
this.rpcListenerAddress = await this.listenCallback(recipient, handler);
|
|
9155
9155
|
this.rpcBound = true;
|
|
9156
9156
|
this.boundPhysicalPath = currentPhysicalPath;
|
|
9157
|
-
logger$
|
|
9157
|
+
logger$18.debug('rpc_reply_listener_bound', {
|
|
9158
9158
|
reply_recipient: recipient,
|
|
9159
9159
|
reply_address: this.rpcReplyAddress?.toString(),
|
|
9160
9160
|
listener_address: this.rpcListenerAddress?.toString(),
|
|
@@ -9248,7 +9248,7 @@ class RPCClientManager {
|
|
|
9248
9248
|
const finalizePromise = this.notifyStreamClosed(envelopeId);
|
|
9249
9249
|
if (finalizePromise) {
|
|
9250
9250
|
finalizePromise.catch((notifyError) => {
|
|
9251
|
-
logger$
|
|
9251
|
+
logger$18.debug('stream_tracker_finalize_failed', {
|
|
9252
9252
|
request_id: requestId,
|
|
9253
9253
|
envelope_id: envelopeId,
|
|
9254
9254
|
error: notifyError instanceof Error
|
|
@@ -9309,7 +9309,7 @@ class RPCClientManager {
|
|
|
9309
9309
|
return iterator;
|
|
9310
9310
|
}
|
|
9311
9311
|
async sendRpcRequest(requestId, envelope, expectedResponseType, timeoutMs) {
|
|
9312
|
-
logger$
|
|
9312
|
+
logger$18.debug('sending_rpc_request', {
|
|
9313
9313
|
envp_id: envelope.id,
|
|
9314
9314
|
corr_id: envelope.corrId,
|
|
9315
9315
|
request_id: requestId,
|
|
@@ -9325,7 +9325,7 @@ class RPCClientManager {
|
|
|
9325
9325
|
}
|
|
9326
9326
|
}
|
|
9327
9327
|
catch (error) {
|
|
9328
|
-
logger$
|
|
9328
|
+
logger$18.warning('delivery_tracker_track_failed', {
|
|
9329
9329
|
request_id: requestId,
|
|
9330
9330
|
error: error instanceof Error ? error.message : String(error),
|
|
9331
9331
|
});
|
|
@@ -9338,14 +9338,14 @@ class RPCClientManager {
|
|
|
9338
9338
|
await this.deliverWrapper()(envelope, context);
|
|
9339
9339
|
}
|
|
9340
9340
|
async handleReplyEnvelope(envelope) {
|
|
9341
|
-
logger$
|
|
9341
|
+
logger$18.debug('handle_reply_envelope_received', {
|
|
9342
9342
|
envelope_id: envelope.id,
|
|
9343
9343
|
corr_id: envelope.corrId,
|
|
9344
9344
|
frame_type: envelope.frame?.['type'],
|
|
9345
9345
|
});
|
|
9346
9346
|
let requestId = envelope.corrId ?? envelope.id;
|
|
9347
9347
|
if (!requestId) {
|
|
9348
|
-
logger$
|
|
9348
|
+
logger$18.warning('reply_envelope_missing_corr_id', {
|
|
9349
9349
|
envelope_id: envelope.id,
|
|
9350
9350
|
});
|
|
9351
9351
|
return;
|
|
@@ -9363,12 +9363,12 @@ class RPCClientManager {
|
|
|
9363
9363
|
}
|
|
9364
9364
|
}
|
|
9365
9365
|
if (!entry) {
|
|
9366
|
-
logger$
|
|
9366
|
+
logger$18.debug('no_pending_request_for_reply', {
|
|
9367
9367
|
request_id: requestId,
|
|
9368
9368
|
});
|
|
9369
9369
|
return;
|
|
9370
9370
|
}
|
|
9371
|
-
logger$
|
|
9371
|
+
logger$18.debug('handle_reply_envelope', {
|
|
9372
9372
|
envelope_id: envelope.id,
|
|
9373
9373
|
request_id: requestId,
|
|
9374
9374
|
corr_id: envelope.corrId,
|
|
@@ -9381,7 +9381,7 @@ class RPCClientManager {
|
|
|
9381
9381
|
const ackIndicatesSuccess = frame.ok === true ||
|
|
9382
9382
|
(frame.ok === undefined && !frame.code && !frame.reason);
|
|
9383
9383
|
if (ackIndicatesSuccess) {
|
|
9384
|
-
logger$
|
|
9384
|
+
logger$18.debug('pending_request_delivery_acknowledged', {
|
|
9385
9385
|
request_id: requestId,
|
|
9386
9386
|
envelope_id: envelope.id,
|
|
9387
9387
|
ref_id: frame.refId ?? null,
|
|
@@ -9409,7 +9409,7 @@ class RPCClientManager {
|
|
|
9409
9409
|
entry.timer = null;
|
|
9410
9410
|
}
|
|
9411
9411
|
if (!this.isDataFrame(envelope.frame)) {
|
|
9412
|
-
logger$
|
|
9412
|
+
logger$18.warning('unexpected_reply_frame_type', {
|
|
9413
9413
|
request_id: requestId,
|
|
9414
9414
|
frame_type: envelope.frame?.['type'],
|
|
9415
9415
|
});
|
|
@@ -9475,7 +9475,7 @@ class RPCClientManager {
|
|
|
9475
9475
|
return;
|
|
9476
9476
|
}
|
|
9477
9477
|
Promise.resolve(this.deliveryTracker.onStreamItem(envelopeId, envelope)).catch((error) => {
|
|
9478
|
-
logger$
|
|
9478
|
+
logger$18.debug('stream_tracker_push_failed', {
|
|
9479
9479
|
envelope_id: envelopeId,
|
|
9480
9480
|
error: error instanceof Error ? error.message : String(error),
|
|
9481
9481
|
});
|
|
@@ -9590,7 +9590,7 @@ function normalizeMailbox(mailbox) {
|
|
|
9590
9590
|
return mailbox;
|
|
9591
9591
|
}
|
|
9592
9592
|
|
|
9593
|
-
const logger$
|
|
9593
|
+
const logger$17 = getLogger('naylence.fame.node.envelope_listener_manager');
|
|
9594
9594
|
const SYSTEM_INBOX$2 = '__sys__';
|
|
9595
9595
|
class EnvelopeListener {
|
|
9596
9596
|
constructor(stopFn, task) {
|
|
@@ -9598,7 +9598,7 @@ class EnvelopeListener {
|
|
|
9598
9598
|
this.task = task;
|
|
9599
9599
|
}
|
|
9600
9600
|
stop() {
|
|
9601
|
-
logger$
|
|
9601
|
+
logger$17.debug('stopping_listener', {
|
|
9602
9602
|
task_name: this.task.name,
|
|
9603
9603
|
});
|
|
9604
9604
|
try {
|
|
@@ -9606,7 +9606,7 @@ class EnvelopeListener {
|
|
|
9606
9606
|
if (maybeCleanup &&
|
|
9607
9607
|
typeof maybeCleanup.then === 'function') {
|
|
9608
9608
|
void maybeCleanup.catch((error) => {
|
|
9609
|
-
logger$
|
|
9609
|
+
logger$17.debug('listener_stop_cleanup_failed', {
|
|
9610
9610
|
task_name: this.task.name,
|
|
9611
9611
|
error: error instanceof Error ? error.message : String(error),
|
|
9612
9612
|
});
|
|
@@ -9614,7 +9614,7 @@ class EnvelopeListener {
|
|
|
9614
9614
|
}
|
|
9615
9615
|
}
|
|
9616
9616
|
catch (error) {
|
|
9617
|
-
logger$
|
|
9617
|
+
logger$17.debug('listener_stop_cleanup_failed', {
|
|
9618
9618
|
task_name: this.task.name,
|
|
9619
9619
|
error: error instanceof Error ? error.message : String(error),
|
|
9620
9620
|
});
|
|
@@ -9644,7 +9644,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9644
9644
|
envelope.replyTo = core.formatAddress(SYSTEM_INBOX$2, this.nodeLike.physicalPath);
|
|
9645
9645
|
}
|
|
9646
9646
|
catch (error) {
|
|
9647
|
-
logger$
|
|
9647
|
+
logger$17.warning('default_reply_to_assignment_failed', {
|
|
9648
9648
|
envelope_id: envelope.id,
|
|
9649
9649
|
service_name: envelope.capabilities?.[0] ?? null,
|
|
9650
9650
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -9669,7 +9669,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9669
9669
|
if (serviceName === SYSTEM_INBOX$2) {
|
|
9670
9670
|
continue;
|
|
9671
9671
|
}
|
|
9672
|
-
logger$
|
|
9672
|
+
logger$17.debug('stopping_listener_for_service', {
|
|
9673
9673
|
service_name: serviceName,
|
|
9674
9674
|
});
|
|
9675
9675
|
entry.listener.stop();
|
|
@@ -9679,7 +9679,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9679
9679
|
catch (error) {
|
|
9680
9680
|
if (!(error instanceof Error) ||
|
|
9681
9681
|
error.name !== 'TaskCancelledError') {
|
|
9682
|
-
logger$
|
|
9682
|
+
logger$17.debug('listener_task_stopped', {
|
|
9683
9683
|
service_name: serviceName,
|
|
9684
9684
|
error: error instanceof Error ? error.message : String(error),
|
|
9685
9685
|
});
|
|
@@ -9687,7 +9687,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9687
9687
|
}
|
|
9688
9688
|
}
|
|
9689
9689
|
if (systemEntry) {
|
|
9690
|
-
logger$
|
|
9690
|
+
logger$17.debug('stopping_listener_for_service', {
|
|
9691
9691
|
service_name: SYSTEM_INBOX$2,
|
|
9692
9692
|
});
|
|
9693
9693
|
systemEntry.listener.stop();
|
|
@@ -9697,7 +9697,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9697
9697
|
catch (error) {
|
|
9698
9698
|
if (!(error instanceof Error) ||
|
|
9699
9699
|
error.name !== 'TaskCancelledError') {
|
|
9700
|
-
logger$
|
|
9700
|
+
logger$17.debug('listener_task_stopped', {
|
|
9701
9701
|
service_name: SYSTEM_INBOX$2,
|
|
9702
9702
|
error: error instanceof Error ? error.message : String(error),
|
|
9703
9703
|
});
|
|
@@ -9714,13 +9714,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9714
9714
|
}
|
|
9715
9715
|
async recoverUnhandledInboundEnvelopes() {
|
|
9716
9716
|
if (typeof this.deliveryTracker.listInbound !== 'function') {
|
|
9717
|
-
logger$
|
|
9717
|
+
logger$17.debug('delivery_tracker_missing_inbound_listing');
|
|
9718
9718
|
return;
|
|
9719
9719
|
}
|
|
9720
9720
|
const failedInbound = await this.deliveryTracker.listInbound((env) => env.status === EnvelopeStatus.RECEIVED ||
|
|
9721
9721
|
env.status === EnvelopeStatus.FAILED_TO_HANDLE);
|
|
9722
9722
|
if (!failedInbound.length) {
|
|
9723
|
-
logger$
|
|
9723
|
+
logger$17.debug('no_failed_inbound_envelopes_to_recover');
|
|
9724
9724
|
return;
|
|
9725
9725
|
}
|
|
9726
9726
|
const grouped = new Map();
|
|
@@ -9737,7 +9737,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9737
9737
|
this.pendingRecoveryEnvelopes.set(serviceName, envelopes);
|
|
9738
9738
|
}
|
|
9739
9739
|
});
|
|
9740
|
-
logger$
|
|
9740
|
+
logger$17.debug('discovered_failed_inbound_envelopes', {
|
|
9741
9741
|
total: failedInbound.length,
|
|
9742
9742
|
services: Array.from(grouped.keys()),
|
|
9743
9743
|
});
|
|
@@ -9747,7 +9747,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9747
9747
|
const pollTimeoutMs = options.pollTimeoutMs ??
|
|
9748
9748
|
options.poll_timeout_ms ??
|
|
9749
9749
|
core.DEFAULT_POLLING_TIMEOUT_MS;
|
|
9750
|
-
logger$
|
|
9750
|
+
logger$17.debug('listen_start', {
|
|
9751
9751
|
recipient: serviceName,
|
|
9752
9752
|
poll_timeout_ms: pollTimeoutMs ?? core.DEFAULT_POLLING_TIMEOUT_MS,
|
|
9753
9753
|
});
|
|
@@ -9778,7 +9778,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9778
9778
|
tracked?.mailboxType === MailboxType.OUTBOX ||
|
|
9779
9779
|
envelope.frame?.['type'] === 'DeliveryAck';
|
|
9780
9780
|
if (!shouldInvoke) {
|
|
9781
|
-
logger$
|
|
9781
|
+
logger$17.debug('skipping_listener_handler', {
|
|
9782
9782
|
recipient: serviceName,
|
|
9783
9783
|
envelope_id: envelope.id,
|
|
9784
9784
|
tracked_status: tracked?.status,
|
|
@@ -9792,13 +9792,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9792
9792
|
? undefined
|
|
9793
9793
|
: (tracked ?? undefined);
|
|
9794
9794
|
if (trackedForHandler && trackedForHandler.attempt > 0) {
|
|
9795
|
-
logger$
|
|
9795
|
+
logger$17.info('resuming_handler_retry_after_restart', {
|
|
9796
9796
|
envelope_id: envelope.id,
|
|
9797
9797
|
current_attempts: trackedForHandler.attempt,
|
|
9798
9798
|
service_name: serviceName,
|
|
9799
9799
|
});
|
|
9800
9800
|
}
|
|
9801
|
-
logger$
|
|
9801
|
+
logger$17.debug('forwarding_to_listener_handler', {
|
|
9802
9802
|
recipient: serviceName,
|
|
9803
9803
|
envelope_id: envelope.id,
|
|
9804
9804
|
frame_type: envelope.frame?.['type'],
|
|
@@ -9817,7 +9817,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9817
9817
|
await channel.send(null);
|
|
9818
9818
|
}
|
|
9819
9819
|
catch (error) {
|
|
9820
|
-
logger$
|
|
9820
|
+
logger$17.debug('listener_stop_signal_failed', {
|
|
9821
9821
|
service_name: serviceName,
|
|
9822
9822
|
error: error instanceof Error ? error.message : String(error),
|
|
9823
9823
|
});
|
|
@@ -9826,7 +9826,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9826
9826
|
await this.listenersLock.runExclusive(async () => {
|
|
9827
9827
|
const existing = this.listeners.get(serviceName);
|
|
9828
9828
|
if (existing) {
|
|
9829
|
-
logger$
|
|
9829
|
+
logger$17.debug('replacing_envelope_listener', { recipient: serviceName });
|
|
9830
9830
|
existing.listener.stop();
|
|
9831
9831
|
try {
|
|
9832
9832
|
await existing.listener.task.promise;
|
|
@@ -9844,13 +9844,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9844
9844
|
return binding.address;
|
|
9845
9845
|
}
|
|
9846
9846
|
async listenRpc(serviceName, handler, options = {}) {
|
|
9847
|
-
logger$
|
|
9847
|
+
logger$17.debug('rpc_listen_start', { service_name: serviceName });
|
|
9848
9848
|
const rpcHandler = async (envelope, context) => {
|
|
9849
9849
|
const result = await this.rpcServerHandler.handleRpcRequest(envelope, context, handler, serviceName);
|
|
9850
9850
|
return result ?? null;
|
|
9851
9851
|
};
|
|
9852
9852
|
const address = await this.listen(serviceName, rpcHandler, options);
|
|
9853
|
-
logger$
|
|
9853
|
+
logger$17.debug('rpc_listen_bound', {
|
|
9854
9854
|
service_name: serviceName,
|
|
9855
9855
|
address: address.toString(),
|
|
9856
9856
|
});
|
|
@@ -9919,12 +9919,12 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9919
9919
|
return cached;
|
|
9920
9920
|
});
|
|
9921
9921
|
if (!envelopes.length) {
|
|
9922
|
-
logger$
|
|
9922
|
+
logger$17.debug('no_cached_recovery_for_service', {
|
|
9923
9923
|
service_name: serviceName,
|
|
9924
9924
|
});
|
|
9925
9925
|
return;
|
|
9926
9926
|
}
|
|
9927
|
-
logger$
|
|
9927
|
+
logger$17.debug('recovering_unhandled_envelopes_on_listen', {
|
|
9928
9928
|
service_name: serviceName,
|
|
9929
9929
|
count: envelopes.length,
|
|
9930
9930
|
envelope_ids: envelopes.map((trackedEnvelope) => trackedEnvelope.envelopeId),
|
|
@@ -9935,7 +9935,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9935
9935
|
async recoverServiceEnvelopes(serviceName, envelopes, handler) {
|
|
9936
9936
|
for (const tracked of envelopes) {
|
|
9937
9937
|
try {
|
|
9938
|
-
logger$
|
|
9938
|
+
logger$17.warning('recovering_unhandled_envelope', {
|
|
9939
9939
|
envelope_id: tracked.envelopeId,
|
|
9940
9940
|
service_name: serviceName,
|
|
9941
9941
|
current_attempts: tracked.attempt,
|
|
@@ -9944,13 +9944,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9944
9944
|
const originalEnvelope = tracked.originalEnvelope;
|
|
9945
9945
|
const receiverPolicy = this.nodeLike.deliveryPolicy?.receiverRetryPolicy ?? undefined;
|
|
9946
9946
|
await this.executeHandlerWithRetries(handler, originalEnvelope, undefined, receiverPolicy, tracked, serviceName);
|
|
9947
|
-
logger$
|
|
9947
|
+
logger$17.debug('envelope_recovery_completed', {
|
|
9948
9948
|
envelope_id: tracked.envelopeId,
|
|
9949
9949
|
service_name: serviceName,
|
|
9950
9950
|
});
|
|
9951
9951
|
}
|
|
9952
9952
|
catch (error) {
|
|
9953
|
-
logger$
|
|
9953
|
+
logger$17.error('envelope_recovery_failed', {
|
|
9954
9954
|
envelope_id: tracked.envelopeId,
|
|
9955
9955
|
service_name: serviceName,
|
|
9956
9956
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -9996,7 +9996,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9996
9996
|
await this.deliveryTracker.onEnvelopeHandled(trackedEnvelope);
|
|
9997
9997
|
}
|
|
9998
9998
|
if (currentAttempt > 0) {
|
|
9999
|
-
logger$
|
|
9999
|
+
logger$17.info('handler_retry_succeeded', {
|
|
10000
10000
|
envelope_id: envelope.id,
|
|
10001
10001
|
attempt: currentAttempt + 1,
|
|
10002
10002
|
total_attempts: currentAttempt + 1,
|
|
@@ -10012,7 +10012,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10012
10012
|
await this.deliveryTracker.onEnvelopeHandleFailed(inboxName, trackedEnvelope, context, error instanceof Error ? error : new Error(String(error)), isFinalAttempt);
|
|
10013
10013
|
}
|
|
10014
10014
|
if (isFinalAttempt) {
|
|
10015
|
-
logger$
|
|
10015
|
+
logger$17.error('handler_execution_failed_exhausted_retries', {
|
|
10016
10016
|
envelope_id: envelope.id,
|
|
10017
10017
|
total_attempts: attemptNumber,
|
|
10018
10018
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10021,7 +10021,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10021
10021
|
break;
|
|
10022
10022
|
}
|
|
10023
10023
|
const delayMs = retryPolicy?.nextDelayMs(attemptNumber) ?? 0;
|
|
10024
|
-
logger$
|
|
10024
|
+
logger$17.warning('handler_execution_failed_will_retry', {
|
|
10025
10025
|
envelope_id: envelope.id,
|
|
10026
10026
|
attempt: attemptNumber,
|
|
10027
10027
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10051,7 +10051,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10051
10051
|
}
|
|
10052
10052
|
}
|
|
10053
10053
|
|
|
10054
|
-
const logger$
|
|
10054
|
+
const logger$16 = getLogger('naylence.fame.delivery.default_delivery_tracker');
|
|
10055
10055
|
const STREAM_END = Symbol('stream-end');
|
|
10056
10056
|
const SWEEPER_TICK = Symbol('tracker-sweeper-tick');
|
|
10057
10057
|
function createDeferred$2() {
|
|
@@ -10283,7 +10283,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10283
10283
|
const expectedResponseType = options.expectedResponseType;
|
|
10284
10284
|
const tracked = await this.lock.runExclusive(async () => {
|
|
10285
10285
|
if (this.ackFutures.has(envelope.id)) {
|
|
10286
|
-
logger$
|
|
10286
|
+
logger$16.debug('tracker_envelope_already_tracked', {
|
|
10287
10287
|
envp_id: envelope.id,
|
|
10288
10288
|
});
|
|
10289
10289
|
return null;
|
|
@@ -10293,7 +10293,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10293
10293
|
if (expectedResponseType & core.FameResponseType.REPLY ||
|
|
10294
10294
|
expectedResponseType & core.FameResponseType.STREAM) {
|
|
10295
10295
|
if (existingEnvId && existingEnvId !== envelope.id) {
|
|
10296
|
-
logger$
|
|
10296
|
+
logger$16.debug('envelope_already_tracked_for_replies', {
|
|
10297
10297
|
envp_id: envelope.id,
|
|
10298
10298
|
corr_id: corrId,
|
|
10299
10299
|
expected_response_type: expectedResponseType,
|
|
@@ -10342,7 +10342,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10342
10342
|
return null;
|
|
10343
10343
|
}
|
|
10344
10344
|
await this.scheduleTimer(tracked, options.retryPolicy ?? null, options.retryHandler ?? null);
|
|
10345
|
-
logger$
|
|
10345
|
+
logger$16.debug('tracker_registered_envelope', {
|
|
10346
10346
|
envp_id: envelope.id,
|
|
10347
10347
|
corr_id: tracked.originalEnvelope.corrId,
|
|
10348
10348
|
expected_response: tracked.expectedResponseType,
|
|
@@ -10366,21 +10366,21 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10366
10366
|
return this.awaitEnvelopeFuture(envelopeId, core.FameResponseType.REPLY | core.FameResponseType.STREAM, future, timeoutMs);
|
|
10367
10367
|
}
|
|
10368
10368
|
async onEnvelopeDelivered(inboxName, envelope, context) {
|
|
10369
|
-
logger$
|
|
10369
|
+
logger$16.debug('envelope_delivered', {
|
|
10370
10370
|
envp_id: envelope.id,
|
|
10371
10371
|
corr_id: envelope.corrId,
|
|
10372
10372
|
rtype: envelope.rtype ?? core.FameResponseType.NONE,
|
|
10373
10373
|
frame_type: envelope.frame?.type ?? 'unknown',
|
|
10374
10374
|
});
|
|
10375
10375
|
if (!envelope.corrId) {
|
|
10376
|
-
logger$
|
|
10376
|
+
logger$16.debug('envelope_delivered_no_corr_id', {
|
|
10377
10377
|
envelope_id: envelope.id,
|
|
10378
10378
|
});
|
|
10379
10379
|
return null;
|
|
10380
10380
|
}
|
|
10381
10381
|
if (this.isDeliveryAckFrame(envelope.frame)) {
|
|
10382
10382
|
if (!envelope.frame.refId) {
|
|
10383
|
-
logger$
|
|
10383
|
+
logger$16.debug('envelope_delivered_no_ref_id', {
|
|
10384
10384
|
envelope_id: envelope.id,
|
|
10385
10385
|
});
|
|
10386
10386
|
return null;
|
|
@@ -10418,7 +10418,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10418
10418
|
await inbox.set(envelope.id, tracked);
|
|
10419
10419
|
}
|
|
10420
10420
|
else {
|
|
10421
|
-
logger$
|
|
10421
|
+
logger$16.debug('tracker_duplicate_envelope_already_handled', {
|
|
10422
10422
|
envp_id: envelope.id,
|
|
10423
10423
|
status: tracked.status,
|
|
10424
10424
|
});
|
|
@@ -10461,7 +10461,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10461
10461
|
}
|
|
10462
10462
|
if (isFinalFailure) {
|
|
10463
10463
|
envelope.status = EnvelopeStatus.FAILED_TO_HANDLE;
|
|
10464
|
-
logger$
|
|
10464
|
+
logger$16.error('envelope_handle_failed_final', {
|
|
10465
10465
|
inbox_name: inboxName,
|
|
10466
10466
|
envp_id: envelope.originalEnvelope.id,
|
|
10467
10467
|
error: error?.message ?? 'unknown',
|
|
@@ -10472,7 +10472,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10472
10472
|
await inbox.delete(envelope.originalEnvelope.id);
|
|
10473
10473
|
return;
|
|
10474
10474
|
}
|
|
10475
|
-
logger$
|
|
10475
|
+
logger$16.warning('envelope_handle_failed_retry', {
|
|
10476
10476
|
inbox_name: inboxName,
|
|
10477
10477
|
envp_id: envelope.originalEnvelope.id,
|
|
10478
10478
|
error: error?.message ?? 'unknown',
|
|
@@ -10518,14 +10518,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10518
10518
|
if (handledViaFuture) {
|
|
10519
10519
|
await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
|
|
10520
10520
|
await this.clearTimer(refId);
|
|
10521
|
-
logger$
|
|
10521
|
+
logger$16.debug('tracker_ack_resolved_without_tracked_envelope', {
|
|
10522
10522
|
envp_id: envelope.id,
|
|
10523
10523
|
ref_id: refId,
|
|
10524
10524
|
corr_id: envelope.corrId,
|
|
10525
10525
|
});
|
|
10526
10526
|
return;
|
|
10527
10527
|
}
|
|
10528
|
-
logger$
|
|
10528
|
+
logger$16.debug('tracker_ack_for_unknown_envelope', {
|
|
10529
10529
|
envp_id: envelope.id,
|
|
10530
10530
|
ref_id: refId,
|
|
10531
10531
|
corr_id: envelope.corrId,
|
|
@@ -10533,7 +10533,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10533
10533
|
return;
|
|
10534
10534
|
}
|
|
10535
10535
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10536
|
-
logger$
|
|
10536
|
+
logger$16.debug('tracker_ack_corr_id_mismatch', {
|
|
10537
10537
|
envp_id: envelope.id,
|
|
10538
10538
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10539
10539
|
actual_corr_id: envelope.corrId,
|
|
@@ -10558,7 +10558,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10558
10558
|
for (const handler of this.eventHandlers) {
|
|
10559
10559
|
await handler.onEnvelopeAcked?.(tracked);
|
|
10560
10560
|
}
|
|
10561
|
-
logger$
|
|
10561
|
+
logger$16.debug('tracker_envelope_acked', {
|
|
10562
10562
|
envp_id: tracked.originalEnvelope.id,
|
|
10563
10563
|
});
|
|
10564
10564
|
}
|
|
@@ -10576,13 +10576,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10576
10576
|
const outbox = this.ensureOutbox();
|
|
10577
10577
|
const tracked = await outbox.get(envelope.frame.refId);
|
|
10578
10578
|
if (!tracked) {
|
|
10579
|
-
logger$
|
|
10579
|
+
logger$16.debug('tracker_nack_for_unknown_envelope', {
|
|
10580
10580
|
envp_id: envelope.id,
|
|
10581
10581
|
});
|
|
10582
10582
|
return;
|
|
10583
10583
|
}
|
|
10584
10584
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10585
|
-
logger$
|
|
10585
|
+
logger$16.debug('tracker_nack_corr_id_mismatch', {
|
|
10586
10586
|
envp_id: envelope.id,
|
|
10587
10587
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10588
10588
|
actual_corr_id: envelope.corrId,
|
|
@@ -10624,7 +10624,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10624
10624
|
for (const handler of this.eventHandlers) {
|
|
10625
10625
|
await handler.onEnvelopeNacked?.(tracked, ackFrame.reason ?? null);
|
|
10626
10626
|
}
|
|
10627
|
-
logger$
|
|
10627
|
+
logger$16.debug('tracker_envelope_nacked', {
|
|
10628
10628
|
envp_id: tracked.originalEnvelope.id,
|
|
10629
10629
|
reason: ackFrame.reason,
|
|
10630
10630
|
});
|
|
@@ -10672,7 +10672,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10672
10672
|
for (const handler of this.eventHandlers) {
|
|
10673
10673
|
await handler.onEnvelopeReplied?.(trackedEnvelope, envelope);
|
|
10674
10674
|
}
|
|
10675
|
-
logger$
|
|
10675
|
+
logger$16.debug('tracked_envelope_replied', {
|
|
10676
10676
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10677
10677
|
corr_id: envelope.corrId,
|
|
10678
10678
|
});
|
|
@@ -10746,7 +10746,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10746
10746
|
async addToInboxDlq(trackedEnvelope, reason = null) {
|
|
10747
10747
|
const dlq = this.inboxDlq;
|
|
10748
10748
|
if (!dlq) {
|
|
10749
|
-
logger$
|
|
10749
|
+
logger$16.error('dlq_not_initialized', {
|
|
10750
10750
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10751
10751
|
});
|
|
10752
10752
|
return;
|
|
@@ -10761,7 +10761,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10761
10761
|
const deadLetteredAt = Date.now();
|
|
10762
10762
|
setMetaWithLegacy(trackedEnvelope.meta, 'deadLetteredAtMs', 'dead_lettered_at_ms', deadLetteredAt);
|
|
10763
10763
|
await dlq.set(trackedEnvelope.originalEnvelope.id, trackedEnvelope);
|
|
10764
|
-
logger$
|
|
10764
|
+
logger$16.warning('envelope_moved_to_dlq', {
|
|
10765
10765
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10766
10766
|
service_name: trackedEnvelope.serviceName,
|
|
10767
10767
|
});
|
|
@@ -10790,7 +10790,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10790
10790
|
const toDelete = Object.entries(items).filter(([, value]) => predicate ? predicate(value) : true);
|
|
10791
10791
|
await Promise.all(toDelete.map(([key]) => dlq.delete(key)));
|
|
10792
10792
|
if (toDelete.length) {
|
|
10793
|
-
logger$
|
|
10793
|
+
logger$16.debug('dlq_purged', { count: toDelete.length });
|
|
10794
10794
|
}
|
|
10795
10795
|
return toDelete.length;
|
|
10796
10796
|
}
|
|
@@ -10843,11 +10843,11 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10843
10843
|
}
|
|
10844
10844
|
this.futuresSweeper = null;
|
|
10845
10845
|
}
|
|
10846
|
-
logger$
|
|
10846
|
+
logger$16.debug('tracker_cleanup_completed');
|
|
10847
10847
|
}
|
|
10848
10848
|
async recoverPending() {
|
|
10849
10849
|
const pending = await this.listPending();
|
|
10850
|
-
logger$
|
|
10850
|
+
logger$16.debug('tracker_recovering_pending', { count: pending.length });
|
|
10851
10851
|
await this.lock.runExclusive(async () => {
|
|
10852
10852
|
for (const tracked of pending) {
|
|
10853
10853
|
if (tracked.expectedResponseType & core.FameResponseType.ACK) {
|
|
@@ -10873,7 +10873,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10873
10873
|
for (const tracked of pending) {
|
|
10874
10874
|
await this.scheduleTimer(tracked, null, null);
|
|
10875
10875
|
}
|
|
10876
|
-
logger$
|
|
10876
|
+
logger$16.debug('tracker_recovery_completed', { count: pending.length });
|
|
10877
10877
|
}
|
|
10878
10878
|
ensureOutbox() {
|
|
10879
10879
|
if (!this.outbox) {
|
|
@@ -10888,7 +10888,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10888
10888
|
return this.inbox;
|
|
10889
10889
|
}
|
|
10890
10890
|
async waitForPendingAcks() {
|
|
10891
|
-
logger$
|
|
10891
|
+
logger$16.debug('tracker_node_preparing_to_stop_waiting_for_pending_acks');
|
|
10892
10892
|
const outbox = this.outbox;
|
|
10893
10893
|
if (!outbox) {
|
|
10894
10894
|
return;
|
|
@@ -10900,7 +10900,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10900
10900
|
continue;
|
|
10901
10901
|
}
|
|
10902
10902
|
if (!future.done) {
|
|
10903
|
-
logger$
|
|
10903
|
+
logger$16.debug('tracker_pending_ack_future_detected', {
|
|
10904
10904
|
envelope_id: envelopeId,
|
|
10905
10905
|
});
|
|
10906
10906
|
pending.push({ envelopeId, future });
|
|
@@ -10908,10 +10908,10 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10908
10908
|
}
|
|
10909
10909
|
});
|
|
10910
10910
|
if (!pending.length) {
|
|
10911
|
-
logger$
|
|
10911
|
+
logger$16.debug('tracker_no_pending_acks_to_wait_for');
|
|
10912
10912
|
return;
|
|
10913
10913
|
}
|
|
10914
|
-
logger$
|
|
10914
|
+
logger$16.debug('tracker_waiting_for_pending_acks', { count: pending.length });
|
|
10915
10915
|
for (const entry of pending) {
|
|
10916
10916
|
if (!entry) {
|
|
10917
10917
|
continue;
|
|
@@ -10928,19 +10928,19 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10928
10928
|
}
|
|
10929
10929
|
try {
|
|
10930
10930
|
await this.awaitWithTimeout(entry.future.promise, remainingMs);
|
|
10931
|
-
logger$
|
|
10931
|
+
logger$16.debug('tracker_received_ack', {
|
|
10932
10932
|
envelope_id: entry.envelopeId,
|
|
10933
10933
|
});
|
|
10934
10934
|
await outbox.delete(entry.envelopeId);
|
|
10935
10935
|
}
|
|
10936
10936
|
catch (error) {
|
|
10937
10937
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
10938
|
-
logger$
|
|
10938
|
+
logger$16.debug('tracker_ack_timeout_expired', {
|
|
10939
10939
|
envelope_id: entry.envelopeId,
|
|
10940
10940
|
});
|
|
10941
10941
|
}
|
|
10942
10942
|
else {
|
|
10943
|
-
logger$
|
|
10943
|
+
logger$16.debug('tracker_ack_wait_error', {
|
|
10944
10944
|
envelope_id: entry.envelopeId,
|
|
10945
10945
|
error: error instanceof Error ? error.message : String(error),
|
|
10946
10946
|
});
|
|
@@ -10948,13 +10948,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10948
10948
|
}
|
|
10949
10949
|
}
|
|
10950
10950
|
catch (error) {
|
|
10951
|
-
logger$
|
|
10951
|
+
logger$16.error('tracker_error_waiting_for_ack', {
|
|
10952
10952
|
envelope_id: entry.envelopeId,
|
|
10953
10953
|
error: error instanceof Error ? error.message : String(error),
|
|
10954
10954
|
});
|
|
10955
10955
|
}
|
|
10956
10956
|
}
|
|
10957
|
-
logger$
|
|
10957
|
+
logger$16.debug('tracker_finished_waiting_for_pending_acks');
|
|
10958
10958
|
}
|
|
10959
10959
|
async waitForPendingAckDispatches() {
|
|
10960
10960
|
while (this.pendingAckDispatches.size > 0) {
|
|
@@ -11012,7 +11012,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11012
11012
|
for (const handler of this.eventHandlers) {
|
|
11013
11013
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11014
11014
|
}
|
|
11015
|
-
logger$
|
|
11015
|
+
logger$16.debug('tracker_envelope_timed_out', {
|
|
11016
11016
|
envp_id: tracked.originalEnvelope.id,
|
|
11017
11017
|
});
|
|
11018
11018
|
return;
|
|
@@ -11025,7 +11025,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11025
11025
|
currentTracked.timeoutAtMs = nextTimeoutAt;
|
|
11026
11026
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11027
11027
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11028
|
-
logger$
|
|
11028
|
+
logger$16.debug('tracker_retry_deferred_during_shutdown', {
|
|
11029
11029
|
envp_id: tracked.originalEnvelope.id,
|
|
11030
11030
|
defer_ms: shutdownDeferMs,
|
|
11031
11031
|
});
|
|
@@ -11048,7 +11048,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11048
11048
|
});
|
|
11049
11049
|
}
|
|
11050
11050
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11051
|
-
logger$
|
|
11051
|
+
logger$16.debug('envelope_delivery_retry_scheduled', {
|
|
11052
11052
|
envp_id: tracked.originalEnvelope.id,
|
|
11053
11053
|
attempt: currentTracked.attempt,
|
|
11054
11054
|
max_retries: retryPolicy.maxRetries,
|
|
@@ -11060,7 +11060,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11060
11060
|
currentTracked.timeoutAtMs = currentTracked.overallTimeoutAtMs;
|
|
11061
11061
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11062
11062
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11063
|
-
logger$
|
|
11063
|
+
logger$16.debug('envelope_retries_exhausted_waiting_until_overall_timeout', {
|
|
11064
11064
|
envp_id: tracked.originalEnvelope.id,
|
|
11065
11065
|
attempt: currentTracked.attempt,
|
|
11066
11066
|
overall_timeout_at_ms: currentTracked.overallTimeoutAtMs,
|
|
@@ -11080,7 +11080,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11080
11080
|
for (const handler of this.eventHandlers) {
|
|
11081
11081
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11082
11082
|
}
|
|
11083
|
-
logger$
|
|
11083
|
+
logger$16.debug('tracker_envelope_timed_out', {
|
|
11084
11084
|
envp_id: tracked.originalEnvelope.id,
|
|
11085
11085
|
});
|
|
11086
11086
|
}
|
|
@@ -11088,7 +11088,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11088
11088
|
if (error instanceof TaskCancelledError) {
|
|
11089
11089
|
return;
|
|
11090
11090
|
}
|
|
11091
|
-
logger$
|
|
11091
|
+
logger$16.error('tracker_timer_error', {
|
|
11092
11092
|
envp_id: tracked.originalEnvelope.id,
|
|
11093
11093
|
error: error instanceof Error ? error.message : String(error),
|
|
11094
11094
|
});
|
|
@@ -11143,7 +11143,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11143
11143
|
if (timeoutSeconds !== null) {
|
|
11144
11144
|
return await this.awaitWithTimeout(future.promise, timeoutSeconds);
|
|
11145
11145
|
}
|
|
11146
|
-
logger$
|
|
11146
|
+
logger$16.debug('await_envelope_no_timeout_wait', {
|
|
11147
11147
|
envelope_id: envelopeId,
|
|
11148
11148
|
});
|
|
11149
11149
|
return await future.promise;
|
|
@@ -11152,7 +11152,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11152
11152
|
if (error instanceof Error && error.name !== 'TimeoutError') {
|
|
11153
11153
|
throw error;
|
|
11154
11154
|
}
|
|
11155
|
-
logger$
|
|
11155
|
+
logger$16.error('await_envelope_timeout_error', {
|
|
11156
11156
|
envelope_id: envelopeId,
|
|
11157
11157
|
timeout_ms: timeoutSeconds,
|
|
11158
11158
|
future_done: false,
|
|
@@ -11313,7 +11313,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11313
11313
|
this.replyDoneSince.delete(envId);
|
|
11314
11314
|
}
|
|
11315
11315
|
});
|
|
11316
|
-
logger$
|
|
11316
|
+
logger$16.debug('tracker_swept_completed_futures', {
|
|
11317
11317
|
ack_removed: toRemoveAck.length,
|
|
11318
11318
|
reply_removed: toRemoveReply.length,
|
|
11319
11319
|
grace_secs: this.futGcGraceSecs,
|
|
@@ -11327,7 +11327,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11327
11327
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
11328
11328
|
continue;
|
|
11329
11329
|
}
|
|
11330
|
-
logger$
|
|
11330
|
+
logger$16.error('tracker_sweeper_error', {
|
|
11331
11331
|
error: error instanceof Error ? error.message : String(error),
|
|
11332
11332
|
});
|
|
11333
11333
|
}
|
|
@@ -11358,14 +11358,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11358
11358
|
}
|
|
11359
11359
|
const node = this.node;
|
|
11360
11360
|
if (!envelope.replyTo) {
|
|
11361
|
-
logger$
|
|
11361
|
+
logger$16.error('cannot_send_ack_no_reply_to', { envp_id: envelope.id });
|
|
11362
11362
|
return;
|
|
11363
11363
|
}
|
|
11364
11364
|
if (!envelope.corrId) {
|
|
11365
|
-
logger$
|
|
11365
|
+
logger$16.error('cannot_send_ack_no_corr_id', { envp_id: envelope.id });
|
|
11366
11366
|
return;
|
|
11367
11367
|
}
|
|
11368
|
-
logger$
|
|
11368
|
+
logger$16.debug('tracker_sending_ack', {
|
|
11369
11369
|
envp_id: envelope.id,
|
|
11370
11370
|
ref_id: envelope.id,
|
|
11371
11371
|
to: envelope.replyTo,
|
|
@@ -11385,7 +11385,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11385
11385
|
.send(ackEnvelope)
|
|
11386
11386
|
.then(() => undefined)
|
|
11387
11387
|
.catch((error) => {
|
|
11388
|
-
logger$
|
|
11388
|
+
logger$16.error('tracker_ack_dispatch_failed', {
|
|
11389
11389
|
envp_id: envelope.id,
|
|
11390
11390
|
error: error instanceof Error ? error.message : String(error),
|
|
11391
11391
|
});
|
|
@@ -11471,7 +11471,7 @@ class AsyncEvent {
|
|
|
11471
11471
|
}
|
|
11472
11472
|
}
|
|
11473
11473
|
|
|
11474
|
-
const logger$
|
|
11474
|
+
const logger$15 = getLogger('naylence.fame.node.root_session_manager');
|
|
11475
11475
|
function resolveOption$1(options, primary, ...aliases) {
|
|
11476
11476
|
const record = options;
|
|
11477
11477
|
const primaryKey = primary;
|
|
@@ -11552,7 +11552,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11552
11552
|
this.onAdmissionFailed =
|
|
11553
11553
|
typeof onAdmissionFailed === 'function' ? onAdmissionFailed : undefined;
|
|
11554
11554
|
this.enableContinuousRefresh = enableContinuousRefresh ?? true;
|
|
11555
|
-
logger$
|
|
11555
|
+
logger$15.debug('created_root_session_manager');
|
|
11556
11556
|
}
|
|
11557
11557
|
get isReady() {
|
|
11558
11558
|
return this.readyEvent.isSet();
|
|
@@ -11577,7 +11577,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11577
11577
|
if (this.admissionTask) {
|
|
11578
11578
|
return;
|
|
11579
11579
|
}
|
|
11580
|
-
logger$
|
|
11580
|
+
logger$15.debug('root_session_manager_starting');
|
|
11581
11581
|
this.stopEvent.clear();
|
|
11582
11582
|
this.readyEvent.clear();
|
|
11583
11583
|
const taskName = `root-admission-${this.admissionEpoch}`;
|
|
@@ -11597,10 +11597,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11597
11597
|
await this.admissionTask.promise;
|
|
11598
11598
|
throw new FameConnectError('Root session manager failed to become ready');
|
|
11599
11599
|
}
|
|
11600
|
-
logger$
|
|
11600
|
+
logger$15.debug('root_session_manager_started');
|
|
11601
11601
|
}
|
|
11602
11602
|
async stop() {
|
|
11603
|
-
logger$
|
|
11603
|
+
logger$15.debug('root_session_manager_stopping');
|
|
11604
11604
|
this.stopEvent.set();
|
|
11605
11605
|
if (this.admissionTask) {
|
|
11606
11606
|
this.admissionTask.cancel();
|
|
@@ -11612,7 +11612,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11612
11612
|
await this.consumeTask(this.expiryGuardTask);
|
|
11613
11613
|
this.expiryGuardTask = null;
|
|
11614
11614
|
}
|
|
11615
|
-
logger$
|
|
11615
|
+
logger$15.debug('root_session_manager_stopped');
|
|
11616
11616
|
}
|
|
11617
11617
|
async awaitReady(timeoutMs) {
|
|
11618
11618
|
if (this.isReady) {
|
|
@@ -11653,12 +11653,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11653
11653
|
await this.onEpochChange(epoch);
|
|
11654
11654
|
}
|
|
11655
11655
|
else {
|
|
11656
|
-
logger$
|
|
11656
|
+
logger$15.debug('epoch_change_ignored_no_handler', { epoch });
|
|
11657
11657
|
}
|
|
11658
11658
|
}
|
|
11659
11659
|
static createForRootSentinel(node, admissionClient, requestedLogicals = [], enableContinuousRefresh = true, onEpochChange) {
|
|
11660
11660
|
const handleWelcome = async (frame) => {
|
|
11661
|
-
logger$
|
|
11661
|
+
logger$15.info('root_admission_successful', {
|
|
11662
11662
|
system_id: frame.systemId,
|
|
11663
11663
|
assigned_path: frame.assignedPath ?? null,
|
|
11664
11664
|
accepted_logicals: frame.acceptedLogicals ?? [],
|
|
@@ -11669,12 +11669,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11669
11669
|
? grant.purpose
|
|
11670
11670
|
: undefined;
|
|
11671
11671
|
if (purpose) {
|
|
11672
|
-
logger$
|
|
11672
|
+
logger$15.debug('received_admission_grant', { purpose });
|
|
11673
11673
|
}
|
|
11674
11674
|
}
|
|
11675
11675
|
};
|
|
11676
11676
|
const handleFailure = async (error) => {
|
|
11677
|
-
logger$
|
|
11677
|
+
logger$15.error('root_admission_failed_permanently', {
|
|
11678
11678
|
error: error.message,
|
|
11679
11679
|
});
|
|
11680
11680
|
};
|
|
@@ -11703,10 +11703,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11703
11703
|
this.readyEvent.set();
|
|
11704
11704
|
}
|
|
11705
11705
|
if (this.hadSuccessfulAdmission) {
|
|
11706
|
-
logger$
|
|
11706
|
+
logger$15.debug('root_admission_refreshed');
|
|
11707
11707
|
}
|
|
11708
11708
|
else {
|
|
11709
|
-
logger$
|
|
11709
|
+
logger$15.debug('root_admission_completed');
|
|
11710
11710
|
}
|
|
11711
11711
|
this.hadSuccessfulAdmission = true;
|
|
11712
11712
|
delay = RootSessionManager.BACKOFF_INITIAL;
|
|
@@ -11715,7 +11715,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11715
11715
|
await this.startExpiryGuard(welcomeFrame);
|
|
11716
11716
|
const expiryTriggered = await this.waitForExpiryOrStop();
|
|
11717
11717
|
if (expiryTriggered && !this.stopEvent.isSet()) {
|
|
11718
|
-
logger$
|
|
11718
|
+
logger$15.debug('performing_scheduled_re_admission');
|
|
11719
11719
|
continue;
|
|
11720
11720
|
}
|
|
11721
11721
|
}
|
|
@@ -11727,7 +11727,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11727
11727
|
}
|
|
11728
11728
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11729
11729
|
const willRetry = attempts < RootSessionManager.RETRY_MAX_ATTEMPTS;
|
|
11730
|
-
logger$
|
|
11730
|
+
logger$15.warning('root_admission_failed', {
|
|
11731
11731
|
error: errorObject.message,
|
|
11732
11732
|
attempt: attempts,
|
|
11733
11733
|
will_retry: willRetry,
|
|
@@ -11745,7 +11745,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11745
11745
|
}
|
|
11746
11746
|
}
|
|
11747
11747
|
if (attempts >= RootSessionManager.RETRY_MAX_ATTEMPTS) {
|
|
11748
|
-
logger$
|
|
11748
|
+
logger$15.error('root_admission_max_attempts_exceeded', {
|
|
11749
11749
|
max_attempts: RootSessionManager.RETRY_MAX_ATTEMPTS,
|
|
11750
11750
|
});
|
|
11751
11751
|
}
|
|
@@ -11822,7 +11822,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11822
11822
|
}
|
|
11823
11823
|
async expiryGuard(welcomeFrame, signal) {
|
|
11824
11824
|
if (!welcomeFrame.expiresAt) {
|
|
11825
|
-
logger$
|
|
11825
|
+
logger$15.debug('no_admission_expiry_configured');
|
|
11826
11826
|
await Promise.race([this.stopEvent.wait(), this.waitForAbort(signal)]);
|
|
11827
11827
|
return;
|
|
11828
11828
|
}
|
|
@@ -11831,7 +11831,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11831
11831
|
let delaySeconds = (expiresAt.getTime() - now.getTime()) / 1000 -
|
|
11832
11832
|
RootSessionManager.JWT_REFRESH_SAFETY;
|
|
11833
11833
|
delaySeconds = Math.max(delaySeconds, 0);
|
|
11834
|
-
logger$
|
|
11834
|
+
logger$15.debug('admission_expiry_guard_started', {
|
|
11835
11835
|
welcome_expires_at: expiresAt.toISOString(),
|
|
11836
11836
|
delay_seconds: delaySeconds,
|
|
11837
11837
|
refresh_safety_seconds: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11840,7 +11840,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11840
11840
|
if (this.stopEvent.isSet() || signal?.aborted) {
|
|
11841
11841
|
return;
|
|
11842
11842
|
}
|
|
11843
|
-
logger$
|
|
11843
|
+
logger$15.debug('admission_expiry_triggered_refresh', {
|
|
11844
11844
|
expires_at: expiresAt.toISOString(),
|
|
11845
11845
|
current_time: new Date().toISOString(),
|
|
11846
11846
|
seconds_before_expiry: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11855,7 +11855,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11855
11855
|
return;
|
|
11856
11856
|
}
|
|
11857
11857
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11858
|
-
logger$
|
|
11858
|
+
logger$15.debug('background_task_error', {
|
|
11859
11859
|
task_name: task.name,
|
|
11860
11860
|
error: errorObject.message,
|
|
11861
11861
|
});
|
|
@@ -11951,7 +11951,7 @@ class BoundedAsyncQueue {
|
|
|
11951
11951
|
}
|
|
11952
11952
|
}
|
|
11953
11953
|
|
|
11954
|
-
const logger$
|
|
11954
|
+
const logger$14 = getLogger('naylence.fame.connector.broadcast_channel_connector');
|
|
11955
11955
|
const BROADCAST_CHANNEL_CONNECTOR_TYPE$1 = 'broadcast-channel-connector';
|
|
11956
11956
|
const DEFAULT_CHANNEL$7 = 'naylence-fabric';
|
|
11957
11957
|
const DEFAULT_INBOX_CAPACITY$7 = 2048;
|
|
@@ -12040,7 +12040,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12040
12040
|
this.localNodeId = normalizedLocalNodeId;
|
|
12041
12041
|
this.targetNodeId = BroadcastChannelConnector.normalizeTargetNodeId(config.initialTargetNodeId);
|
|
12042
12042
|
this.channel = new BroadcastChannel(this.channelName);
|
|
12043
|
-
logger$
|
|
12043
|
+
logger$14.debug('broadcast_channel_connector_created', {
|
|
12044
12044
|
channel: this.channelName,
|
|
12045
12045
|
connector_id: this.connectorId,
|
|
12046
12046
|
local_node_id: this.localNodeId,
|
|
@@ -12052,7 +12052,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12052
12052
|
this.onMsg = (event) => {
|
|
12053
12053
|
// Guard: Don't process if listener was unregistered
|
|
12054
12054
|
if (!this.listenerRegistered) {
|
|
12055
|
-
logger$
|
|
12055
|
+
logger$14.warning('broadcast_channel_message_after_unregister', {
|
|
12056
12056
|
channel: this.channelName,
|
|
12057
12057
|
connector_id: this.connectorId,
|
|
12058
12058
|
timestamp: new Date().toISOString(),
|
|
@@ -12060,7 +12060,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12060
12060
|
return;
|
|
12061
12061
|
}
|
|
12062
12062
|
const message = event.data;
|
|
12063
|
-
logger$
|
|
12063
|
+
logger$14.debug('broadcast_channel_raw_event', {
|
|
12064
12064
|
channel: this.channelName,
|
|
12065
12065
|
connector_id: this.connectorId,
|
|
12066
12066
|
message_type: message && typeof message === 'object'
|
|
@@ -12076,7 +12076,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12076
12076
|
const busMessage = message;
|
|
12077
12077
|
const senderNodeId = BroadcastChannelConnector.normalizeNodeId(busMessage.senderNodeId);
|
|
12078
12078
|
if (!senderNodeId) {
|
|
12079
|
-
logger$
|
|
12079
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12080
12080
|
channel: this.channelName,
|
|
12081
12081
|
connector_id: this.connectorId,
|
|
12082
12082
|
reason: 'missing_sender_node_id',
|
|
@@ -12084,7 +12084,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12084
12084
|
return;
|
|
12085
12085
|
}
|
|
12086
12086
|
if (senderNodeId === this.localNodeId) {
|
|
12087
|
-
logger$
|
|
12087
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12088
12088
|
channel: this.channelName,
|
|
12089
12089
|
connector_id: this.connectorId,
|
|
12090
12090
|
reason: 'self_echo',
|
|
@@ -12098,14 +12098,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12098
12098
|
}
|
|
12099
12099
|
const payload = BroadcastChannelConnector.coercePayload(busMessage.payload);
|
|
12100
12100
|
if (!payload) {
|
|
12101
|
-
logger$
|
|
12101
|
+
logger$14.debug('broadcast_channel_payload_rejected', {
|
|
12102
12102
|
channel: this.channelName,
|
|
12103
12103
|
connector_id: this.connectorId,
|
|
12104
12104
|
reason: 'unrecognized_payload_type',
|
|
12105
12105
|
});
|
|
12106
12106
|
return;
|
|
12107
12107
|
}
|
|
12108
|
-
logger$
|
|
12108
|
+
logger$14.debug('broadcast_channel_message_received', {
|
|
12109
12109
|
channel: this.channelName,
|
|
12110
12110
|
sender_id: message?.senderId,
|
|
12111
12111
|
sender_node_id: senderNodeId,
|
|
@@ -12134,14 +12134,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12134
12134
|
}
|
|
12135
12135
|
catch (error) {
|
|
12136
12136
|
if (error instanceof QueueFullError) {
|
|
12137
|
-
logger$
|
|
12137
|
+
logger$14.warning('broadcast_channel_receive_queue_full', {
|
|
12138
12138
|
channel: this.channelName,
|
|
12139
12139
|
inbox_capacity: this.inboxCapacity,
|
|
12140
12140
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12141
12141
|
});
|
|
12142
12142
|
}
|
|
12143
12143
|
else {
|
|
12144
|
-
logger$
|
|
12144
|
+
logger$14.error('broadcast_channel_receive_error', {
|
|
12145
12145
|
channel: this.channelName,
|
|
12146
12146
|
error: error instanceof Error ? error.message : String(error),
|
|
12147
12147
|
});
|
|
@@ -12155,7 +12155,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12155
12155
|
// Setup visibility change monitoring
|
|
12156
12156
|
this.visibilityChangeHandler = () => {
|
|
12157
12157
|
const isHidden = document.hidden;
|
|
12158
|
-
logger$
|
|
12158
|
+
logger$14.debug('broadcast_channel_visibility_changed', {
|
|
12159
12159
|
channel: this.channelName,
|
|
12160
12160
|
connector_id: this.connectorId,
|
|
12161
12161
|
visibility: isHidden ? 'hidden' : 'visible',
|
|
@@ -12164,7 +12164,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12164
12164
|
// Pause/resume connector based on visibility
|
|
12165
12165
|
if (isHidden && this.state === core.ConnectorState.STARTED) {
|
|
12166
12166
|
this.pause().catch((err) => {
|
|
12167
|
-
logger$
|
|
12167
|
+
logger$14.warning('broadcast_channel_pause_failed', {
|
|
12168
12168
|
channel: this.channelName,
|
|
12169
12169
|
connector_id: this.connectorId,
|
|
12170
12170
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12173,7 +12173,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12173
12173
|
}
|
|
12174
12174
|
else if (!isHidden && this.state === core.ConnectorState.PAUSED) {
|
|
12175
12175
|
this.resume().catch((err) => {
|
|
12176
|
-
logger$
|
|
12176
|
+
logger$14.warning('broadcast_channel_resume_failed', {
|
|
12177
12177
|
channel: this.channelName,
|
|
12178
12178
|
connector_id: this.connectorId,
|
|
12179
12179
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12187,7 +12187,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12187
12187
|
// Track page lifecycle events to detect browser unload/discard
|
|
12188
12188
|
if (typeof window !== 'undefined') {
|
|
12189
12189
|
const lifecycleLogger = (event) => {
|
|
12190
|
-
logger$
|
|
12190
|
+
logger$14.debug('broadcast_channel_page_lifecycle', {
|
|
12191
12191
|
channel: this.channelName,
|
|
12192
12192
|
connector_id: this.connectorId,
|
|
12193
12193
|
event_type: event.type,
|
|
@@ -12203,7 +12203,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12203
12203
|
document.addEventListener('resume', lifecycleLogger);
|
|
12204
12204
|
}
|
|
12205
12205
|
// Log initial state with detailed visibility info
|
|
12206
|
-
logger$
|
|
12206
|
+
logger$14.debug('broadcast_channel_initial_visibility', {
|
|
12207
12207
|
channel: this.channelName,
|
|
12208
12208
|
connector_id: this.connectorId,
|
|
12209
12209
|
visibility: document.hidden ? 'hidden' : 'visible',
|
|
@@ -12235,14 +12235,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12235
12235
|
}
|
|
12236
12236
|
catch (error) {
|
|
12237
12237
|
if (error instanceof QueueFullError) {
|
|
12238
|
-
logger$
|
|
12238
|
+
logger$14.warning('broadcast_channel_push_queue_full', {
|
|
12239
12239
|
channel: this.channelName,
|
|
12240
12240
|
inbox_capacity: this.inboxCapacity,
|
|
12241
12241
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12242
12242
|
});
|
|
12243
12243
|
throw error;
|
|
12244
12244
|
}
|
|
12245
|
-
logger$
|
|
12245
|
+
logger$14.error('broadcast_channel_push_failed', {
|
|
12246
12246
|
channel: this.channelName,
|
|
12247
12247
|
error: error instanceof Error ? error.message : String(error),
|
|
12248
12248
|
});
|
|
@@ -12252,7 +12252,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12252
12252
|
async _transportSendBytes(data) {
|
|
12253
12253
|
ensureBroadcastEnvironment();
|
|
12254
12254
|
const targetNodeId = this.targetNodeId ?? '*';
|
|
12255
|
-
logger$
|
|
12255
|
+
logger$14.debug('broadcast_channel_message_sending', {
|
|
12256
12256
|
channel: this.channelName,
|
|
12257
12257
|
sender_id: this.connectorId,
|
|
12258
12258
|
sender_node_id: this.localNodeId,
|
|
@@ -12273,7 +12273,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12273
12273
|
return item;
|
|
12274
12274
|
}
|
|
12275
12275
|
async _transportClose(code, reason) {
|
|
12276
|
-
logger$
|
|
12276
|
+
logger$14.debug('broadcast_channel_transport_closing', {
|
|
12277
12277
|
channel: this.channelName,
|
|
12278
12278
|
connector_id: this.connectorId,
|
|
12279
12279
|
code,
|
|
@@ -12282,14 +12282,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12282
12282
|
timestamp: new Date().toISOString(),
|
|
12283
12283
|
});
|
|
12284
12284
|
if (this.listenerRegistered) {
|
|
12285
|
-
logger$
|
|
12285
|
+
logger$14.debug('broadcast_channel_removing_listener', {
|
|
12286
12286
|
channel: this.channelName,
|
|
12287
12287
|
connector_id: this.connectorId,
|
|
12288
12288
|
timestamp: new Date().toISOString(),
|
|
12289
12289
|
});
|
|
12290
12290
|
this.channel.removeEventListener('message', this.onMsg);
|
|
12291
12291
|
this.listenerRegistered = false;
|
|
12292
|
-
logger$
|
|
12292
|
+
logger$14.debug('broadcast_channel_listener_removed', {
|
|
12293
12293
|
channel: this.channelName,
|
|
12294
12294
|
connector_id: this.connectorId,
|
|
12295
12295
|
timestamp: new Date().toISOString(),
|
|
@@ -12302,13 +12302,13 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12302
12302
|
this.visibilityChangeListenerRegistered = false;
|
|
12303
12303
|
this.visibilityChangeHandler = undefined;
|
|
12304
12304
|
}
|
|
12305
|
-
logger$
|
|
12305
|
+
logger$14.debug('broadcast_channel_closing', {
|
|
12306
12306
|
channel: this.channelName,
|
|
12307
12307
|
connector_id: this.connectorId,
|
|
12308
12308
|
timestamp: new Date().toISOString(),
|
|
12309
12309
|
});
|
|
12310
12310
|
this.channel.close();
|
|
12311
|
-
logger$
|
|
12311
|
+
logger$14.debug('broadcast_channel_closed', {
|
|
12312
12312
|
channel: this.channelName,
|
|
12313
12313
|
connector_id: this.connectorId,
|
|
12314
12314
|
timestamp: new Date().toISOString(),
|
|
@@ -12332,7 +12332,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12332
12332
|
if (targetNodeId &&
|
|
12333
12333
|
targetNodeId !== '*' &&
|
|
12334
12334
|
targetNodeId !== this.localNodeId) {
|
|
12335
|
-
logger$
|
|
12335
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12336
12336
|
channel: this.channelName,
|
|
12337
12337
|
connector_id: this.connectorId,
|
|
12338
12338
|
reason: 'wildcard_target_mismatch',
|
|
@@ -12348,7 +12348,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12348
12348
|
if (expectedSender &&
|
|
12349
12349
|
expectedSender !== '*' &&
|
|
12350
12350
|
senderNodeId !== expectedSender) {
|
|
12351
|
-
logger$
|
|
12351
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12352
12352
|
channel: this.channelName,
|
|
12353
12353
|
connector_id: this.connectorId,
|
|
12354
12354
|
reason: 'unexpected_sender',
|
|
@@ -12361,7 +12361,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12361
12361
|
if (targetNodeId &&
|
|
12362
12362
|
targetNodeId !== '*' &&
|
|
12363
12363
|
targetNodeId !== this.localNodeId) {
|
|
12364
|
-
logger$
|
|
12364
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12365
12365
|
channel: this.channelName,
|
|
12366
12366
|
connector_id: this.connectorId,
|
|
12367
12367
|
reason: 'unexpected_target',
|
|
@@ -12386,7 +12386,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12386
12386
|
return 'unknown';
|
|
12387
12387
|
}
|
|
12388
12388
|
logInboxSnapshot(event, extra = {}) {
|
|
12389
|
-
logger$
|
|
12389
|
+
logger$14.debug(event, {
|
|
12390
12390
|
channel: this.channelName,
|
|
12391
12391
|
connector_id: this.connectorId,
|
|
12392
12392
|
connector_state: this.state,
|
|
@@ -12402,7 +12402,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12402
12402
|
await super.start(inboundHandler);
|
|
12403
12403
|
// After transitioning to STARTED, check if tab is already hidden
|
|
12404
12404
|
if (typeof document !== 'undefined' && document.hidden) {
|
|
12405
|
-
logger$
|
|
12405
|
+
logger$14.debug('broadcast_channel_start_in_hidden_tab', {
|
|
12406
12406
|
channel: this.channelName,
|
|
12407
12407
|
connector_id: this.connectorId,
|
|
12408
12408
|
document_hidden: document.hidden,
|
|
@@ -12412,7 +12412,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12412
12412
|
});
|
|
12413
12413
|
// Immediately pause if tab is hidden at start time
|
|
12414
12414
|
await this.pause().catch((err) => {
|
|
12415
|
-
logger$
|
|
12415
|
+
logger$14.warning('broadcast_channel_initial_pause_failed', {
|
|
12416
12416
|
channel: this.channelName,
|
|
12417
12417
|
connector_id: this.connectorId,
|
|
12418
12418
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12430,7 +12430,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12430
12430
|
return;
|
|
12431
12431
|
}
|
|
12432
12432
|
this.targetNodeId = normalized;
|
|
12433
|
-
logger$
|
|
12433
|
+
logger$14.debug('broadcast_channel_target_updated', {
|
|
12434
12434
|
channel: this.channelName,
|
|
12435
12435
|
connector_id: this.connectorId,
|
|
12436
12436
|
local_node_id: this.localNodeId,
|
|
@@ -12440,7 +12440,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12440
12440
|
}
|
|
12441
12441
|
setWildcardTarget() {
|
|
12442
12442
|
this.targetNodeId = '*';
|
|
12443
|
-
logger$
|
|
12443
|
+
logger$14.debug('broadcast_channel_target_updated', {
|
|
12444
12444
|
channel: this.channelName,
|
|
12445
12445
|
connector_id: this.connectorId,
|
|
12446
12446
|
local_node_id: this.localNodeId,
|
|
@@ -12568,7 +12568,7 @@ function broadcastChannelGrantToConnectorConfig(grant) {
|
|
|
12568
12568
|
return config;
|
|
12569
12569
|
}
|
|
12570
12570
|
|
|
12571
|
-
const logger$
|
|
12571
|
+
const logger$13 = getLogger('naylence.fame.node.upstream_session_manager');
|
|
12572
12572
|
function isPlainRecord$4(value) {
|
|
12573
12573
|
if (typeof value !== 'object' || value === null) {
|
|
12574
12574
|
return false;
|
|
@@ -12689,7 +12689,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12689
12689
|
this.wrappedHandler = this.makeHeartbeatEnabledHandler(options.inboundHandler);
|
|
12690
12690
|
// Store the connection retry policy (can be null, in which case default behavior applies)
|
|
12691
12691
|
this.connectionRetryPolicy = options.retryPolicy ?? null;
|
|
12692
|
-
logger$
|
|
12692
|
+
logger$13.debug('created_upstream_session_manager', {
|
|
12693
12693
|
target_system_id: this.targetSystemId,
|
|
12694
12694
|
has_retry_policy: this.connectionRetryPolicy !== null,
|
|
12695
12695
|
});
|
|
@@ -12698,23 +12698,23 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12698
12698
|
return this.targetSystemId;
|
|
12699
12699
|
}
|
|
12700
12700
|
setupVisibilityListener() {
|
|
12701
|
-
logger$
|
|
12701
|
+
logger$13.debug('setup_visibility_listener_called', {
|
|
12702
12702
|
has_document: typeof document !== 'undefined',
|
|
12703
12703
|
});
|
|
12704
12704
|
if (typeof document !== 'undefined' && document.addEventListener) {
|
|
12705
12705
|
this._visibilityHandler = () => {
|
|
12706
|
-
logger$
|
|
12706
|
+
logger$13.debug('visibility_change_event_fired', {
|
|
12707
12707
|
state: document.visibilityState,
|
|
12708
12708
|
});
|
|
12709
12709
|
if (document.visibilityState === 'visible') {
|
|
12710
|
-
logger$
|
|
12710
|
+
logger$13.debug('visibility_change_detected_waking_up');
|
|
12711
12711
|
this.wakeEvent.set();
|
|
12712
12712
|
}
|
|
12713
12713
|
};
|
|
12714
12714
|
document.addEventListener('visibilitychange', this._visibilityHandler);
|
|
12715
12715
|
}
|
|
12716
12716
|
else {
|
|
12717
|
-
logger$
|
|
12717
|
+
logger$13.debug('setup_visibility_listener_skipped_no_document');
|
|
12718
12718
|
}
|
|
12719
12719
|
}
|
|
12720
12720
|
teardownVisibilityListener() {
|
|
@@ -12747,13 +12747,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12747
12747
|
}
|
|
12748
12748
|
throw new FameConnectError('Upstream session manager failed to attach');
|
|
12749
12749
|
}
|
|
12750
|
-
logger$
|
|
12750
|
+
logger$13.debug('upstream_session_manager_started');
|
|
12751
12751
|
}
|
|
12752
12752
|
getActiveConnector() {
|
|
12753
12753
|
return this.connector;
|
|
12754
12754
|
}
|
|
12755
12755
|
async stop() {
|
|
12756
|
-
logger$
|
|
12756
|
+
logger$13.debug('upstream_session_manager_stopping');
|
|
12757
12757
|
this.teardownVisibilityListener();
|
|
12758
12758
|
this.stopEvent.set();
|
|
12759
12759
|
this.currentStopSubtasks?.set();
|
|
@@ -12764,7 +12764,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12764
12764
|
}
|
|
12765
12765
|
catch (error) {
|
|
12766
12766
|
if (!(error instanceof TaskCancelledError)) {
|
|
12767
|
-
logger$
|
|
12767
|
+
logger$13.debug('fsm_task_stopped_with_error', {
|
|
12768
12768
|
error: error.message,
|
|
12769
12769
|
});
|
|
12770
12770
|
}
|
|
@@ -12773,13 +12773,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12773
12773
|
}
|
|
12774
12774
|
if (this.connector) {
|
|
12775
12775
|
await this.connector.stop().catch((error) => {
|
|
12776
|
-
logger$
|
|
12776
|
+
logger$13.debug('connector_stop_error', {
|
|
12777
12777
|
error: error.message,
|
|
12778
12778
|
});
|
|
12779
12779
|
});
|
|
12780
12780
|
this.connector = null;
|
|
12781
12781
|
}
|
|
12782
|
-
logger$
|
|
12782
|
+
logger$13.debug('upstream_session_manager_stopped');
|
|
12783
12783
|
}
|
|
12784
12784
|
async send(envelope) {
|
|
12785
12785
|
if (this.messageQueue.length >= UpstreamSessionManager.TX_QUEUE_MAX) {
|
|
@@ -12828,7 +12828,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12828
12828
|
const shouldFailFast = this.shouldFailFastOnError(error);
|
|
12829
12829
|
if (error instanceof FameTransportClose ||
|
|
12830
12830
|
error instanceof FameConnectError) {
|
|
12831
|
-
logger$
|
|
12831
|
+
logger$13.warning('upstream_link_closed', {
|
|
12832
12832
|
error: error.message,
|
|
12833
12833
|
will_retry: !shouldFailFast,
|
|
12834
12834
|
attempt: this.initialAttempts,
|
|
@@ -12841,13 +12841,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12841
12841
|
else {
|
|
12842
12842
|
const err = error;
|
|
12843
12843
|
if (err.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
12844
|
-
logger$
|
|
12844
|
+
logger$13.info('upstream_link_redirecting', {
|
|
12845
12845
|
error: err.message,
|
|
12846
12846
|
will_retry: true,
|
|
12847
12847
|
});
|
|
12848
12848
|
}
|
|
12849
12849
|
else {
|
|
12850
|
-
logger$
|
|
12850
|
+
logger$13.warning('upstream_link_closed', {
|
|
12851
12851
|
error: err.message,
|
|
12852
12852
|
will_retry: !shouldFailFast,
|
|
12853
12853
|
attempt: this.initialAttempts,
|
|
@@ -12891,7 +12891,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12891
12891
|
// If sleep was interrupted by visibility change (user returned to tab),
|
|
12892
12892
|
// reset backoff to initial delay for immediate retry with fresh backoff
|
|
12893
12893
|
if (wasWoken) {
|
|
12894
|
-
logger$
|
|
12894
|
+
logger$13.debug('backoff_reset_on_visibility_change', {
|
|
12895
12895
|
previous_delay: delay,
|
|
12896
12896
|
new_delay: UpstreamSessionManager.BACKOFF_INITIAL,
|
|
12897
12897
|
});
|
|
@@ -12910,7 +12910,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12910
12910
|
// Check if wake event is already set (e.g., visibility just changed)
|
|
12911
12911
|
if (this.wakeEvent.isSet()) {
|
|
12912
12912
|
this.wakeEvent.clear();
|
|
12913
|
-
logger$
|
|
12913
|
+
logger$13.debug('sleep_skipped_wake_event_pending');
|
|
12914
12914
|
return true;
|
|
12915
12915
|
}
|
|
12916
12916
|
let timeout;
|
|
@@ -12927,7 +12927,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12927
12927
|
]);
|
|
12928
12928
|
const wasWoken = this.wakeEvent.isSet();
|
|
12929
12929
|
if (wasWoken) {
|
|
12930
|
-
logger$
|
|
12930
|
+
logger$13.debug('sleep_interrupted_by_wake_event');
|
|
12931
12931
|
this.wakeEvent.clear();
|
|
12932
12932
|
}
|
|
12933
12933
|
if (timeout !== undefined) {
|
|
@@ -12990,7 +12990,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12990
12990
|
await connector.start(this.wrappedHandler);
|
|
12991
12991
|
this.connector = connector;
|
|
12992
12992
|
const callbackGrants = this.node.gatherSupportedCallbackGrants();
|
|
12993
|
-
logger$
|
|
12993
|
+
logger$13.debug('callback_grants_before_augmentation', {
|
|
12994
12994
|
count: callbackGrants.length,
|
|
12995
12995
|
types: callbackGrants.map((g) => g.type),
|
|
12996
12996
|
});
|
|
@@ -13000,7 +13000,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13000
13000
|
const broadcastCallbackGrant = shouldAddBroadcastGrant
|
|
13001
13001
|
? this.createBroadcastCallbackGrant(grant)
|
|
13002
13002
|
: null;
|
|
13003
|
-
logger$
|
|
13003
|
+
logger$13.debug('broadcast_callback_grant_check', {
|
|
13004
13004
|
should_add: shouldAddBroadcastGrant,
|
|
13005
13005
|
grant_created: !!broadcastCallbackGrant,
|
|
13006
13006
|
});
|
|
@@ -13019,12 +13019,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13019
13019
|
const isDuplicate = callbackGrants.some((existing) => JSON.stringify(existing) === JSON.stringify(grant));
|
|
13020
13020
|
if (!isDuplicate) {
|
|
13021
13021
|
callbackGrants.push(grant);
|
|
13022
|
-
logger$
|
|
13022
|
+
logger$13.debug('added_connection_grant_as_callback', {
|
|
13023
13023
|
type: grant.type,
|
|
13024
13024
|
});
|
|
13025
13025
|
}
|
|
13026
13026
|
else {
|
|
13027
|
-
logger$
|
|
13027
|
+
logger$13.debug('skipped_duplicate_connection_grant', {
|
|
13028
13028
|
type: grant.type,
|
|
13029
13029
|
});
|
|
13030
13030
|
}
|
|
@@ -13036,12 +13036,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13036
13036
|
if (broadcastCallbackGrant &&
|
|
13037
13037
|
this.shouldAdvertiseBroadcastGrant(grant, callbackGrants)) {
|
|
13038
13038
|
callbackGrants.push(broadcastCallbackGrant);
|
|
13039
|
-
logger$
|
|
13039
|
+
logger$13.debug('added_broadcast_callback_grant');
|
|
13040
13040
|
}
|
|
13041
13041
|
else if (broadcastCallbackGrant) {
|
|
13042
|
-
logger$
|
|
13042
|
+
logger$13.debug('skipped_duplicate_broadcast_callback_grant');
|
|
13043
13043
|
}
|
|
13044
|
-
logger$
|
|
13044
|
+
logger$13.debug('callback_grants_after_augmentation', {
|
|
13045
13045
|
count: callbackGrants.length,
|
|
13046
13046
|
types: callbackGrants.map((g) => g.type),
|
|
13047
13047
|
});
|
|
@@ -13054,7 +13054,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13054
13054
|
targetAware.setTargetNodeId(this.targetSystemId);
|
|
13055
13055
|
}
|
|
13056
13056
|
catch (error) {
|
|
13057
|
-
logger$
|
|
13057
|
+
logger$13.warning('broadcast_channel_target_apply_failed', {
|
|
13058
13058
|
error: error instanceof Error ? error.message : String(error),
|
|
13059
13059
|
target_node_id: this.targetSystemId,
|
|
13060
13060
|
});
|
|
@@ -13076,14 +13076,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13076
13076
|
});
|
|
13077
13077
|
}
|
|
13078
13078
|
else {
|
|
13079
|
-
logger$
|
|
13079
|
+
logger$13.warning('parent_epoch_changed', { epoch });
|
|
13080
13080
|
}
|
|
13081
13081
|
}
|
|
13082
13082
|
if (!this.readyEvent.isSet()) {
|
|
13083
13083
|
this.readyEvent.set();
|
|
13084
13084
|
}
|
|
13085
13085
|
if (this.messageQueue.length > 0) {
|
|
13086
|
-
logger$
|
|
13086
|
+
logger$13.debug('flushing_buffered_frames', {
|
|
13087
13087
|
queue_size: this.messageQueue.length,
|
|
13088
13088
|
});
|
|
13089
13089
|
this.queueEvent.set();
|
|
@@ -13100,12 +13100,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13100
13100
|
name: `expiry-guard-${this.connectEpoch}`,
|
|
13101
13101
|
});
|
|
13102
13102
|
if (this.hadSuccessfulAttach) {
|
|
13103
|
-
logger$
|
|
13103
|
+
logger$13.debug('reconnected_to_upstream', {
|
|
13104
13104
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13105
13105
|
});
|
|
13106
13106
|
}
|
|
13107
13107
|
else {
|
|
13108
|
-
logger$
|
|
13108
|
+
logger$13.debug('connected_to_upstream', {
|
|
13109
13109
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13110
13110
|
});
|
|
13111
13111
|
}
|
|
@@ -13123,18 +13123,18 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13123
13123
|
this.currentStopSubtasks = null;
|
|
13124
13124
|
await Promise.allSettled(tasks.map((task) => task.promise));
|
|
13125
13125
|
if (this.connector) {
|
|
13126
|
-
logger$
|
|
13126
|
+
logger$13.debug('upstream_stopping_old_connector', {
|
|
13127
13127
|
connect_epoch: this.connectEpoch,
|
|
13128
13128
|
target_system_id: this.targetSystemId,
|
|
13129
13129
|
timestamp: new Date().toISOString(),
|
|
13130
13130
|
});
|
|
13131
13131
|
await this.connector.stop().catch((err) => {
|
|
13132
|
-
logger$
|
|
13132
|
+
logger$13.warning('upstream_connector_stop_error', {
|
|
13133
13133
|
connect_epoch: this.connectEpoch,
|
|
13134
13134
|
error: err instanceof Error ? err.message : String(err),
|
|
13135
13135
|
});
|
|
13136
13136
|
});
|
|
13137
|
-
logger$
|
|
13137
|
+
logger$13.debug('upstream_old_connector_stopped', {
|
|
13138
13138
|
connect_epoch: this.connectEpoch,
|
|
13139
13139
|
target_system_id: this.targetSystemId,
|
|
13140
13140
|
timestamp: new Date().toISOString(),
|
|
@@ -13187,7 +13187,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13187
13187
|
});
|
|
13188
13188
|
}
|
|
13189
13189
|
catch (error) {
|
|
13190
|
-
logger$
|
|
13190
|
+
logger$13.debug('broadcast_callback_grant_generation_failed', {
|
|
13191
13191
|
error: error instanceof Error ? error.message : String(error),
|
|
13192
13192
|
});
|
|
13193
13193
|
return null;
|
|
@@ -13242,7 +13242,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13242
13242
|
}
|
|
13243
13243
|
}
|
|
13244
13244
|
async heartbeatLoop(connector, stopEvt, signal) {
|
|
13245
|
-
logger$
|
|
13245
|
+
logger$13.debug('starting_heartbeat_loop');
|
|
13246
13246
|
const intervalMs = UpstreamSessionManager.HEARTBEAT_INTERVAL * 1000;
|
|
13247
13247
|
const graceMs = intervalMs * UpstreamSessionManager.HEARTBEAT_GRACE;
|
|
13248
13248
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13278,7 +13278,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13278
13278
|
// Skip heartbeat if connector is paused (e.g., tab is hidden)
|
|
13279
13279
|
// Keep ack time current so we don't timeout immediately after resuming
|
|
13280
13280
|
if (currentState === core.ConnectorState.PAUSED) {
|
|
13281
|
-
logger$
|
|
13281
|
+
logger$13.debug('skipping_heartbeat_connector_paused', {
|
|
13282
13282
|
connector_state: currentState,
|
|
13283
13283
|
});
|
|
13284
13284
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13287,14 +13287,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13287
13287
|
// Reset ack time if just resumed from pause (prevents immediate timeout)
|
|
13288
13288
|
if (previousState === core.ConnectorState.PAUSED &&
|
|
13289
13289
|
currentState === core.ConnectorState.STARTED) {
|
|
13290
|
-
logger$
|
|
13290
|
+
logger$13.debug('connector_just_resumed_resetting_ack_time', {
|
|
13291
13291
|
previous_state: previousState,
|
|
13292
13292
|
current_state: currentState,
|
|
13293
13293
|
});
|
|
13294
13294
|
this.lastHeartbeatAckTime = Date.now();
|
|
13295
13295
|
}
|
|
13296
13296
|
const envelope = await this.makeHeartbeatEnvelope();
|
|
13297
|
-
logger$
|
|
13297
|
+
logger$13.debug('sending_heartbeat', {
|
|
13298
13298
|
hb_corr_id: envelope.corrId,
|
|
13299
13299
|
hb_env_id: envelope.id,
|
|
13300
13300
|
});
|
|
@@ -13320,7 +13320,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13320
13320
|
throw new FameConnectError('missed heartbeat acknowledgement');
|
|
13321
13321
|
}
|
|
13322
13322
|
}
|
|
13323
|
-
logger$
|
|
13323
|
+
logger$13.debug('completed_heartbeat_loop');
|
|
13324
13324
|
}
|
|
13325
13325
|
async messagePumpLoop(connector, stopEvt, signal) {
|
|
13326
13326
|
while (!stopEvt.isSet() && !signal?.aborted) {
|
|
@@ -13337,19 +13337,19 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13337
13337
|
if (!envelope) {
|
|
13338
13338
|
continue;
|
|
13339
13339
|
}
|
|
13340
|
-
logger$
|
|
13340
|
+
logger$13.debug('upstream_pump_sending_envelope', {
|
|
13341
13341
|
envelopeId: envelope.id,
|
|
13342
13342
|
type: envelope.frame?.type,
|
|
13343
13343
|
});
|
|
13344
13344
|
try {
|
|
13345
13345
|
await connector.send(envelope);
|
|
13346
|
-
logger$
|
|
13346
|
+
logger$13.debug('upstream_pump_sent_envelope', {
|
|
13347
13347
|
envelopeId: envelope.id,
|
|
13348
13348
|
});
|
|
13349
13349
|
}
|
|
13350
13350
|
catch (error) {
|
|
13351
13351
|
if (error instanceof FameMessageTooLarge) {
|
|
13352
|
-
logger$
|
|
13352
|
+
logger$13.error('failed_to_send_message', { error: error.message });
|
|
13353
13353
|
await this.handleMessageTooLarge(envelope, error.message);
|
|
13354
13354
|
}
|
|
13355
13355
|
else if (error instanceof FameTransportClose) {
|
|
@@ -13411,7 +13411,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13411
13411
|
await fabric.send(ackEnvelope);
|
|
13412
13412
|
}
|
|
13413
13413
|
catch (error) {
|
|
13414
|
-
logger$
|
|
13414
|
+
logger$13.warning('failed_to_send_nack', {
|
|
13415
13415
|
error: error.message,
|
|
13416
13416
|
});
|
|
13417
13417
|
}
|
|
@@ -13425,7 +13425,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13425
13425
|
timestamps.push(info.attachExpiresAt);
|
|
13426
13426
|
}
|
|
13427
13427
|
if (!timestamps.length) {
|
|
13428
|
-
logger$
|
|
13428
|
+
logger$13.debug('no_ttl_expiry_configured');
|
|
13429
13429
|
await this.waitEvent(stopEvt, signal);
|
|
13430
13430
|
return;
|
|
13431
13431
|
}
|
|
@@ -13434,7 +13434,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13434
13434
|
let delaySeconds = (earliest.getTime() - now.getTime()) / 1000 -
|
|
13435
13435
|
UpstreamSessionManager.JWT_REFRESH_SAFETY;
|
|
13436
13436
|
delaySeconds = Math.max(delaySeconds, UpstreamSessionManager.JWT_REFRESH_SAFETY);
|
|
13437
|
-
logger$
|
|
13437
|
+
logger$13.debug('ttl_expiry_guard_started', {
|
|
13438
13438
|
welcome_expires_at: welcome.frame.expiresAt ?? null,
|
|
13439
13439
|
attach_expires_at: info.attachExpiresAt?.toISOString?.() ?? null,
|
|
13440
13440
|
earliest_expiry: earliest.toISOString(),
|
|
@@ -13462,7 +13462,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13462
13462
|
}
|
|
13463
13463
|
}
|
|
13464
13464
|
if (!stopEvt.isSet()) {
|
|
13465
|
-
logger$
|
|
13465
|
+
logger$13.debug('ttl_expiry_triggered_reconnect', {
|
|
13466
13466
|
expires_at: earliest.toISOString(),
|
|
13467
13467
|
current_time: new Date().toISOString(),
|
|
13468
13468
|
seconds_before_expiry: UpstreamSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -13507,7 +13507,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13507
13507
|
}
|
|
13508
13508
|
await this.node.dispatchEnvelopeEvent('onEnvelopeReceived', this.node, env, context);
|
|
13509
13509
|
if (env.frame.type === 'NodeHeartbeatAck') {
|
|
13510
|
-
logger$
|
|
13510
|
+
logger$13.debug('received_heartbeat_ack', {
|
|
13511
13511
|
hb_ack_env_id: env.id,
|
|
13512
13512
|
hb_ack_corr_id: env.corrId,
|
|
13513
13513
|
hb_routing_epoch: env.frame.routingEpoch,
|
|
@@ -13521,7 +13521,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13521
13521
|
await this.onEpochChange(epoch);
|
|
13522
13522
|
}
|
|
13523
13523
|
else {
|
|
13524
|
-
logger$
|
|
13524
|
+
logger$13.warning('parent_epoch_changed', { epoch });
|
|
13525
13525
|
}
|
|
13526
13526
|
}
|
|
13527
13527
|
return;
|
|
@@ -13540,7 +13540,7 @@ UpstreamSessionManager.TX_QUEUE_MAX = 512;
|
|
|
13540
13540
|
UpstreamSessionManager.BACKOFF_INITIAL = 1; // seconds
|
|
13541
13541
|
UpstreamSessionManager.BACKOFF_CAP = 30; // seconds
|
|
13542
13542
|
|
|
13543
|
-
const logger$
|
|
13543
|
+
const logger$12 = getLogger('naylence.fame.node.admission.noop_admission_client');
|
|
13544
13544
|
class NoopAdmissionClient {
|
|
13545
13545
|
constructor(options = {}) {
|
|
13546
13546
|
this.hasUpstream = false;
|
|
@@ -13554,7 +13554,7 @@ class NoopAdmissionClient {
|
|
|
13554
13554
|
const acceptedLogicals = this.autoAcceptLogicals
|
|
13555
13555
|
? [...(requestedLogicals ?? [])]
|
|
13556
13556
|
: [];
|
|
13557
|
-
logger$
|
|
13557
|
+
logger$12.debug('noop_admission_hello', {
|
|
13558
13558
|
systemId: effectiveSystemId,
|
|
13559
13559
|
instanceId,
|
|
13560
13560
|
requestedLogicals,
|
|
@@ -13572,7 +13572,7 @@ class NoopAdmissionClient {
|
|
|
13572
13572
|
});
|
|
13573
13573
|
}
|
|
13574
13574
|
async close() {
|
|
13575
|
-
logger$
|
|
13575
|
+
logger$12.debug('noop_admission_close');
|
|
13576
13576
|
}
|
|
13577
13577
|
}
|
|
13578
13578
|
|
|
@@ -13778,7 +13778,7 @@ class DefaultServiceManager {
|
|
|
13778
13778
|
}
|
|
13779
13779
|
|
|
13780
13780
|
const SYSTEM_INBOX$1 = '__sys__';
|
|
13781
|
-
const logger$
|
|
13781
|
+
const logger$11 = getLogger('naylence.fame.node.node');
|
|
13782
13782
|
function isSnakeCase(name) {
|
|
13783
13783
|
return name.includes('_');
|
|
13784
13784
|
}
|
|
@@ -14048,7 +14048,7 @@ class FameNode extends TaskSpawner {
|
|
|
14048
14048
|
confirmIdentity(systemId, source) {
|
|
14049
14049
|
if (this._confirmedId) {
|
|
14050
14050
|
if (this._confirmedId !== systemId) {
|
|
14051
|
-
logger$
|
|
14051
|
+
logger$11.error('node_identity_mismatch', {
|
|
14052
14052
|
current_id: this._confirmedId,
|
|
14053
14053
|
new_id: systemId,
|
|
14054
14054
|
source,
|
|
@@ -14060,14 +14060,14 @@ class FameNode extends TaskSpawner {
|
|
|
14060
14060
|
const isReassignment = this._provisionalId !== systemId;
|
|
14061
14061
|
this._confirmedId = systemId;
|
|
14062
14062
|
if (isReassignment) {
|
|
14063
|
-
logger$
|
|
14063
|
+
logger$11.debug('node_identity_reassigned', {
|
|
14064
14064
|
system_id: systemId,
|
|
14065
14065
|
previous_id: this._provisionalId,
|
|
14066
14066
|
source,
|
|
14067
14067
|
});
|
|
14068
14068
|
}
|
|
14069
14069
|
else {
|
|
14070
|
-
logger$
|
|
14070
|
+
logger$11.debug('node_identity_confirmed', {
|
|
14071
14071
|
system_id: systemId,
|
|
14072
14072
|
source,
|
|
14073
14073
|
});
|
|
@@ -14135,7 +14135,7 @@ class FameNode extends TaskSpawner {
|
|
|
14135
14135
|
return;
|
|
14136
14136
|
}
|
|
14137
14137
|
if (frameType === 'NodeHeartbeat') {
|
|
14138
|
-
logger$
|
|
14138
|
+
logger$11.debug('received_heartbeat_frame', {
|
|
14139
14139
|
envelopeId: envelope.id,
|
|
14140
14140
|
corrId: envelope.corrId ?? null,
|
|
14141
14141
|
});
|
|
@@ -14147,7 +14147,7 @@ class FameNode extends TaskSpawner {
|
|
|
14147
14147
|
await this.handleDeliveryAck(envelope, context);
|
|
14148
14148
|
return;
|
|
14149
14149
|
}
|
|
14150
|
-
logger$
|
|
14150
|
+
logger$11.debug('unhandled_system_frame', {
|
|
14151
14151
|
envelopeId: envelope.id,
|
|
14152
14152
|
frameType,
|
|
14153
14153
|
});
|
|
@@ -14159,13 +14159,13 @@ class FameNode extends TaskSpawner {
|
|
|
14159
14159
|
}
|
|
14160
14160
|
await this._deliveryTracker.onEnvelopeDelivered(SYSTEM_INBOX$1, envelope, context);
|
|
14161
14161
|
if (frame.ok !== false) {
|
|
14162
|
-
logger$
|
|
14162
|
+
logger$11.debug('delivery_ack_received', {
|
|
14163
14163
|
envelopeId: envelope.id,
|
|
14164
14164
|
corrId: envelope.corrId ?? null,
|
|
14165
14165
|
});
|
|
14166
14166
|
return;
|
|
14167
14167
|
}
|
|
14168
|
-
logger$
|
|
14168
|
+
logger$11.warning('delivery_nack_received', {
|
|
14169
14169
|
envelopeId: envelope.id,
|
|
14170
14170
|
corrId: envelope.corrId ?? null,
|
|
14171
14171
|
code: frame.code ?? null,
|
|
@@ -14175,7 +14175,7 @@ class FameNode extends TaskSpawner {
|
|
|
14175
14175
|
await this.onDeliveryNack(frame, envelope, context);
|
|
14176
14176
|
}
|
|
14177
14177
|
async onDeliveryNack(frame, envelope, _context) {
|
|
14178
|
-
logger$
|
|
14178
|
+
logger$11.debug('delivery_nack_processed', {
|
|
14179
14179
|
envelopeId: envelope.id,
|
|
14180
14180
|
code: frame.code ?? null,
|
|
14181
14181
|
reason: frame.reason ?? null,
|
|
@@ -14290,7 +14290,7 @@ class FameNode extends TaskSpawner {
|
|
|
14290
14290
|
await this._bindingManager.restore();
|
|
14291
14291
|
await this._envelopeListenerManager.start();
|
|
14292
14292
|
this._isStarted = true;
|
|
14293
|
-
logger$
|
|
14293
|
+
logger$11.debug('node_started', {
|
|
14294
14294
|
node_id: this.id,
|
|
14295
14295
|
sid: this.sid,
|
|
14296
14296
|
path: this.physicalPath,
|
|
@@ -14322,7 +14322,7 @@ class FameNode extends TaskSpawner {
|
|
|
14322
14322
|
await this._serviceManager.stop();
|
|
14323
14323
|
await this.dispatchEvent('onNodeStopped', this);
|
|
14324
14324
|
this._isStarted = false;
|
|
14325
|
-
logger$
|
|
14325
|
+
logger$11.debug('node_stopped', {
|
|
14326
14326
|
node_id: this.id,
|
|
14327
14327
|
});
|
|
14328
14328
|
}
|
|
@@ -14512,20 +14512,20 @@ class FameNode extends TaskSpawner {
|
|
|
14512
14512
|
await this.forwardUpstream(processedEnvelope, context);
|
|
14513
14513
|
}
|
|
14514
14514
|
else {
|
|
14515
|
-
logger$
|
|
14515
|
+
logger$11.error('attempted_upstream_loop', {
|
|
14516
14516
|
envelopeId: processedEnvelope.id,
|
|
14517
14517
|
});
|
|
14518
14518
|
}
|
|
14519
14519
|
return;
|
|
14520
14520
|
}
|
|
14521
14521
|
if (!processedEnvelope.to) {
|
|
14522
|
-
logger$
|
|
14522
|
+
logger$11.error('dropping_envelope_without_destination', {
|
|
14523
14523
|
envelopeId: processedEnvelope.id,
|
|
14524
14524
|
capabilities: processedEnvelope.capabilities ?? [],
|
|
14525
14525
|
});
|
|
14526
14526
|
return;
|
|
14527
14527
|
}
|
|
14528
|
-
logger$
|
|
14528
|
+
logger$11.warning('no_local_handler_for_address', {
|
|
14529
14529
|
address: processedEnvelope.to.toString?.() ?? String(processedEnvelope.to),
|
|
14530
14530
|
originType: context?.originType ?? null,
|
|
14531
14531
|
});
|
|
@@ -14649,7 +14649,7 @@ class FameNode extends TaskSpawner {
|
|
|
14649
14649
|
}
|
|
14650
14650
|
}
|
|
14651
14651
|
catch (error) {
|
|
14652
|
-
logger$
|
|
14652
|
+
logger$11.warning('callback_grant_collection_failed', {
|
|
14653
14653
|
error: error instanceof Error ? error.message : String(error),
|
|
14654
14654
|
});
|
|
14655
14655
|
}
|
|
@@ -14712,7 +14712,7 @@ class FameNode extends TaskSpawner {
|
|
|
14712
14712
|
await store.set('self', record);
|
|
14713
14713
|
}
|
|
14714
14714
|
catch (error) {
|
|
14715
|
-
logger$
|
|
14715
|
+
logger$11.warning('node_meta_persist_failed', {
|
|
14716
14716
|
error: error instanceof Error ? error.message : String(error),
|
|
14717
14717
|
});
|
|
14718
14718
|
}
|
|
@@ -14850,44 +14850,12 @@ class ConnectionRetryPolicyFactory extends factory.AbstractResourceFactory {
|
|
|
14850
14850
|
}
|
|
14851
14851
|
}
|
|
14852
14852
|
|
|
14853
|
-
|
|
14854
|
-
|
|
14855
|
-
|
|
14856
|
-
|
|
14857
|
-
|
|
14858
|
-
|
|
14859
|
-
throw new Error('Failed to create token provider from configuration');
|
|
14860
|
-
}
|
|
14861
|
-
return provider;
|
|
14862
|
-
}
|
|
14863
|
-
let provider = null;
|
|
14864
|
-
try {
|
|
14865
|
-
provider = await factory.createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
14866
|
-
}
|
|
14867
|
-
catch (error) {
|
|
14868
|
-
const message = 'Failed to create default token provider' +
|
|
14869
|
-
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
14870
|
-
throw new Error(message);
|
|
14871
|
-
}
|
|
14872
|
-
if (!provider) {
|
|
14873
|
-
throw new Error('Failed to create default token provider');
|
|
14874
|
-
}
|
|
14875
|
-
return provider;
|
|
14876
|
-
}
|
|
14877
|
-
}
|
|
14878
|
-
|
|
14879
|
-
function isTokenProvider(candidate) {
|
|
14880
|
-
return (typeof candidate === 'object' &&
|
|
14881
|
-
candidate !== null &&
|
|
14882
|
-
typeof candidate.getToken === 'function');
|
|
14883
|
-
}
|
|
14884
|
-
function isIdentityExposingTokenProvider(candidate) {
|
|
14885
|
-
return (isTokenProvider(candidate) &&
|
|
14886
|
-
typeof candidate.getIdentity ===
|
|
14887
|
-
'function');
|
|
14888
|
-
}
|
|
14889
|
-
|
|
14890
|
-
const logger$11 = getLogger('naylence.fame.node.default_node_identity_policy');
|
|
14853
|
+
/**
|
|
14854
|
+
* Default node identity policy that preserves the current node ID.
|
|
14855
|
+
*
|
|
14856
|
+
* This policy does NOT derive identity from tokens or grants.
|
|
14857
|
+
* For token-subject-based identity, use TokenSubjectNodeIdentityPolicy.
|
|
14858
|
+
*/
|
|
14891
14859
|
class DefaultNodeIdentityPolicy {
|
|
14892
14860
|
async resolveInitialNodeId(context) {
|
|
14893
14861
|
if (context.configuredId) {
|
|
@@ -14899,44 +14867,10 @@ class DefaultNodeIdentityPolicy {
|
|
|
14899
14867
|
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
14900
14868
|
}
|
|
14901
14869
|
async resolveAdmissionNodeId(context) {
|
|
14902
|
-
|
|
14903
|
-
|
|
14904
|
-
for (const grant of context.grants) {
|
|
14905
|
-
try {
|
|
14906
|
-
const auth = grant.auth;
|
|
14907
|
-
if (!auth) {
|
|
14908
|
-
continue;
|
|
14909
|
-
}
|
|
14910
|
-
const tokenProviderConfig = (auth.tokenProvider ??
|
|
14911
|
-
auth.token_provider);
|
|
14912
|
-
if (!tokenProviderConfig ||
|
|
14913
|
-
typeof tokenProviderConfig.type !== 'string') {
|
|
14914
|
-
continue;
|
|
14915
|
-
}
|
|
14916
|
-
const provider = await TokenProviderFactory.createTokenProvider(tokenProviderConfig);
|
|
14917
|
-
if (isIdentityExposingTokenProvider(provider)) {
|
|
14918
|
-
const identity = await provider.getIdentity();
|
|
14919
|
-
if (identity && identity.subject) {
|
|
14920
|
-
logger$11.debug('identity_extracted_from_grant', {
|
|
14921
|
-
identity_id: identity.subject,
|
|
14922
|
-
grant_type: grant.type,
|
|
14923
|
-
});
|
|
14924
|
-
return identity.subject;
|
|
14925
|
-
}
|
|
14926
|
-
}
|
|
14927
|
-
}
|
|
14928
|
-
catch (error) {
|
|
14929
|
-
logger$11.warning('identity_extraction_failed', {
|
|
14930
|
-
error: error instanceof Error ? error.message : String(error),
|
|
14931
|
-
grant_type: grant.type,
|
|
14932
|
-
});
|
|
14933
|
-
}
|
|
14934
|
-
}
|
|
14935
|
-
}
|
|
14936
|
-
if (!context.currentNodeId) {
|
|
14937
|
-
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
14870
|
+
if (context.currentNodeId) {
|
|
14871
|
+
return context.currentNodeId;
|
|
14938
14872
|
}
|
|
14939
|
-
return
|
|
14873
|
+
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
14940
14874
|
}
|
|
14941
14875
|
}
|
|
14942
14876
|
|
|
@@ -17704,6 +17638,43 @@ var defaultNodeIdentityPolicyFactory = /*#__PURE__*/Object.freeze({
|
|
|
17704
17638
|
default: DefaultNodeIdentityPolicyFactory
|
|
17705
17639
|
});
|
|
17706
17640
|
|
|
17641
|
+
const TOKEN_PROVIDER_FACTORY_BASE_TYPE = 'TokenProviderFactory';
|
|
17642
|
+
class TokenProviderFactory extends factory.AbstractResourceFactory {
|
|
17643
|
+
static async createTokenProvider(config, options = {}) {
|
|
17644
|
+
if (config) {
|
|
17645
|
+
const provider = await factory.createResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, config, options);
|
|
17646
|
+
if (!provider) {
|
|
17647
|
+
throw new Error('Failed to create token provider from configuration');
|
|
17648
|
+
}
|
|
17649
|
+
return provider;
|
|
17650
|
+
}
|
|
17651
|
+
let provider = null;
|
|
17652
|
+
try {
|
|
17653
|
+
provider = await factory.createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
17654
|
+
}
|
|
17655
|
+
catch (error) {
|
|
17656
|
+
const message = 'Failed to create default token provider' +
|
|
17657
|
+
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
17658
|
+
throw new Error(message);
|
|
17659
|
+
}
|
|
17660
|
+
if (!provider) {
|
|
17661
|
+
throw new Error('Failed to create default token provider');
|
|
17662
|
+
}
|
|
17663
|
+
return provider;
|
|
17664
|
+
}
|
|
17665
|
+
}
|
|
17666
|
+
|
|
17667
|
+
function isTokenProvider(candidate) {
|
|
17668
|
+
return (typeof candidate === 'object' &&
|
|
17669
|
+
candidate !== null &&
|
|
17670
|
+
typeof candidate.getToken === 'function');
|
|
17671
|
+
}
|
|
17672
|
+
function isIdentityExposingTokenProvider(candidate) {
|
|
17673
|
+
return (isTokenProvider(candidate) &&
|
|
17674
|
+
typeof candidate.getIdentity ===
|
|
17675
|
+
'function');
|
|
17676
|
+
}
|
|
17677
|
+
|
|
17707
17678
|
const logger$Y = getLogger('naylence.fame.node.token_subject_node_identity_policy');
|
|
17708
17679
|
class TokenSubjectNodeIdentityPolicy {
|
|
17709
17680
|
async resolveInitialNodeId(context) {
|