@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.mjs
CHANGED
|
@@ -724,7 +724,7 @@ class TaskCancelledError extends Error {
|
|
|
724
724
|
* Provides functionality similar to Python's asyncio TaskSpawner with proper
|
|
725
725
|
* error handling, cancellation, and graceful shutdown capabilities.
|
|
726
726
|
*/
|
|
727
|
-
const logger$
|
|
727
|
+
const logger$1l = getLogger('naylence.fame.util.task_spawner');
|
|
728
728
|
function firstDefined(source, keys) {
|
|
729
729
|
for (const key of keys) {
|
|
730
730
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
@@ -885,7 +885,7 @@ class TaskSpawner {
|
|
|
885
885
|
const taskId = `task-${++this._taskCounter}`;
|
|
886
886
|
const taskName = normalizedOptions.name || `unnamed-${taskId}`;
|
|
887
887
|
const timeout = normalizedOptions.timeout ?? this._config.defaultTimeout;
|
|
888
|
-
logger$
|
|
888
|
+
logger$1l.debug('starting_background_task', {
|
|
889
889
|
task_name: taskName,
|
|
890
890
|
task_id: taskId,
|
|
891
891
|
});
|
|
@@ -902,7 +902,7 @@ class TaskSpawner {
|
|
|
902
902
|
task.promise
|
|
903
903
|
.then(() => {
|
|
904
904
|
if (!this._suppressCompletionLogging) {
|
|
905
|
-
logger$
|
|
905
|
+
logger$1l.debug('task_completed_successfully', {
|
|
906
906
|
task_name: taskName,
|
|
907
907
|
task_id: taskId,
|
|
908
908
|
duration_ms: Date.now() - task.startTime,
|
|
@@ -956,7 +956,7 @@ class TaskSpawner {
|
|
|
956
956
|
error.name === 'AbortError' ||
|
|
957
957
|
error.message === 'Task cancelled' ||
|
|
958
958
|
error.message === 'Aborted') {
|
|
959
|
-
logger$
|
|
959
|
+
logger$1l.debug('task_cancelled', {
|
|
960
960
|
task_name: taskName,
|
|
961
961
|
note: 'Task cancelled as requested',
|
|
962
962
|
});
|
|
@@ -964,7 +964,7 @@ class TaskSpawner {
|
|
|
964
964
|
}
|
|
965
965
|
// Handle timeout
|
|
966
966
|
if (error instanceof TaskTimeoutError) {
|
|
967
|
-
logger$
|
|
967
|
+
logger$1l.warning('task_timed_out', {
|
|
968
968
|
task_name: taskName,
|
|
969
969
|
error: error.message,
|
|
970
970
|
});
|
|
@@ -976,7 +976,7 @@ class TaskSpawner {
|
|
|
976
976
|
// Handle known WebSocket shutdown race condition (similar to Python version)
|
|
977
977
|
if (error.message.includes("await wasn't used with future") ||
|
|
978
978
|
error.message.includes('WebSocket closed during receive')) {
|
|
979
|
-
logger$
|
|
979
|
+
logger$1l.debug('task_shutdown_race_condition_handled', {
|
|
980
980
|
task_name: taskName,
|
|
981
981
|
note: 'Normal WebSocket close timing during shutdown - not an error',
|
|
982
982
|
});
|
|
@@ -986,7 +986,7 @@ class TaskSpawner {
|
|
|
986
986
|
if (error.name === 'FameTransportClose' ||
|
|
987
987
|
error.message.includes('normal closure') ||
|
|
988
988
|
error.message.includes('Connection closed')) {
|
|
989
|
-
logger$
|
|
989
|
+
logger$1l.debug('task_shutdown_completed_normally', {
|
|
990
990
|
task_name: taskName,
|
|
991
991
|
note: 'Task closed normally during shutdown',
|
|
992
992
|
});
|
|
@@ -994,7 +994,7 @@ class TaskSpawner {
|
|
|
994
994
|
}
|
|
995
995
|
// Handle PKCE redirect "errors" as info
|
|
996
996
|
if (error.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
997
|
-
logger$
|
|
997
|
+
logger$1l.debug('background_task_redirecting', {
|
|
998
998
|
task_name: taskName,
|
|
999
999
|
note: 'Task interrupted for PKCE redirect',
|
|
1000
1000
|
});
|
|
@@ -1007,14 +1007,14 @@ class TaskSpawner {
|
|
|
1007
1007
|
// Log retriable errors as warnings (they'll be retried by upstream logic)
|
|
1008
1008
|
// Log non-retriable errors as errors (fatal failures)
|
|
1009
1009
|
if (isRetriableError) {
|
|
1010
|
-
logger$
|
|
1010
|
+
logger$1l.warning('background_task_failed', {
|
|
1011
1011
|
task_name: taskName,
|
|
1012
1012
|
error: error.message,
|
|
1013
1013
|
retriable: true,
|
|
1014
1014
|
});
|
|
1015
1015
|
}
|
|
1016
1016
|
else {
|
|
1017
|
-
logger$
|
|
1017
|
+
logger$1l.error('background_task_failed', {
|
|
1018
1018
|
task_name: taskName,
|
|
1019
1019
|
error: error.message,
|
|
1020
1020
|
stack: error.stack,
|
|
@@ -1033,11 +1033,11 @@ class TaskSpawner {
|
|
|
1033
1033
|
async shutdownTasks(options = {}) {
|
|
1034
1034
|
const { gracePeriod, cancelHanging, joinTimeout } = normalizeShutdownOptions(options);
|
|
1035
1035
|
if (this._tasks.size === 0) {
|
|
1036
|
-
logger$
|
|
1036
|
+
logger$1l.debug('shutdown_tasks_no_tasks_to_shutdown');
|
|
1037
1037
|
return;
|
|
1038
1038
|
}
|
|
1039
1039
|
this._suppressCompletionLogging = true;
|
|
1040
|
-
logger$
|
|
1040
|
+
logger$1l.debug('shutting_down_tasks', {
|
|
1041
1041
|
task_count: this._tasks.size,
|
|
1042
1042
|
task_names: Array.from(this._tasks.values()).map((t) => t.name),
|
|
1043
1043
|
grace_period_ms: gracePeriod,
|
|
@@ -1052,7 +1052,7 @@ class TaskSpawner {
|
|
|
1052
1052
|
if (cancelHanging) {
|
|
1053
1053
|
const stillRunning = tasks.filter((task) => task.getState() === TaskState.RUNNING && !completed.has(task));
|
|
1054
1054
|
if (stillRunning.length > 0) {
|
|
1055
|
-
logger$
|
|
1055
|
+
logger$1l.debug('tasks_did_not_complete_within_grace_period', {
|
|
1056
1056
|
hanging_count: stillRunning.length,
|
|
1057
1057
|
});
|
|
1058
1058
|
// Wait for them to finish with individual timeouts
|
|
@@ -1062,7 +1062,7 @@ class TaskSpawner {
|
|
|
1062
1062
|
}
|
|
1063
1063
|
catch (error) {
|
|
1064
1064
|
if (error instanceof TaskTimeoutError) {
|
|
1065
|
-
logger$
|
|
1065
|
+
logger$1l.warning('task_did_not_shutdown', {
|
|
1066
1066
|
task_name: task.name || task.id,
|
|
1067
1067
|
join_timeout_ms: joinTimeout,
|
|
1068
1068
|
});
|
|
@@ -1073,7 +1073,7 @@ class TaskSpawner {
|
|
|
1073
1073
|
}
|
|
1074
1074
|
else if (!(error instanceof TaskCancelledError)) {
|
|
1075
1075
|
/* istanbul ignore next - unreachable defensive branch */
|
|
1076
|
-
logger$
|
|
1076
|
+
logger$1l.error('task_raised_during_cancellation', {
|
|
1077
1077
|
task_name: task.name || task.id,
|
|
1078
1078
|
error: error instanceof Error ? error.message : String(error),
|
|
1079
1079
|
});
|
|
@@ -1192,7 +1192,7 @@ class TaskSpawner {
|
|
|
1192
1192
|
* condition/promise and ensure at most one notifier coroutine exists for a
|
|
1193
1193
|
* flow at any time.
|
|
1194
1194
|
*/
|
|
1195
|
-
const logger$
|
|
1195
|
+
const logger$1k = getLogger('naylence.fame.flow.flow_controller');
|
|
1196
1196
|
/**
|
|
1197
1197
|
* Simple condition variable implementation for TypeScript/Node.js
|
|
1198
1198
|
* Similar to Python's asyncio.Condition
|
|
@@ -1326,7 +1326,7 @@ class FlowController {
|
|
|
1326
1326
|
const newBalance = Math.max(0, Math.min(this.initialWindow, prev + delta));
|
|
1327
1327
|
this.credits.set(flowId, newBalance);
|
|
1328
1328
|
const crossedZero = prev <= 0 && newBalance > 0;
|
|
1329
|
-
logger$
|
|
1329
|
+
logger$1k.debug('flow_controller_add_credits', {
|
|
1330
1330
|
flow_id: flowId,
|
|
1331
1331
|
delta,
|
|
1332
1332
|
prev_balance: prev,
|
|
@@ -1346,12 +1346,12 @@ class FlowController {
|
|
|
1346
1346
|
async acquire(flowId) {
|
|
1347
1347
|
this.ensureFlow(flowId);
|
|
1348
1348
|
const condition = this.conditions.get(flowId);
|
|
1349
|
-
logger$
|
|
1349
|
+
logger$1k.debug('flow_controller_acquire_attempt', {
|
|
1350
1350
|
flow_id: flowId,
|
|
1351
1351
|
current_balance: this.credits.get(flowId),
|
|
1352
1352
|
});
|
|
1353
1353
|
while (this.credits.get(flowId) <= 0) {
|
|
1354
|
-
logger$
|
|
1354
|
+
logger$1k.debug('flow_controller_waiting_for_credits', {
|
|
1355
1355
|
flow_id: flowId,
|
|
1356
1356
|
current_balance: this.credits.get(flowId),
|
|
1357
1357
|
});
|
|
@@ -1359,12 +1359,12 @@ class FlowController {
|
|
|
1359
1359
|
}
|
|
1360
1360
|
const newBalance = this.credits.get(flowId) - 1;
|
|
1361
1361
|
this.credits.set(flowId, newBalance);
|
|
1362
|
-
logger$
|
|
1362
|
+
logger$1k.debug('flow_controller_acquire_success', {
|
|
1363
1363
|
flow_id: flowId,
|
|
1364
1364
|
new_balance: newBalance,
|
|
1365
1365
|
});
|
|
1366
1366
|
if (newBalance <= this.lowWatermark) {
|
|
1367
|
-
logger$
|
|
1367
|
+
logger$1k.debug('flow_controller_acquire_below_low_watermark', {
|
|
1368
1368
|
flow_id: flowId,
|
|
1369
1369
|
low_watermark: this.lowWatermark,
|
|
1370
1370
|
});
|
|
@@ -1388,7 +1388,7 @@ class FlowController {
|
|
|
1388
1388
|
const current = this.credits.get(flowId);
|
|
1389
1389
|
const remaining = Math.max(current - credits, 0);
|
|
1390
1390
|
this.credits.set(flowId, remaining);
|
|
1391
|
-
logger$
|
|
1391
|
+
logger$1k.debug('flow_controller_consume', {
|
|
1392
1392
|
flow_id: flowId,
|
|
1393
1393
|
requested: credits,
|
|
1394
1394
|
prev_balance: current,
|
|
@@ -1414,7 +1414,7 @@ class FlowController {
|
|
|
1414
1414
|
this.windowIds.delete(flowId);
|
|
1415
1415
|
this.credits.set(flowId, this.initialWindow);
|
|
1416
1416
|
this.wakeWaiters(flowId);
|
|
1417
|
-
logger$
|
|
1417
|
+
logger$1k.debug('flow_controller_flow_reset', {
|
|
1418
1418
|
flow_id: flowId,
|
|
1419
1419
|
reset_balance: this.initialWindow,
|
|
1420
1420
|
});
|
|
@@ -2046,7 +2046,7 @@ class TaskCancellationError extends Error {
|
|
|
2046
2046
|
this.name = 'TaskCancellationError';
|
|
2047
2047
|
}
|
|
2048
2048
|
}
|
|
2049
|
-
const logger$
|
|
2049
|
+
const logger$1j = getLogger('naylence.fame.connector.base_async_connector');
|
|
2050
2050
|
// Environment variables
|
|
2051
2051
|
const ENV_VAR_FAME_FLOW_CONTROL = 'FAME_FLOW_CONTROL';
|
|
2052
2052
|
const FLOW_CONTROL_ENABLED = typeof process !== 'undefined' && process?.env
|
|
@@ -2129,7 +2129,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2129
2129
|
if (this._state !== newState) {
|
|
2130
2130
|
const oldState = this._state;
|
|
2131
2131
|
this._state = newState;
|
|
2132
|
-
logger$
|
|
2132
|
+
logger$1j.debug('connector_state_transition', {
|
|
2133
2133
|
connector_id: this._connectorFlowId,
|
|
2134
2134
|
old_state: oldState,
|
|
2135
2135
|
new_state: newState,
|
|
@@ -2168,12 +2168,12 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2168
2168
|
* Stop the connector gracefully
|
|
2169
2169
|
*/
|
|
2170
2170
|
async stop() {
|
|
2171
|
-
logger$
|
|
2171
|
+
logger$1j.debug('stopping_connector', {
|
|
2172
2172
|
current_state: this._state,
|
|
2173
2173
|
connector_id: this._connectorFlowId,
|
|
2174
2174
|
});
|
|
2175
2175
|
if (!ConnectorStateUtils.canStop(this._state)) {
|
|
2176
|
-
logger$
|
|
2176
|
+
logger$1j.debug('connector_stop_already_stopped', {
|
|
2177
2177
|
current_state: this._state,
|
|
2178
2178
|
connector_id: this._connectorFlowId,
|
|
2179
2179
|
});
|
|
@@ -2184,7 +2184,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2184
2184
|
if (this._lastError) {
|
|
2185
2185
|
throw this._lastError;
|
|
2186
2186
|
}
|
|
2187
|
-
logger$
|
|
2187
|
+
logger$1j.debug('connector_stopped', {
|
|
2188
2188
|
current_state: this._state,
|
|
2189
2189
|
connector_id: this._connectorFlowId,
|
|
2190
2190
|
});
|
|
@@ -2193,19 +2193,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2193
2193
|
* Pause the connector (suspends heartbeat and housekeeping, but keeps connection alive)
|
|
2194
2194
|
*/
|
|
2195
2195
|
async pause() {
|
|
2196
|
-
logger$
|
|
2196
|
+
logger$1j.debug('pausing_connector', {
|
|
2197
2197
|
current_state: this._state,
|
|
2198
2198
|
connector_id: this._connectorFlowId,
|
|
2199
2199
|
});
|
|
2200
2200
|
if (this._state !== ConnectorState.STARTED) {
|
|
2201
|
-
logger$
|
|
2201
|
+
logger$1j.debug('connector_pause_invalid_state', {
|
|
2202
2202
|
current_state: this._state,
|
|
2203
2203
|
connector_id: this._connectorFlowId,
|
|
2204
2204
|
});
|
|
2205
2205
|
return;
|
|
2206
2206
|
}
|
|
2207
2207
|
this._setState(ConnectorState.PAUSED);
|
|
2208
|
-
logger$
|
|
2208
|
+
logger$1j.debug('connector_paused', {
|
|
2209
2209
|
current_state: this._state,
|
|
2210
2210
|
connector_id: this._connectorFlowId,
|
|
2211
2211
|
});
|
|
@@ -2214,19 +2214,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2214
2214
|
* Resume the connector from paused state
|
|
2215
2215
|
*/
|
|
2216
2216
|
async resume() {
|
|
2217
|
-
logger$
|
|
2217
|
+
logger$1j.debug('resuming_connector', {
|
|
2218
2218
|
current_state: this._state,
|
|
2219
2219
|
connector_id: this._connectorFlowId,
|
|
2220
2220
|
});
|
|
2221
2221
|
if (this._state !== ConnectorState.PAUSED) {
|
|
2222
|
-
logger$
|
|
2222
|
+
logger$1j.debug('connector_resume_invalid_state', {
|
|
2223
2223
|
current_state: this._state,
|
|
2224
2224
|
connector_id: this._connectorFlowId,
|
|
2225
2225
|
});
|
|
2226
2226
|
return;
|
|
2227
2227
|
}
|
|
2228
2228
|
this._setState(ConnectorState.STARTED);
|
|
2229
|
-
logger$
|
|
2229
|
+
logger$1j.debug('connector_resumed', {
|
|
2230
2230
|
current_state: this._state,
|
|
2231
2231
|
connector_id: this._connectorFlowId,
|
|
2232
2232
|
});
|
|
@@ -2236,7 +2236,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2236
2236
|
*/
|
|
2237
2237
|
async close(code = 1000, reason = 'normal closure') {
|
|
2238
2238
|
if (!ConnectorStateUtils.canClose(this._state)) {
|
|
2239
|
-
logger$
|
|
2239
|
+
logger$1j.warning('connector_close_invalid_state', {
|
|
2240
2240
|
current_state: this._state,
|
|
2241
2241
|
connector_id: this._connectorFlowId,
|
|
2242
2242
|
});
|
|
@@ -2317,7 +2317,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2317
2317
|
// Add to queue and notify send loop
|
|
2318
2318
|
this._sendQueue.push(raw);
|
|
2319
2319
|
// Log for debugging
|
|
2320
|
-
logger$
|
|
2320
|
+
logger$1j.debug('send_envelope_queued', {
|
|
2321
2321
|
queue_length: this._sendQueue.length,
|
|
2322
2322
|
max_queue_size: this._maxQueueSize,
|
|
2323
2323
|
});
|
|
@@ -2366,14 +2366,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2366
2366
|
const item = this._sendQueue[0];
|
|
2367
2367
|
if (!item)
|
|
2368
2368
|
continue;
|
|
2369
|
-
logger$
|
|
2369
|
+
logger$1j.debug('send_loop_processing_item', {
|
|
2370
2370
|
queue_length_before_send: this._sendQueue.length,
|
|
2371
2371
|
});
|
|
2372
2372
|
// Send through transport (this may block)
|
|
2373
2373
|
await this._transportSendBytes(item);
|
|
2374
2374
|
// Only remove from queue after successful send
|
|
2375
2375
|
this._sendQueue.shift();
|
|
2376
|
-
logger$
|
|
2376
|
+
logger$1j.debug('send_loop_item_sent', {
|
|
2377
2377
|
queue_length_after_send: this._sendQueue.length,
|
|
2378
2378
|
});
|
|
2379
2379
|
}
|
|
@@ -2386,14 +2386,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2386
2386
|
}
|
|
2387
2387
|
else if (error instanceof TaskCancellationError) {
|
|
2388
2388
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
2389
|
-
logger$
|
|
2389
|
+
logger$1j.debug('send loop cancelled', {
|
|
2390
2390
|
connector: this.constructor.name,
|
|
2391
2391
|
reason: error.message,
|
|
2392
2392
|
});
|
|
2393
2393
|
// Don't re-throw - this is normal during shutdown
|
|
2394
2394
|
}
|
|
2395
2395
|
else {
|
|
2396
|
-
logger$
|
|
2396
|
+
logger$1j.critical('unexpected exception in send loop', {
|
|
2397
2397
|
connector: this.constructor.name,
|
|
2398
2398
|
error: error instanceof Error ? error.message : String(error),
|
|
2399
2399
|
});
|
|
@@ -2434,7 +2434,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2434
2434
|
env = JSON.parse(jsonStr);
|
|
2435
2435
|
}
|
|
2436
2436
|
catch (error) {
|
|
2437
|
-
logger$
|
|
2437
|
+
logger$1j.error('Invalid envelope', {
|
|
2438
2438
|
message: message.toString(),
|
|
2439
2439
|
error: error instanceof Error ? error.message : String(error),
|
|
2440
2440
|
});
|
|
@@ -2458,7 +2458,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2458
2458
|
};
|
|
2459
2459
|
await withEnvelopeContextAsync(envelopeContext, async () => {
|
|
2460
2460
|
const prettyEnvelope = prettyModel$1(env);
|
|
2461
|
-
logger$
|
|
2461
|
+
logger$1j.trace('connector_received_envelope', {
|
|
2462
2462
|
envelope: env,
|
|
2463
2463
|
pretty: prettyEnvelope,
|
|
2464
2464
|
});
|
|
@@ -2487,7 +2487,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2487
2487
|
if (error instanceof TaskCancellationError) {
|
|
2488
2488
|
throw error;
|
|
2489
2489
|
}
|
|
2490
|
-
logger$
|
|
2490
|
+
logger$1j.error('handler_failed', {
|
|
2491
2491
|
error: error instanceof Error ? error.message : String(error),
|
|
2492
2492
|
envelope_id: env.id ?? null,
|
|
2493
2493
|
trace_id: env.traceId ?? null,
|
|
@@ -2508,14 +2508,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2508
2508
|
}
|
|
2509
2509
|
else if (error instanceof TaskCancellationError) {
|
|
2510
2510
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
2511
|
-
logger$
|
|
2511
|
+
logger$1j.debug('receive loop cancelled', {
|
|
2512
2512
|
connector: this.constructor.name,
|
|
2513
2513
|
reason: error.message,
|
|
2514
2514
|
});
|
|
2515
2515
|
// Don't re-throw - this is normal during shutdown
|
|
2516
2516
|
}
|
|
2517
2517
|
else {
|
|
2518
|
-
logger$
|
|
2518
|
+
logger$1j.critical('unexpected_error_in recv_loop', {
|
|
2519
2519
|
error: error instanceof Error ? error.message : String(error),
|
|
2520
2520
|
});
|
|
2521
2521
|
throw error;
|
|
@@ -2531,7 +2531,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2531
2531
|
async _maybeEmitCredit(flowId, traceId) {
|
|
2532
2532
|
const remainingCredits = this._flowCtrl.getCredits(flowId);
|
|
2533
2533
|
const needsRefill = this._flowCtrl.needsRefill(flowId);
|
|
2534
|
-
logger$
|
|
2534
|
+
logger$1j.debug('maybe_emit_credit_check', {
|
|
2535
2535
|
connector_id: this._connectorFlowId,
|
|
2536
2536
|
flow_id: flowId,
|
|
2537
2537
|
trace_id: traceId ?? null,
|
|
@@ -2547,7 +2547,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2547
2547
|
}
|
|
2548
2548
|
const delta = this._initialWindow;
|
|
2549
2549
|
this._flowCtrl.addCredits(flowId, delta);
|
|
2550
|
-
logger$
|
|
2550
|
+
logger$1j.debug('maybe_emit_credit_emit', {
|
|
2551
2551
|
connector_id: this._connectorFlowId,
|
|
2552
2552
|
flow_id: flowId,
|
|
2553
2553
|
trace_id: traceId ?? null,
|
|
@@ -2567,7 +2567,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2567
2567
|
});
|
|
2568
2568
|
try {
|
|
2569
2569
|
await this.send(ackEnv);
|
|
2570
|
-
logger$
|
|
2570
|
+
logger$1j.debug('maybe_emit_credit_sent', {
|
|
2571
2571
|
connector_id: this._connectorFlowId,
|
|
2572
2572
|
flow_id: flowId,
|
|
2573
2573
|
trace_id: traceId ?? null,
|
|
@@ -2575,7 +2575,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2575
2575
|
});
|
|
2576
2576
|
}
|
|
2577
2577
|
catch (error) {
|
|
2578
|
-
logger$
|
|
2578
|
+
logger$1j.error('maybe_emit_credit_send_failed', {
|
|
2579
2579
|
connector_id: this._connectorFlowId,
|
|
2580
2580
|
flow_id: flowId,
|
|
2581
2581
|
trace_id: traceId ?? null,
|
|
@@ -2600,13 +2600,13 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2600
2600
|
*/
|
|
2601
2601
|
async _shutdown(code, reason, gracePeriod, exc) {
|
|
2602
2602
|
if (this._closed) {
|
|
2603
|
-
logger$
|
|
2603
|
+
logger$1j.debug('shutdown_already_closed', {
|
|
2604
2604
|
connector_id: this._connectorFlowId,
|
|
2605
2605
|
current_state: this._state,
|
|
2606
2606
|
});
|
|
2607
2607
|
return;
|
|
2608
2608
|
}
|
|
2609
|
-
logger$
|
|
2609
|
+
logger$1j.debug('connector_shutdown_starting', {
|
|
2610
2610
|
connector_id: this._connectorFlowId,
|
|
2611
2611
|
connector_type: this.constructor.name,
|
|
2612
2612
|
code,
|
|
@@ -2636,19 +2636,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2636
2636
|
this._sendPromiseResolve = undefined;
|
|
2637
2637
|
}
|
|
2638
2638
|
// Close transport
|
|
2639
|
-
logger$
|
|
2639
|
+
logger$1j.debug('connector_closing_transport', {
|
|
2640
2640
|
connector_id: this._connectorFlowId,
|
|
2641
2641
|
connector_type: this.constructor.name,
|
|
2642
2642
|
timestamp: new Date().toISOString(),
|
|
2643
2643
|
});
|
|
2644
2644
|
await this._transportClose(code, reason);
|
|
2645
|
-
logger$
|
|
2645
|
+
logger$1j.debug('connector_transport_closed', {
|
|
2646
2646
|
connector_id: this._connectorFlowId,
|
|
2647
2647
|
connector_type: this.constructor.name,
|
|
2648
2648
|
timestamp: new Date().toISOString(),
|
|
2649
2649
|
});
|
|
2650
2650
|
// Shutdown spawned tasks
|
|
2651
|
-
logger$
|
|
2651
|
+
logger$1j.debug('connector_shutting_down_tasks', {
|
|
2652
2652
|
connector_id: this._connectorFlowId,
|
|
2653
2653
|
connector_type: this.constructor.name,
|
|
2654
2654
|
grace_period_ms: effectiveGracePeriod * 1000,
|
|
@@ -2660,14 +2660,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2660
2660
|
gracePeriod: effectiveGracePeriod * 1000, // Convert to milliseconds
|
|
2661
2661
|
joinTimeout: this._shutdownJoinTimeout,
|
|
2662
2662
|
});
|
|
2663
|
-
logger$
|
|
2663
|
+
logger$1j.debug('connector_tasks_shutdown_complete', {
|
|
2664
2664
|
connector_id: this._connectorFlowId,
|
|
2665
2665
|
connector_type: this.constructor.name,
|
|
2666
2666
|
timestamp: new Date().toISOString(),
|
|
2667
2667
|
});
|
|
2668
2668
|
}
|
|
2669
2669
|
catch (error) {
|
|
2670
|
-
logger$
|
|
2670
|
+
logger$1j.warning('task_shutdown_error', {
|
|
2671
2671
|
connector_id: this._connectorFlowId,
|
|
2672
2672
|
error: error instanceof Error ? error.message : String(error),
|
|
2673
2673
|
});
|
|
@@ -2680,7 +2680,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2680
2680
|
if (this._closeResolver) {
|
|
2681
2681
|
this._closeResolver();
|
|
2682
2682
|
}
|
|
2683
|
-
logger$
|
|
2683
|
+
logger$1j.debug('connector_shutdown_complete', {
|
|
2684
2684
|
connector_id: this._connectorFlowId,
|
|
2685
2685
|
connector_type: this.constructor.name,
|
|
2686
2686
|
final_state: this._state,
|
|
@@ -2701,7 +2701,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
2701
2701
|
* A transport adapter that works with both Node.js and browser WebSocket APIs.
|
|
2702
2702
|
* Supports both native WebSocket clients and server-side WebSocket connections.
|
|
2703
2703
|
*/
|
|
2704
|
-
const logger$
|
|
2704
|
+
const logger$1i = getLogger('naylence.fame.connector.websocket_connector');
|
|
2705
2705
|
/**
|
|
2706
2706
|
* WebSocket state constants (mirrors standard WebSocket states)
|
|
2707
2707
|
*/
|
|
@@ -2742,7 +2742,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2742
2742
|
websocket.send_bytes &&
|
|
2743
2743
|
typeof websocket.receive_bytes === 'function' &&
|
|
2744
2744
|
typeof websocket.send_bytes === 'function');
|
|
2745
|
-
logger$
|
|
2745
|
+
logger$1i.debug('websocket_connector_created', {
|
|
2746
2746
|
is_fastapi_like: this._isFastApiLike,
|
|
2747
2747
|
ready_state: websocket.readyState,
|
|
2748
2748
|
url: websocket.url,
|
|
@@ -2757,7 +2757,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2757
2757
|
socketAny.binaryType = 'arraybuffer';
|
|
2758
2758
|
}
|
|
2759
2759
|
catch (error) {
|
|
2760
|
-
logger$
|
|
2760
|
+
logger$1i.debug('websocket_set_binary_type_failed', {
|
|
2761
2761
|
error: error instanceof Error ? error.message : String(error),
|
|
2762
2762
|
current_type: socketAny.binaryType,
|
|
2763
2763
|
});
|
|
@@ -2813,7 +2813,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2813
2813
|
else {
|
|
2814
2814
|
this._receiveQueue.push(data);
|
|
2815
2815
|
}
|
|
2816
|
-
logger$
|
|
2816
|
+
logger$1i.debug('websocket_message_pushed_to_queue', {
|
|
2817
2817
|
queueLength: this._receiveQueue.length,
|
|
2818
2818
|
waitersLength: this._receiveWaiters.length,
|
|
2819
2819
|
});
|
|
@@ -2866,7 +2866,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2866
2866
|
const result = receiveMethod.call(this._websocket);
|
|
2867
2867
|
// Ensure we have a Promise
|
|
2868
2868
|
if (!result || typeof result.then !== 'function') {
|
|
2869
|
-
logger$
|
|
2869
|
+
logger$1i.error('fastapi_receive_not_awaitable', {
|
|
2870
2870
|
result_type: typeof result,
|
|
2871
2871
|
result_str: String(result).substring(0, 100),
|
|
2872
2872
|
});
|
|
@@ -2882,7 +2882,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2882
2882
|
}
|
|
2883
2883
|
// Handle known WebSocket shutdown race condition
|
|
2884
2884
|
if (this._isAwaitFutureError(error)) {
|
|
2885
|
-
logger$
|
|
2885
|
+
logger$1i.debug('websocket_shutdown_race_condition_handled', {
|
|
2886
2886
|
note: 'Normal WebSocket close timing - converting to cancellation',
|
|
2887
2887
|
websocket_state: this._websocket.client_state || 'unknown',
|
|
2888
2888
|
});
|
|
@@ -2925,7 +2925,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2925
2925
|
}
|
|
2926
2926
|
catch (error) {
|
|
2927
2927
|
if (this._isAwaitFutureError(error)) {
|
|
2928
|
-
logger$
|
|
2928
|
+
logger$1i.debug('websocket_shutdown_race_condition_detected', {
|
|
2929
2929
|
websocket_type: this._websocket.constructor.name,
|
|
2930
2930
|
is_fastapi: this._isFastApiLike,
|
|
2931
2931
|
note: 'Normal WebSocket close timing during shutdown',
|
|
@@ -2971,12 +2971,12 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2971
2971
|
if (socketAny.readyState !== WebSocketState.CLOSED) {
|
|
2972
2972
|
try {
|
|
2973
2973
|
socketAny.terminate();
|
|
2974
|
-
logger$
|
|
2974
|
+
logger$1i.debug('websocket_force_terminated', {
|
|
2975
2975
|
ready_state: socketAny.readyState,
|
|
2976
2976
|
});
|
|
2977
2977
|
}
|
|
2978
2978
|
catch (error) {
|
|
2979
|
-
logger$
|
|
2979
|
+
logger$1i.debug('websocket_force_terminate_failed', {
|
|
2980
2980
|
error: error instanceof Error ? error.message : String(error),
|
|
2981
2981
|
});
|
|
2982
2982
|
}
|
|
@@ -2987,7 +2987,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
2987
2987
|
}
|
|
2988
2988
|
}
|
|
2989
2989
|
catch (error) {
|
|
2990
|
-
logger$
|
|
2990
|
+
logger$1i.error('websocket_close_failed', {
|
|
2991
2991
|
error: error instanceof Error ? error.message : String(error),
|
|
2992
2992
|
});
|
|
2993
2993
|
// Don't re-throw - close errors are not critical during shutdown
|
|
@@ -3208,7 +3208,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
3208
3208
|
this._removeReceiveHandlers();
|
|
3209
3209
|
}
|
|
3210
3210
|
catch (error) {
|
|
3211
|
-
logger$
|
|
3211
|
+
logger$1i.debug('websocket_remove_handlers_failed', {
|
|
3212
3212
|
error: error instanceof Error ? error.message : String(error),
|
|
3213
3213
|
});
|
|
3214
3214
|
}
|
|
@@ -3262,7 +3262,7 @@ class WebSocketConnector extends BaseAsyncConnector {
|
|
|
3262
3262
|
* Concrete implementations must define supported grant types and provide grant-to-connector
|
|
3263
3263
|
* conversion logic.
|
|
3264
3264
|
*/
|
|
3265
|
-
const logger$
|
|
3265
|
+
const logger$1h = getLogger('naylence.fame.connector.connector_factory');
|
|
3266
3266
|
const CONNECTOR_FACTORY_BASE_TYPE = 'ConnectorFactory';
|
|
3267
3267
|
/**
|
|
3268
3268
|
* Abstract base class for connector factories
|
|
@@ -3298,7 +3298,7 @@ class ConnectorFactory {
|
|
|
3298
3298
|
}
|
|
3299
3299
|
}
|
|
3300
3300
|
catch (error) {
|
|
3301
|
-
logger$
|
|
3301
|
+
logger$1h.warning(`Failed to evaluate grant with factory ${factoryInfo.constructor.name}: ${error}`);
|
|
3302
3302
|
continue;
|
|
3303
3303
|
}
|
|
3304
3304
|
}
|
|
@@ -3341,7 +3341,7 @@ class ConnectorFactory {
|
|
|
3341
3341
|
}
|
|
3342
3342
|
}
|
|
3343
3343
|
catch (error) {
|
|
3344
|
-
logger$
|
|
3344
|
+
logger$1h.warning(`Failed to create connector config from grant: ${error}`);
|
|
3345
3345
|
continue;
|
|
3346
3346
|
}
|
|
3347
3347
|
}
|
|
@@ -3408,20 +3408,20 @@ class ConnectorFactory {
|
|
|
3408
3408
|
return existing;
|
|
3409
3409
|
}
|
|
3410
3410
|
if (existing && !this.isGrantAware(existing)) {
|
|
3411
|
-
logger$
|
|
3411
|
+
logger$1h.warning(`Factory ${factoryInfo.constructor.name} is registered under ${CONNECTOR_FACTORY_BASE_TYPE} but is missing grant conversion APIs; skipping.`);
|
|
3412
3412
|
return null;
|
|
3413
3413
|
}
|
|
3414
3414
|
try {
|
|
3415
3415
|
const instance = new factoryInfo.constructor();
|
|
3416
3416
|
if (!this.isGrantAware(instance)) {
|
|
3417
|
-
logger$
|
|
3417
|
+
logger$1h.warning(`Factory ${factoryInfo.constructor.name} does not implement grant conversion APIs required by ${CONNECTOR_FACTORY_BASE_TYPE}; skipping.`);
|
|
3418
3418
|
return null;
|
|
3419
3419
|
}
|
|
3420
3420
|
factoryInfo.instance = instance;
|
|
3421
3421
|
return instance;
|
|
3422
3422
|
}
|
|
3423
3423
|
catch (error) {
|
|
3424
|
-
logger$
|
|
3424
|
+
logger$1h.warning(`Failed to instantiate factory ${factoryInfo.constructor.name} while resolving grant conversion APIs: ${error}`);
|
|
3425
3425
|
return null;
|
|
3426
3426
|
}
|
|
3427
3427
|
}
|
|
@@ -3580,7 +3580,7 @@ class AuthInjectionStrategyFactory extends AbstractResourceFactory {
|
|
|
3580
3580
|
}
|
|
3581
3581
|
}
|
|
3582
3582
|
|
|
3583
|
-
const logger$
|
|
3583
|
+
const logger$1g = getLogger('naylence.fame.connector.websocket_connector_factory');
|
|
3584
3584
|
let sslLoader = null;
|
|
3585
3585
|
function setWebSocketConnectorSslLoader(loader) {
|
|
3586
3586
|
sslLoader = loader;
|
|
@@ -3864,7 +3864,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
|
|
|
3864
3864
|
}
|
|
3865
3865
|
async _defaultWebSocketClient(url, subprotocols, headers) {
|
|
3866
3866
|
try {
|
|
3867
|
-
logger$
|
|
3867
|
+
logger$1g.debug('websocket_connector_connecting', { url, subprotocols });
|
|
3868
3868
|
if (typeof window !== 'undefined' &&
|
|
3869
3869
|
typeof window.WebSocket !== 'undefined') {
|
|
3870
3870
|
return await this._createBrowserWebSocket(url, subprotocols);
|
|
@@ -3947,7 +3947,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
|
|
|
3947
3947
|
await Promise.resolve().then(function () { return websocketConnectorNodeSsl; });
|
|
3948
3948
|
}
|
|
3949
3949
|
catch (error) {
|
|
3950
|
-
logger$
|
|
3950
|
+
logger$1g.debug('ssl_certificate_loader_import_failed', {
|
|
3951
3951
|
error: error instanceof Error ? error.message : String(error),
|
|
3952
3952
|
});
|
|
3953
3953
|
}
|
|
@@ -3956,7 +3956,7 @@ class WebSocketConnectorFactory extends ConnectorFactory {
|
|
|
3956
3956
|
if (!loader) {
|
|
3957
3957
|
return undefined;
|
|
3958
3958
|
}
|
|
3959
|
-
return await loader(logger$
|
|
3959
|
+
return await loader(logger$1g);
|
|
3960
3960
|
}
|
|
3961
3961
|
}
|
|
3962
3962
|
|
|
@@ -4425,12 +4425,12 @@ async function ensureRuntimeFactoriesRegistered(registry = Registry) {
|
|
|
4425
4425
|
}
|
|
4426
4426
|
|
|
4427
4427
|
// This file is auto-generated during build - do not edit manually
|
|
4428
|
-
// Generated from package.json version: 0.3.
|
|
4428
|
+
// Generated from package.json version: 0.3.22
|
|
4429
4429
|
/**
|
|
4430
4430
|
* The package version, injected at build time.
|
|
4431
4431
|
* @internal
|
|
4432
4432
|
*/
|
|
4433
|
-
const VERSION = '0.3.
|
|
4433
|
+
const VERSION = '0.3.22';
|
|
4434
4434
|
|
|
4435
4435
|
let initialized = false;
|
|
4436
4436
|
const runtimePlugin = {
|
|
@@ -5637,7 +5637,7 @@ async function withLock(lock, operation) {
|
|
|
5637
5637
|
return await lock.runExclusive(operation);
|
|
5638
5638
|
}
|
|
5639
5639
|
|
|
5640
|
-
const logger$
|
|
5640
|
+
const logger$1f = getLogger('naylence.fame.storage.sqlite_storage_provider');
|
|
5641
5641
|
let cachedSqliteCtor;
|
|
5642
5642
|
async function loadSqliteConstructor() {
|
|
5643
5643
|
if (cachedSqliteCtor !== undefined) {
|
|
@@ -5661,7 +5661,7 @@ async function loadSqliteConstructor() {
|
|
|
5661
5661
|
}
|
|
5662
5662
|
catch (error) {
|
|
5663
5663
|
cachedSqliteCtor = null;
|
|
5664
|
-
logger$
|
|
5664
|
+
logger$1f.error('failed-to-load-better-sqlite3', {
|
|
5665
5665
|
error: error instanceof Error ? error.message : String(error),
|
|
5666
5666
|
});
|
|
5667
5667
|
throw new Error('Failed to load better-sqlite3. Install it to enable SQLite storage support.');
|
|
@@ -5696,7 +5696,7 @@ class SQLiteKeyValueStore {
|
|
|
5696
5696
|
}
|
|
5697
5697
|
catch (error) {
|
|
5698
5698
|
if (this.autoRecover && this.isCorruptionError(error)) {
|
|
5699
|
-
logger$
|
|
5699
|
+
logger$1f.warning('detected-corrupted-db', { path: this.dbPath });
|
|
5700
5700
|
await this.recoverCorruptedDb();
|
|
5701
5701
|
if (!this.db) {
|
|
5702
5702
|
throw new Error('Failed to recover SQLite database');
|
|
@@ -5751,7 +5751,7 @@ class SQLiteKeyValueStore {
|
|
|
5751
5751
|
await this.closeDatabase();
|
|
5752
5752
|
await this.quarantineCorruptedFiles();
|
|
5753
5753
|
await this.openDatabase();
|
|
5754
|
-
logger$
|
|
5754
|
+
logger$1f.warning('quarantined-corrupted-db', { path: this.dbPath });
|
|
5755
5755
|
}
|
|
5756
5756
|
async closeDatabase() {
|
|
5757
5757
|
if (this.db) {
|
|
@@ -5759,7 +5759,7 @@ class SQLiteKeyValueStore {
|
|
|
5759
5759
|
this.db.close();
|
|
5760
5760
|
}
|
|
5761
5761
|
catch (error) {
|
|
5762
|
-
logger$
|
|
5762
|
+
logger$1f.warning('failed-to-close-sqlite-db', {
|
|
5763
5763
|
path: this.dbPath,
|
|
5764
5764
|
error: error instanceof Error ? error.message : String(error),
|
|
5765
5765
|
});
|
|
@@ -5782,7 +5782,7 @@ class SQLiteKeyValueStore {
|
|
|
5782
5782
|
await fsPromises.rename(candidate, quarantinedName);
|
|
5783
5783
|
}
|
|
5784
5784
|
catch (error) {
|
|
5785
|
-
logger$
|
|
5785
|
+
logger$1f.error('failed-to-quarantine-sqlite-file', {
|
|
5786
5786
|
file: candidate,
|
|
5787
5787
|
error: error instanceof Error ? error.message : String(error),
|
|
5788
5788
|
});
|
|
@@ -5883,7 +5883,7 @@ class SQLiteKeyValueStore {
|
|
|
5883
5883
|
result[row.key] = this.deserialize(row.value);
|
|
5884
5884
|
}
|
|
5885
5885
|
catch (error) {
|
|
5886
|
-
logger$
|
|
5886
|
+
logger$1f.warning('skipping-corrupted-sqlite-entry', {
|
|
5887
5887
|
key: row.key,
|
|
5888
5888
|
error: error instanceof Error ? error.message : String(error),
|
|
5889
5889
|
});
|
|
@@ -6878,7 +6878,7 @@ class InMemoryBinding {
|
|
|
6878
6878
|
* TypeScript port of Python's InMemoryFanoutBroker that extends TaskSpawner
|
|
6879
6879
|
* to manage multiple WriteChannel subscribers with concurrent message distribution.
|
|
6880
6880
|
*/
|
|
6881
|
-
const logger$
|
|
6881
|
+
const logger$1e = getLogger('naylence.fame.channel.in_memory.in_memory_fanout_broker');
|
|
6882
6882
|
// Sentinel object for shutdown signaling
|
|
6883
6883
|
const SENTINEL = Symbol('fanout-broker-sentinel');
|
|
6884
6884
|
function isCloseable(obj) {
|
|
@@ -6931,7 +6931,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6931
6931
|
}
|
|
6932
6932
|
catch (error) {
|
|
6933
6933
|
// Ignore errors when sending sentinel (sink might be closed)
|
|
6934
|
-
logger$
|
|
6934
|
+
logger$1e.debug('error_sending_sentinel', {
|
|
6935
6935
|
error: error.message,
|
|
6936
6936
|
});
|
|
6937
6937
|
}
|
|
@@ -6945,7 +6945,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6945
6945
|
await sub.close();
|
|
6946
6946
|
}
|
|
6947
6947
|
catch (error) {
|
|
6948
|
-
logger$
|
|
6948
|
+
logger$1e.error('error_closing_subscriber', {
|
|
6949
6949
|
subscriber: sub.toString(),
|
|
6950
6950
|
error: error.message,
|
|
6951
6951
|
});
|
|
@@ -6985,7 +6985,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6985
6985
|
[envelope, context] = extractEnvelopeAndContext(msg);
|
|
6986
6986
|
}
|
|
6987
6987
|
catch (error) {
|
|
6988
|
-
logger$
|
|
6988
|
+
logger$1e.debug('failed_to_extract_envelope', {
|
|
6989
6989
|
error: error.message,
|
|
6990
6990
|
});
|
|
6991
6991
|
continue;
|
|
@@ -7007,7 +7007,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7007
7007
|
await sub.send(messageToSend);
|
|
7008
7008
|
}
|
|
7009
7009
|
catch (error) {
|
|
7010
|
-
logger$
|
|
7010
|
+
logger$1e.error('error_sending_to_subscriber', {
|
|
7011
7011
|
subscriber: sub.toString(),
|
|
7012
7012
|
error: error.message,
|
|
7013
7013
|
action: 'unsubscribing',
|
|
@@ -7023,7 +7023,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7023
7023
|
}
|
|
7024
7024
|
catch (error) {
|
|
7025
7025
|
// Critical broker-level error: log and back off, but keep the loop running
|
|
7026
|
-
logger$
|
|
7026
|
+
logger$1e.critical('receive_loop_failed_unexpectedly', {
|
|
7027
7027
|
error: error.message,
|
|
7028
7028
|
stack: error.stack,
|
|
7029
7029
|
});
|
|
@@ -7732,7 +7732,7 @@ function normalizeResponseType(value) {
|
|
|
7732
7732
|
return value;
|
|
7733
7733
|
}
|
|
7734
7734
|
|
|
7735
|
-
const logger$
|
|
7735
|
+
const logger$1d = getLogger('naylence.fame.node.binding_manager');
|
|
7736
7736
|
const SYSTEM_INBOX$3 = '__sys__';
|
|
7737
7737
|
const DEFAULT_ACK_TIMEOUT_MS = 20000;
|
|
7738
7738
|
class BindingStoreEntryRecord {
|
|
@@ -7818,7 +7818,7 @@ class BindingManager {
|
|
|
7818
7818
|
if (!this.bindings.has(key)) {
|
|
7819
7819
|
const binding = this.bindingFactory(new FameAddress(key));
|
|
7820
7820
|
this.bindings.set(key, binding);
|
|
7821
|
-
logger$
|
|
7821
|
+
logger$1d.debug('restored_binding', { address: key });
|
|
7822
7822
|
}
|
|
7823
7823
|
}
|
|
7824
7824
|
if (!this.hasUpstream) {
|
|
@@ -7828,13 +7828,13 @@ class BindingManager {
|
|
|
7828
7828
|
await this.readvertiseCapabilitiesUpstream();
|
|
7829
7829
|
}
|
|
7830
7830
|
async bind(participant, capabilities) {
|
|
7831
|
-
logger$
|
|
7831
|
+
logger$1d.debug('binding_participant', { participant });
|
|
7832
7832
|
const { prefixAddress, addresses, propagateAddress, capabilityAddress } = this.computeBindingAddresses(participant);
|
|
7833
7833
|
for (const address of addresses) {
|
|
7834
7834
|
if (!this.bindings.has(address)) {
|
|
7835
7835
|
const binding = this.bindingFactory(new FameAddress(address));
|
|
7836
7836
|
this.bindings.set(address, binding);
|
|
7837
|
-
logger$
|
|
7837
|
+
logger$1d.debug('bound_address', { address, participant });
|
|
7838
7838
|
}
|
|
7839
7839
|
}
|
|
7840
7840
|
let propagatedAddress = null;
|
|
@@ -7863,7 +7863,7 @@ class BindingManager {
|
|
|
7863
7863
|
await this.unbindAddressUpstream(propagatedAddress);
|
|
7864
7864
|
}
|
|
7865
7865
|
catch (rollbackError) {
|
|
7866
|
-
logger$
|
|
7866
|
+
logger$1d.error('bind_rollback_failed', {
|
|
7867
7867
|
address: propagatedAddress.toString(),
|
|
7868
7868
|
error: rollbackError.message,
|
|
7869
7869
|
});
|
|
@@ -7882,7 +7882,7 @@ class BindingManager {
|
|
|
7882
7882
|
physicalPath: null,
|
|
7883
7883
|
});
|
|
7884
7884
|
}
|
|
7885
|
-
logger$
|
|
7885
|
+
logger$1d.debug('bind_success', {
|
|
7886
7886
|
participant,
|
|
7887
7887
|
address: prefixAddress.toString(),
|
|
7888
7888
|
capabilities,
|
|
@@ -7918,7 +7918,7 @@ class BindingManager {
|
|
|
7918
7918
|
await this.bindingStore.delete(address);
|
|
7919
7919
|
}
|
|
7920
7920
|
}
|
|
7921
|
-
logger$
|
|
7921
|
+
logger$1d.debug('unbind_success', {
|
|
7922
7922
|
participant,
|
|
7923
7923
|
address: prefixAddress.toString(),
|
|
7924
7924
|
totalBindings: this.bindings.size,
|
|
@@ -7948,7 +7948,7 @@ class BindingManager {
|
|
|
7948
7948
|
await this.bindAddressUpstream(new FameAddress(address));
|
|
7949
7949
|
}
|
|
7950
7950
|
catch (error) {
|
|
7951
|
-
logger$
|
|
7951
|
+
logger$1d.error('rebind_failed', {
|
|
7952
7952
|
address,
|
|
7953
7953
|
error: error.message,
|
|
7954
7954
|
});
|
|
@@ -7967,7 +7967,7 @@ class BindingManager {
|
|
|
7967
7967
|
await this.advertiseCapabilities(new FameAddress(address), Array.from(capabilities));
|
|
7968
7968
|
}
|
|
7969
7969
|
catch (error) {
|
|
7970
|
-
logger$
|
|
7970
|
+
logger$1d.error('capability_replay_failed', {
|
|
7971
7971
|
address,
|
|
7972
7972
|
error: error.message,
|
|
7973
7973
|
});
|
|
@@ -8234,7 +8234,7 @@ class BindingManager {
|
|
|
8234
8234
|
}
|
|
8235
8235
|
}
|
|
8236
8236
|
|
|
8237
|
-
const logger$
|
|
8237
|
+
const logger$1c = getLogger('naylence.fame.node.response_context_manager');
|
|
8238
8238
|
function cloneSecurityContext(source) {
|
|
8239
8239
|
if (!source) {
|
|
8240
8240
|
return undefined;
|
|
@@ -8262,7 +8262,7 @@ class ResponseContextManager {
|
|
|
8262
8262
|
security: responseSecurity,
|
|
8263
8263
|
expectedResponseType: FameResponseType.NONE,
|
|
8264
8264
|
};
|
|
8265
|
-
logger$
|
|
8265
|
+
logger$1c.debug('created_response_context', {
|
|
8266
8266
|
request_id: requestEnvelope.id,
|
|
8267
8267
|
inherited_crypto_level: responseSecurity?.inboundCryptoLevel ?? null,
|
|
8268
8268
|
channel_id: responseSecurity?.cryptoChannelId ?? null,
|
|
@@ -8282,14 +8282,14 @@ class ResponseContextManager {
|
|
|
8282
8282
|
responseContext.fromSystemId = this.getId();
|
|
8283
8283
|
}
|
|
8284
8284
|
// Envelope-level metadata is intentionally omitted to defer to context usage.
|
|
8285
|
-
logger$
|
|
8285
|
+
logger$1c.debug('ensured_response_metadata', {
|
|
8286
8286
|
response_id: responseEnvelope.id,
|
|
8287
8287
|
request_id: requestEnvelope.id,
|
|
8288
8288
|
});
|
|
8289
8289
|
}
|
|
8290
8290
|
}
|
|
8291
8291
|
|
|
8292
|
-
const logger$
|
|
8292
|
+
const logger$1b = getLogger('naylence.fame.node.streaming_response_handler');
|
|
8293
8293
|
function isObject(value) {
|
|
8294
8294
|
return typeof value === 'object' && value !== null;
|
|
8295
8295
|
}
|
|
@@ -8408,12 +8408,12 @@ class StreamingResponseHandler {
|
|
|
8408
8408
|
}
|
|
8409
8409
|
async handleStreamingFameMessageResponses(responses, requestEnvelope, requestContext) {
|
|
8410
8410
|
const asyncResponses = toAsyncIterable(responses);
|
|
8411
|
-
logger$
|
|
8411
|
+
logger$1b.debug('handling_streaming_fame_message_responses', {
|
|
8412
8412
|
request_id: requestEnvelope.id,
|
|
8413
8413
|
});
|
|
8414
8414
|
for await (const response of asyncResponses) {
|
|
8415
8415
|
if (!response?.envelope) {
|
|
8416
|
-
logger$
|
|
8416
|
+
logger$1b.warning('invalid_streaming_response_type', {
|
|
8417
8417
|
request_id: requestEnvelope.id,
|
|
8418
8418
|
actual_type: typeof response,
|
|
8419
8419
|
});
|
|
@@ -8427,7 +8427,7 @@ class StreamingResponseHandler {
|
|
|
8427
8427
|
}
|
|
8428
8428
|
async handleStreamingResponse(result, requestEnvelope, requestContext, replyTo, requestId) {
|
|
8429
8429
|
const iterable = toAsyncIterable(result);
|
|
8430
|
-
logger$
|
|
8430
|
+
logger$1b.debug('handling_streaming_response', {
|
|
8431
8431
|
request_id: requestId,
|
|
8432
8432
|
reply_to: replyTo,
|
|
8433
8433
|
});
|
|
@@ -8438,7 +8438,7 @@ class StreamingResponseHandler {
|
|
|
8438
8438
|
await this.sendRpcResponse(null, requestEnvelope, requestContext, replyTo, requestId);
|
|
8439
8439
|
}
|
|
8440
8440
|
catch (error) {
|
|
8441
|
-
logger$
|
|
8441
|
+
logger$1b.error('streaming_response_handler_error', {
|
|
8442
8442
|
request_id: requestId,
|
|
8443
8443
|
error: error instanceof Error ? error.message : String(error),
|
|
8444
8444
|
});
|
|
@@ -8465,7 +8465,7 @@ class StreamingResponseHandler {
|
|
|
8465
8465
|
});
|
|
8466
8466
|
const responseContext = this.responseContextManager.createResponseContext(requestEnvelope, requestContext);
|
|
8467
8467
|
this.responseContextManager.ensureResponseMetadata(responseEnvelope, requestEnvelope, responseContext);
|
|
8468
|
-
logger$
|
|
8468
|
+
logger$1b.debug('sending_streaming_rpc_response', {
|
|
8469
8469
|
request_id: requestId,
|
|
8470
8470
|
response_envelope_id: responseEnvelope.id,
|
|
8471
8471
|
reply_to: replyTo,
|
|
@@ -8478,7 +8478,7 @@ class StreamingResponseHandler {
|
|
|
8478
8478
|
}
|
|
8479
8479
|
}
|
|
8480
8480
|
|
|
8481
|
-
const logger$
|
|
8481
|
+
const logger$1a = getLogger('naylence.fame.node.channel_polling_manager');
|
|
8482
8482
|
class ChannelPollingManager {
|
|
8483
8483
|
constructor(deliverWrapper, responseContextManager, streamingResponseHandler) {
|
|
8484
8484
|
this.deliverWrapper = deliverWrapper;
|
|
@@ -8486,7 +8486,7 @@ class ChannelPollingManager {
|
|
|
8486
8486
|
this.streamingResponseHandler = streamingResponseHandler;
|
|
8487
8487
|
}
|
|
8488
8488
|
async startPollingLoop(serviceName, channel, handler, stopState, pollTimeoutMs = DEFAULT_POLLING_TIMEOUT_MS) {
|
|
8489
|
-
logger$
|
|
8489
|
+
logger$1a.debug('poll_loop_started', {
|
|
8490
8490
|
recipient: serviceName,
|
|
8491
8491
|
});
|
|
8492
8492
|
try {
|
|
@@ -8494,7 +8494,7 @@ class ChannelPollingManager {
|
|
|
8494
8494
|
while (true) {
|
|
8495
8495
|
if (this.isStopRequested(stopState) && !draining) {
|
|
8496
8496
|
draining = true;
|
|
8497
|
-
logger$
|
|
8497
|
+
logger$1a.debug('poll_loop_draining_pending_messages', {
|
|
8498
8498
|
recipient: serviceName,
|
|
8499
8499
|
});
|
|
8500
8500
|
}
|
|
@@ -8504,7 +8504,7 @@ class ChannelPollingManager {
|
|
|
8504
8504
|
}
|
|
8505
8505
|
catch (error) {
|
|
8506
8506
|
if (error instanceof FameTransportClose) {
|
|
8507
|
-
logger$
|
|
8507
|
+
logger$1a.debug('channel_closed', {
|
|
8508
8508
|
recipient: serviceName,
|
|
8509
8509
|
message: error.message,
|
|
8510
8510
|
});
|
|
@@ -8517,7 +8517,7 @@ class ChannelPollingManager {
|
|
|
8517
8517
|
continue;
|
|
8518
8518
|
}
|
|
8519
8519
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
8520
|
-
logger$
|
|
8520
|
+
logger$1a.debug('listener_cancelled', {
|
|
8521
8521
|
recipient: serviceName,
|
|
8522
8522
|
});
|
|
8523
8523
|
throw error;
|
|
@@ -8529,13 +8529,13 @@ class ChannelPollingManager {
|
|
|
8529
8529
|
continue;
|
|
8530
8530
|
}
|
|
8531
8531
|
if (error instanceof Error && error.message === 'Channel is closed') {
|
|
8532
|
-
logger$
|
|
8532
|
+
logger$1a.debug('channel_closed', {
|
|
8533
8533
|
recipient: serviceName,
|
|
8534
8534
|
});
|
|
8535
8535
|
break;
|
|
8536
8536
|
}
|
|
8537
8537
|
if (error instanceof Error && error.name === 'TaskCancelledError') {
|
|
8538
|
-
logger$
|
|
8538
|
+
logger$1a.debug('listener_cancelled', {
|
|
8539
8539
|
recipient: serviceName,
|
|
8540
8540
|
});
|
|
8541
8541
|
throw error;
|
|
@@ -8547,12 +8547,12 @@ class ChannelPollingManager {
|
|
|
8547
8547
|
continue;
|
|
8548
8548
|
}
|
|
8549
8549
|
if (error instanceof Error && error.message.includes('closed')) {
|
|
8550
|
-
logger$
|
|
8550
|
+
logger$1a.debug('channel_closed', {
|
|
8551
8551
|
recipient: serviceName,
|
|
8552
8552
|
});
|
|
8553
8553
|
break;
|
|
8554
8554
|
}
|
|
8555
|
-
logger$
|
|
8555
|
+
logger$1a.error('transport_error', {
|
|
8556
8556
|
recipient: serviceName,
|
|
8557
8557
|
error: error instanceof Error ? error.message : String(error),
|
|
8558
8558
|
});
|
|
@@ -8568,7 +8568,7 @@ class ChannelPollingManager {
|
|
|
8568
8568
|
}
|
|
8569
8569
|
}
|
|
8570
8570
|
finally {
|
|
8571
|
-
logger$
|
|
8571
|
+
logger$1a.debug('poll_loop_exiting', {
|
|
8572
8572
|
recipient: serviceName,
|
|
8573
8573
|
});
|
|
8574
8574
|
}
|
|
@@ -8581,7 +8581,7 @@ class ChannelPollingManager {
|
|
|
8581
8581
|
await this.processHandlerResult(result, envelope, deliveryContext, serviceName);
|
|
8582
8582
|
}
|
|
8583
8583
|
catch (error) {
|
|
8584
|
-
logger$
|
|
8584
|
+
logger$1a.error('handler_crashed', {
|
|
8585
8585
|
recipient: serviceName,
|
|
8586
8586
|
error: error instanceof Error ? error.message : String(error),
|
|
8587
8587
|
});
|
|
@@ -8595,7 +8595,7 @@ class ChannelPollingManager {
|
|
|
8595
8595
|
return;
|
|
8596
8596
|
}
|
|
8597
8597
|
if (this.streamingResponseHandler.isStreamingFameMessageResponse(result)) {
|
|
8598
|
-
logger$
|
|
8598
|
+
logger$1a.debug('handling_streaming_fame_message_responses', {
|
|
8599
8599
|
service_name: serviceName,
|
|
8600
8600
|
envelope_id: envelope.id,
|
|
8601
8601
|
});
|
|
@@ -8603,7 +8603,7 @@ class ChannelPollingManager {
|
|
|
8603
8603
|
}
|
|
8604
8604
|
}
|
|
8605
8605
|
async handleMessageResponse(response, requestEnvelope, requestContext, serviceName) {
|
|
8606
|
-
logger$
|
|
8606
|
+
logger$1a.debug('delivering_envelope_response_message', {
|
|
8607
8607
|
service_name: serviceName,
|
|
8608
8608
|
response_envelope_id: response.envelope.id,
|
|
8609
8609
|
});
|
|
@@ -8623,7 +8623,7 @@ class ChannelPollingManager {
|
|
|
8623
8623
|
}
|
|
8624
8624
|
}
|
|
8625
8625
|
|
|
8626
|
-
const logger$
|
|
8626
|
+
const logger$19 = getLogger('naylence.fame.node.rpc_server_handler');
|
|
8627
8627
|
function isPlainRecord$6(value) {
|
|
8628
8628
|
if (typeof value !== 'object' || value === null) {
|
|
8629
8629
|
return false;
|
|
@@ -8667,13 +8667,13 @@ class RPCServerHandler {
|
|
|
8667
8667
|
}
|
|
8668
8668
|
async handleRpcRequest(envelope, handlerContext, handler, serviceName) {
|
|
8669
8669
|
if (!this.isDataFrame(envelope.frame)) {
|
|
8670
|
-
logger$
|
|
8670
|
+
logger$19.warning('rpc_request_missing_data_frame', {
|
|
8671
8671
|
service_name: serviceName,
|
|
8672
8672
|
envelope_id: envelope.id,
|
|
8673
8673
|
});
|
|
8674
8674
|
return;
|
|
8675
8675
|
}
|
|
8676
|
-
logger$
|
|
8676
|
+
logger$19.debug('rpc_request_received', {
|
|
8677
8677
|
service_name: serviceName,
|
|
8678
8678
|
envelope_id: envelope.id,
|
|
8679
8679
|
trace_id: envelope.traceId,
|
|
@@ -8685,7 +8685,7 @@ class RPCServerHandler {
|
|
|
8685
8685
|
request = parseRequest(envelope.frame.payload);
|
|
8686
8686
|
params = cloneParams(request.params);
|
|
8687
8687
|
const paramKeys = Object.keys(params);
|
|
8688
|
-
logger$
|
|
8688
|
+
logger$19.debug('parsed_rpc_request', {
|
|
8689
8689
|
service_name: serviceName,
|
|
8690
8690
|
method: request.method,
|
|
8691
8691
|
request_id: request.id,
|
|
@@ -8694,7 +8694,7 @@ class RPCServerHandler {
|
|
|
8694
8694
|
});
|
|
8695
8695
|
}
|
|
8696
8696
|
catch (error) {
|
|
8697
|
-
logger$
|
|
8697
|
+
logger$19.warning('request_decode_error', {
|
|
8698
8698
|
service_name: serviceName,
|
|
8699
8699
|
envelope_id: envelope.id,
|
|
8700
8700
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -8702,7 +8702,7 @@ class RPCServerHandler {
|
|
|
8702
8702
|
return;
|
|
8703
8703
|
}
|
|
8704
8704
|
if (request.id == null) {
|
|
8705
|
-
logger$
|
|
8705
|
+
logger$19.warning('request_missing_id', {
|
|
8706
8706
|
service_name: serviceName,
|
|
8707
8707
|
envelope_id: envelope.id,
|
|
8708
8708
|
});
|
|
@@ -8710,7 +8710,7 @@ class RPCServerHandler {
|
|
|
8710
8710
|
}
|
|
8711
8711
|
const replyTo = this.resolveReplyTo(envelope, params);
|
|
8712
8712
|
if (!replyTo) {
|
|
8713
|
-
logger$
|
|
8713
|
+
logger$19.warning('missing_reply_to', {
|
|
8714
8714
|
service_name: serviceName,
|
|
8715
8715
|
envelope_id: envelope.id,
|
|
8716
8716
|
request_id: request.id,
|
|
@@ -8719,13 +8719,13 @@ class RPCServerHandler {
|
|
|
8719
8719
|
}
|
|
8720
8720
|
let handlerResult;
|
|
8721
8721
|
try {
|
|
8722
|
-
logger$
|
|
8722
|
+
logger$19.debug('calling_rpc_handler', {
|
|
8723
8723
|
service_name: serviceName,
|
|
8724
8724
|
method: request.method,
|
|
8725
8725
|
request_id: request.id,
|
|
8726
8726
|
});
|
|
8727
8727
|
handlerResult = await handler(request.method, params);
|
|
8728
|
-
logger$
|
|
8728
|
+
logger$19.debug('rpc_handler_returned', {
|
|
8729
8729
|
service_name: serviceName,
|
|
8730
8730
|
method: request.method,
|
|
8731
8731
|
request_id: request.id,
|
|
@@ -8734,7 +8734,7 @@ class RPCServerHandler {
|
|
|
8734
8734
|
});
|
|
8735
8735
|
}
|
|
8736
8736
|
catch (error) {
|
|
8737
|
-
logger$
|
|
8737
|
+
logger$19.error('rpc_handler_error', {
|
|
8738
8738
|
service_name: serviceName,
|
|
8739
8739
|
request_id: request.id,
|
|
8740
8740
|
envelope_id: envelope.id,
|
|
@@ -8744,7 +8744,7 @@ class RPCServerHandler {
|
|
|
8744
8744
|
return this.createTraditionalResponse(response, request.id, envelope, replyTo, handlerContext, serviceName);
|
|
8745
8745
|
}
|
|
8746
8746
|
if (isFameMessageResponse(handlerResult)) {
|
|
8747
|
-
logger$
|
|
8747
|
+
logger$19.debug('returning_response_message', {
|
|
8748
8748
|
service_name: serviceName,
|
|
8749
8749
|
request_id: request.id,
|
|
8750
8750
|
response_envelope_id: handlerResult.envelope.id,
|
|
@@ -8752,7 +8752,7 @@ class RPCServerHandler {
|
|
|
8752
8752
|
return handlerResult;
|
|
8753
8753
|
}
|
|
8754
8754
|
if (this.streamingResponseHandler.isStreamingResult(handlerResult)) {
|
|
8755
|
-
logger$
|
|
8755
|
+
logger$19.debug('handling_streaming_response', {
|
|
8756
8756
|
service_name: serviceName,
|
|
8757
8757
|
request_id: request.id,
|
|
8758
8758
|
envelope_id: envelope.id,
|
|
@@ -8781,7 +8781,7 @@ class RPCServerHandler {
|
|
|
8781
8781
|
return null;
|
|
8782
8782
|
}
|
|
8783
8783
|
async createTraditionalResponse(payload, requestId, requestEnvelope, replyTo, handlerContext, serviceName) {
|
|
8784
|
-
logger$
|
|
8784
|
+
logger$19.debug('creating_traditional_response_envelope', {
|
|
8785
8785
|
service_name: serviceName,
|
|
8786
8786
|
request_id: requestId,
|
|
8787
8787
|
envelope_id: requestEnvelope.id,
|
|
@@ -8805,7 +8805,7 @@ class RPCServerHandler {
|
|
|
8805
8805
|
if (requestEnvelope.id) {
|
|
8806
8806
|
responseContext.meta['response-to-id'] = requestEnvelope.id;
|
|
8807
8807
|
}
|
|
8808
|
-
logger$
|
|
8808
|
+
logger$19.debug('returning_traditional_response', {
|
|
8809
8809
|
service_name: serviceName,
|
|
8810
8810
|
request_id: requestId,
|
|
8811
8811
|
envelope_id: requestEnvelope.id,
|
|
@@ -8870,7 +8870,7 @@ function normalizeErrorCode(code) {
|
|
|
8870
8870
|
return code;
|
|
8871
8871
|
}
|
|
8872
8872
|
|
|
8873
|
-
const logger$
|
|
8873
|
+
const logger$18 = getLogger('naylence.fame.node.rpc_client_manager');
|
|
8874
8874
|
function isPlainRecord$5(value) {
|
|
8875
8875
|
if (typeof value !== 'object' || value === null) {
|
|
8876
8876
|
return false;
|
|
@@ -9087,7 +9087,7 @@ class RPCClientManager {
|
|
|
9087
9087
|
const metaReason = tracked.meta?.['nack_reason'];
|
|
9088
9088
|
const formattedMessage = formatDeliveryErrorMessage(typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR', reason ??
|
|
9089
9089
|
(typeof metaReason === 'string' ? metaReason : undefined));
|
|
9090
|
-
logger$
|
|
9090
|
+
logger$18.debug('pending_request_rejected_by_delivery_nack', {
|
|
9091
9091
|
envelope_id: envelopeId,
|
|
9092
9092
|
request_id: requestId,
|
|
9093
9093
|
code: typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR',
|
|
@@ -9110,7 +9110,7 @@ class RPCClientManager {
|
|
|
9110
9110
|
this.trackerWithEvents.removeEventHandler?.(this.trackerEventHandler);
|
|
9111
9111
|
}
|
|
9112
9112
|
catch (error) {
|
|
9113
|
-
logger$
|
|
9113
|
+
logger$18.debug('rpc_tracker_handler_remove_failed', {
|
|
9114
9114
|
error: error instanceof Error ? error.message : String(error),
|
|
9115
9115
|
});
|
|
9116
9116
|
}
|
|
@@ -9153,7 +9153,7 @@ class RPCClientManager {
|
|
|
9153
9153
|
this.rpcListenerAddress = await this.listenCallback(recipient, handler);
|
|
9154
9154
|
this.rpcBound = true;
|
|
9155
9155
|
this.boundPhysicalPath = currentPhysicalPath;
|
|
9156
|
-
logger$
|
|
9156
|
+
logger$18.debug('rpc_reply_listener_bound', {
|
|
9157
9157
|
reply_recipient: recipient,
|
|
9158
9158
|
reply_address: this.rpcReplyAddress?.toString(),
|
|
9159
9159
|
listener_address: this.rpcListenerAddress?.toString(),
|
|
@@ -9247,7 +9247,7 @@ class RPCClientManager {
|
|
|
9247
9247
|
const finalizePromise = this.notifyStreamClosed(envelopeId);
|
|
9248
9248
|
if (finalizePromise) {
|
|
9249
9249
|
finalizePromise.catch((notifyError) => {
|
|
9250
|
-
logger$
|
|
9250
|
+
logger$18.debug('stream_tracker_finalize_failed', {
|
|
9251
9251
|
request_id: requestId,
|
|
9252
9252
|
envelope_id: envelopeId,
|
|
9253
9253
|
error: notifyError instanceof Error
|
|
@@ -9308,7 +9308,7 @@ class RPCClientManager {
|
|
|
9308
9308
|
return iterator;
|
|
9309
9309
|
}
|
|
9310
9310
|
async sendRpcRequest(requestId, envelope, expectedResponseType, timeoutMs) {
|
|
9311
|
-
logger$
|
|
9311
|
+
logger$18.debug('sending_rpc_request', {
|
|
9312
9312
|
envp_id: envelope.id,
|
|
9313
9313
|
corr_id: envelope.corrId,
|
|
9314
9314
|
request_id: requestId,
|
|
@@ -9324,7 +9324,7 @@ class RPCClientManager {
|
|
|
9324
9324
|
}
|
|
9325
9325
|
}
|
|
9326
9326
|
catch (error) {
|
|
9327
|
-
logger$
|
|
9327
|
+
logger$18.warning('delivery_tracker_track_failed', {
|
|
9328
9328
|
request_id: requestId,
|
|
9329
9329
|
error: error instanceof Error ? error.message : String(error),
|
|
9330
9330
|
});
|
|
@@ -9337,14 +9337,14 @@ class RPCClientManager {
|
|
|
9337
9337
|
await this.deliverWrapper()(envelope, context);
|
|
9338
9338
|
}
|
|
9339
9339
|
async handleReplyEnvelope(envelope) {
|
|
9340
|
-
logger$
|
|
9340
|
+
logger$18.debug('handle_reply_envelope_received', {
|
|
9341
9341
|
envelope_id: envelope.id,
|
|
9342
9342
|
corr_id: envelope.corrId,
|
|
9343
9343
|
frame_type: envelope.frame?.['type'],
|
|
9344
9344
|
});
|
|
9345
9345
|
let requestId = envelope.corrId ?? envelope.id;
|
|
9346
9346
|
if (!requestId) {
|
|
9347
|
-
logger$
|
|
9347
|
+
logger$18.warning('reply_envelope_missing_corr_id', {
|
|
9348
9348
|
envelope_id: envelope.id,
|
|
9349
9349
|
});
|
|
9350
9350
|
return;
|
|
@@ -9362,12 +9362,12 @@ class RPCClientManager {
|
|
|
9362
9362
|
}
|
|
9363
9363
|
}
|
|
9364
9364
|
if (!entry) {
|
|
9365
|
-
logger$
|
|
9365
|
+
logger$18.debug('no_pending_request_for_reply', {
|
|
9366
9366
|
request_id: requestId,
|
|
9367
9367
|
});
|
|
9368
9368
|
return;
|
|
9369
9369
|
}
|
|
9370
|
-
logger$
|
|
9370
|
+
logger$18.debug('handle_reply_envelope', {
|
|
9371
9371
|
envelope_id: envelope.id,
|
|
9372
9372
|
request_id: requestId,
|
|
9373
9373
|
corr_id: envelope.corrId,
|
|
@@ -9380,7 +9380,7 @@ class RPCClientManager {
|
|
|
9380
9380
|
const ackIndicatesSuccess = frame.ok === true ||
|
|
9381
9381
|
(frame.ok === undefined && !frame.code && !frame.reason);
|
|
9382
9382
|
if (ackIndicatesSuccess) {
|
|
9383
|
-
logger$
|
|
9383
|
+
logger$18.debug('pending_request_delivery_acknowledged', {
|
|
9384
9384
|
request_id: requestId,
|
|
9385
9385
|
envelope_id: envelope.id,
|
|
9386
9386
|
ref_id: frame.refId ?? null,
|
|
@@ -9408,7 +9408,7 @@ class RPCClientManager {
|
|
|
9408
9408
|
entry.timer = null;
|
|
9409
9409
|
}
|
|
9410
9410
|
if (!this.isDataFrame(envelope.frame)) {
|
|
9411
|
-
logger$
|
|
9411
|
+
logger$18.warning('unexpected_reply_frame_type', {
|
|
9412
9412
|
request_id: requestId,
|
|
9413
9413
|
frame_type: envelope.frame?.['type'],
|
|
9414
9414
|
});
|
|
@@ -9474,7 +9474,7 @@ class RPCClientManager {
|
|
|
9474
9474
|
return;
|
|
9475
9475
|
}
|
|
9476
9476
|
Promise.resolve(this.deliveryTracker.onStreamItem(envelopeId, envelope)).catch((error) => {
|
|
9477
|
-
logger$
|
|
9477
|
+
logger$18.debug('stream_tracker_push_failed', {
|
|
9478
9478
|
envelope_id: envelopeId,
|
|
9479
9479
|
error: error instanceof Error ? error.message : String(error),
|
|
9480
9480
|
});
|
|
@@ -9589,7 +9589,7 @@ function normalizeMailbox(mailbox) {
|
|
|
9589
9589
|
return mailbox;
|
|
9590
9590
|
}
|
|
9591
9591
|
|
|
9592
|
-
const logger$
|
|
9592
|
+
const logger$17 = getLogger('naylence.fame.node.envelope_listener_manager');
|
|
9593
9593
|
const SYSTEM_INBOX$2 = '__sys__';
|
|
9594
9594
|
class EnvelopeListener {
|
|
9595
9595
|
constructor(stopFn, task) {
|
|
@@ -9597,7 +9597,7 @@ class EnvelopeListener {
|
|
|
9597
9597
|
this.task = task;
|
|
9598
9598
|
}
|
|
9599
9599
|
stop() {
|
|
9600
|
-
logger$
|
|
9600
|
+
logger$17.debug('stopping_listener', {
|
|
9601
9601
|
task_name: this.task.name,
|
|
9602
9602
|
});
|
|
9603
9603
|
try {
|
|
@@ -9605,7 +9605,7 @@ class EnvelopeListener {
|
|
|
9605
9605
|
if (maybeCleanup &&
|
|
9606
9606
|
typeof maybeCleanup.then === 'function') {
|
|
9607
9607
|
void maybeCleanup.catch((error) => {
|
|
9608
|
-
logger$
|
|
9608
|
+
logger$17.debug('listener_stop_cleanup_failed', {
|
|
9609
9609
|
task_name: this.task.name,
|
|
9610
9610
|
error: error instanceof Error ? error.message : String(error),
|
|
9611
9611
|
});
|
|
@@ -9613,7 +9613,7 @@ class EnvelopeListener {
|
|
|
9613
9613
|
}
|
|
9614
9614
|
}
|
|
9615
9615
|
catch (error) {
|
|
9616
|
-
logger$
|
|
9616
|
+
logger$17.debug('listener_stop_cleanup_failed', {
|
|
9617
9617
|
task_name: this.task.name,
|
|
9618
9618
|
error: error instanceof Error ? error.message : String(error),
|
|
9619
9619
|
});
|
|
@@ -9643,7 +9643,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9643
9643
|
envelope.replyTo = formatAddress(SYSTEM_INBOX$2, this.nodeLike.physicalPath);
|
|
9644
9644
|
}
|
|
9645
9645
|
catch (error) {
|
|
9646
|
-
logger$
|
|
9646
|
+
logger$17.warning('default_reply_to_assignment_failed', {
|
|
9647
9647
|
envelope_id: envelope.id,
|
|
9648
9648
|
service_name: envelope.capabilities?.[0] ?? null,
|
|
9649
9649
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -9668,7 +9668,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9668
9668
|
if (serviceName === SYSTEM_INBOX$2) {
|
|
9669
9669
|
continue;
|
|
9670
9670
|
}
|
|
9671
|
-
logger$
|
|
9671
|
+
logger$17.debug('stopping_listener_for_service', {
|
|
9672
9672
|
service_name: serviceName,
|
|
9673
9673
|
});
|
|
9674
9674
|
entry.listener.stop();
|
|
@@ -9678,7 +9678,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9678
9678
|
catch (error) {
|
|
9679
9679
|
if (!(error instanceof Error) ||
|
|
9680
9680
|
error.name !== 'TaskCancelledError') {
|
|
9681
|
-
logger$
|
|
9681
|
+
logger$17.debug('listener_task_stopped', {
|
|
9682
9682
|
service_name: serviceName,
|
|
9683
9683
|
error: error instanceof Error ? error.message : String(error),
|
|
9684
9684
|
});
|
|
@@ -9686,7 +9686,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9686
9686
|
}
|
|
9687
9687
|
}
|
|
9688
9688
|
if (systemEntry) {
|
|
9689
|
-
logger$
|
|
9689
|
+
logger$17.debug('stopping_listener_for_service', {
|
|
9690
9690
|
service_name: SYSTEM_INBOX$2,
|
|
9691
9691
|
});
|
|
9692
9692
|
systemEntry.listener.stop();
|
|
@@ -9696,7 +9696,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9696
9696
|
catch (error) {
|
|
9697
9697
|
if (!(error instanceof Error) ||
|
|
9698
9698
|
error.name !== 'TaskCancelledError') {
|
|
9699
|
-
logger$
|
|
9699
|
+
logger$17.debug('listener_task_stopped', {
|
|
9700
9700
|
service_name: SYSTEM_INBOX$2,
|
|
9701
9701
|
error: error instanceof Error ? error.message : String(error),
|
|
9702
9702
|
});
|
|
@@ -9713,13 +9713,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9713
9713
|
}
|
|
9714
9714
|
async recoverUnhandledInboundEnvelopes() {
|
|
9715
9715
|
if (typeof this.deliveryTracker.listInbound !== 'function') {
|
|
9716
|
-
logger$
|
|
9716
|
+
logger$17.debug('delivery_tracker_missing_inbound_listing');
|
|
9717
9717
|
return;
|
|
9718
9718
|
}
|
|
9719
9719
|
const failedInbound = await this.deliveryTracker.listInbound((env) => env.status === EnvelopeStatus.RECEIVED ||
|
|
9720
9720
|
env.status === EnvelopeStatus.FAILED_TO_HANDLE);
|
|
9721
9721
|
if (!failedInbound.length) {
|
|
9722
|
-
logger$
|
|
9722
|
+
logger$17.debug('no_failed_inbound_envelopes_to_recover');
|
|
9723
9723
|
return;
|
|
9724
9724
|
}
|
|
9725
9725
|
const grouped = new Map();
|
|
@@ -9736,7 +9736,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9736
9736
|
this.pendingRecoveryEnvelopes.set(serviceName, envelopes);
|
|
9737
9737
|
}
|
|
9738
9738
|
});
|
|
9739
|
-
logger$
|
|
9739
|
+
logger$17.debug('discovered_failed_inbound_envelopes', {
|
|
9740
9740
|
total: failedInbound.length,
|
|
9741
9741
|
services: Array.from(grouped.keys()),
|
|
9742
9742
|
});
|
|
@@ -9746,7 +9746,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9746
9746
|
const pollTimeoutMs = options.pollTimeoutMs ??
|
|
9747
9747
|
options.poll_timeout_ms ??
|
|
9748
9748
|
DEFAULT_POLLING_TIMEOUT_MS;
|
|
9749
|
-
logger$
|
|
9749
|
+
logger$17.debug('listen_start', {
|
|
9750
9750
|
recipient: serviceName,
|
|
9751
9751
|
poll_timeout_ms: pollTimeoutMs ?? DEFAULT_POLLING_TIMEOUT_MS,
|
|
9752
9752
|
});
|
|
@@ -9777,7 +9777,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9777
9777
|
tracked?.mailboxType === MailboxType.OUTBOX ||
|
|
9778
9778
|
envelope.frame?.['type'] === 'DeliveryAck';
|
|
9779
9779
|
if (!shouldInvoke) {
|
|
9780
|
-
logger$
|
|
9780
|
+
logger$17.debug('skipping_listener_handler', {
|
|
9781
9781
|
recipient: serviceName,
|
|
9782
9782
|
envelope_id: envelope.id,
|
|
9783
9783
|
tracked_status: tracked?.status,
|
|
@@ -9791,13 +9791,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9791
9791
|
? undefined
|
|
9792
9792
|
: (tracked ?? undefined);
|
|
9793
9793
|
if (trackedForHandler && trackedForHandler.attempt > 0) {
|
|
9794
|
-
logger$
|
|
9794
|
+
logger$17.info('resuming_handler_retry_after_restart', {
|
|
9795
9795
|
envelope_id: envelope.id,
|
|
9796
9796
|
current_attempts: trackedForHandler.attempt,
|
|
9797
9797
|
service_name: serviceName,
|
|
9798
9798
|
});
|
|
9799
9799
|
}
|
|
9800
|
-
logger$
|
|
9800
|
+
logger$17.debug('forwarding_to_listener_handler', {
|
|
9801
9801
|
recipient: serviceName,
|
|
9802
9802
|
envelope_id: envelope.id,
|
|
9803
9803
|
frame_type: envelope.frame?.['type'],
|
|
@@ -9816,7 +9816,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9816
9816
|
await channel.send(null);
|
|
9817
9817
|
}
|
|
9818
9818
|
catch (error) {
|
|
9819
|
-
logger$
|
|
9819
|
+
logger$17.debug('listener_stop_signal_failed', {
|
|
9820
9820
|
service_name: serviceName,
|
|
9821
9821
|
error: error instanceof Error ? error.message : String(error),
|
|
9822
9822
|
});
|
|
@@ -9825,7 +9825,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9825
9825
|
await this.listenersLock.runExclusive(async () => {
|
|
9826
9826
|
const existing = this.listeners.get(serviceName);
|
|
9827
9827
|
if (existing) {
|
|
9828
|
-
logger$
|
|
9828
|
+
logger$17.debug('replacing_envelope_listener', { recipient: serviceName });
|
|
9829
9829
|
existing.listener.stop();
|
|
9830
9830
|
try {
|
|
9831
9831
|
await existing.listener.task.promise;
|
|
@@ -9843,13 +9843,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9843
9843
|
return binding.address;
|
|
9844
9844
|
}
|
|
9845
9845
|
async listenRpc(serviceName, handler, options = {}) {
|
|
9846
|
-
logger$
|
|
9846
|
+
logger$17.debug('rpc_listen_start', { service_name: serviceName });
|
|
9847
9847
|
const rpcHandler = async (envelope, context) => {
|
|
9848
9848
|
const result = await this.rpcServerHandler.handleRpcRequest(envelope, context, handler, serviceName);
|
|
9849
9849
|
return result ?? null;
|
|
9850
9850
|
};
|
|
9851
9851
|
const address = await this.listen(serviceName, rpcHandler, options);
|
|
9852
|
-
logger$
|
|
9852
|
+
logger$17.debug('rpc_listen_bound', {
|
|
9853
9853
|
service_name: serviceName,
|
|
9854
9854
|
address: address.toString(),
|
|
9855
9855
|
});
|
|
@@ -9918,12 +9918,12 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9918
9918
|
return cached;
|
|
9919
9919
|
});
|
|
9920
9920
|
if (!envelopes.length) {
|
|
9921
|
-
logger$
|
|
9921
|
+
logger$17.debug('no_cached_recovery_for_service', {
|
|
9922
9922
|
service_name: serviceName,
|
|
9923
9923
|
});
|
|
9924
9924
|
return;
|
|
9925
9925
|
}
|
|
9926
|
-
logger$
|
|
9926
|
+
logger$17.debug('recovering_unhandled_envelopes_on_listen', {
|
|
9927
9927
|
service_name: serviceName,
|
|
9928
9928
|
count: envelopes.length,
|
|
9929
9929
|
envelope_ids: envelopes.map((trackedEnvelope) => trackedEnvelope.envelopeId),
|
|
@@ -9934,7 +9934,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9934
9934
|
async recoverServiceEnvelopes(serviceName, envelopes, handler) {
|
|
9935
9935
|
for (const tracked of envelopes) {
|
|
9936
9936
|
try {
|
|
9937
|
-
logger$
|
|
9937
|
+
logger$17.warning('recovering_unhandled_envelope', {
|
|
9938
9938
|
envelope_id: tracked.envelopeId,
|
|
9939
9939
|
service_name: serviceName,
|
|
9940
9940
|
current_attempts: tracked.attempt,
|
|
@@ -9943,13 +9943,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9943
9943
|
const originalEnvelope = tracked.originalEnvelope;
|
|
9944
9944
|
const receiverPolicy = this.nodeLike.deliveryPolicy?.receiverRetryPolicy ?? undefined;
|
|
9945
9945
|
await this.executeHandlerWithRetries(handler, originalEnvelope, undefined, receiverPolicy, tracked, serviceName);
|
|
9946
|
-
logger$
|
|
9946
|
+
logger$17.debug('envelope_recovery_completed', {
|
|
9947
9947
|
envelope_id: tracked.envelopeId,
|
|
9948
9948
|
service_name: serviceName,
|
|
9949
9949
|
});
|
|
9950
9950
|
}
|
|
9951
9951
|
catch (error) {
|
|
9952
|
-
logger$
|
|
9952
|
+
logger$17.error('envelope_recovery_failed', {
|
|
9953
9953
|
envelope_id: tracked.envelopeId,
|
|
9954
9954
|
service_name: serviceName,
|
|
9955
9955
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -9995,7 +9995,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9995
9995
|
await this.deliveryTracker.onEnvelopeHandled(trackedEnvelope);
|
|
9996
9996
|
}
|
|
9997
9997
|
if (currentAttempt > 0) {
|
|
9998
|
-
logger$
|
|
9998
|
+
logger$17.info('handler_retry_succeeded', {
|
|
9999
9999
|
envelope_id: envelope.id,
|
|
10000
10000
|
attempt: currentAttempt + 1,
|
|
10001
10001
|
total_attempts: currentAttempt + 1,
|
|
@@ -10011,7 +10011,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10011
10011
|
await this.deliveryTracker.onEnvelopeHandleFailed(inboxName, trackedEnvelope, context, error instanceof Error ? error : new Error(String(error)), isFinalAttempt);
|
|
10012
10012
|
}
|
|
10013
10013
|
if (isFinalAttempt) {
|
|
10014
|
-
logger$
|
|
10014
|
+
logger$17.error('handler_execution_failed_exhausted_retries', {
|
|
10015
10015
|
envelope_id: envelope.id,
|
|
10016
10016
|
total_attempts: attemptNumber,
|
|
10017
10017
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10020,7 +10020,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10020
10020
|
break;
|
|
10021
10021
|
}
|
|
10022
10022
|
const delayMs = retryPolicy?.nextDelayMs(attemptNumber) ?? 0;
|
|
10023
|
-
logger$
|
|
10023
|
+
logger$17.warning('handler_execution_failed_will_retry', {
|
|
10024
10024
|
envelope_id: envelope.id,
|
|
10025
10025
|
attempt: attemptNumber,
|
|
10026
10026
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10050,7 +10050,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10050
10050
|
}
|
|
10051
10051
|
}
|
|
10052
10052
|
|
|
10053
|
-
const logger$
|
|
10053
|
+
const logger$16 = getLogger('naylence.fame.delivery.default_delivery_tracker');
|
|
10054
10054
|
const STREAM_END = Symbol('stream-end');
|
|
10055
10055
|
const SWEEPER_TICK = Symbol('tracker-sweeper-tick');
|
|
10056
10056
|
function createDeferred$2() {
|
|
@@ -10282,7 +10282,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10282
10282
|
const expectedResponseType = options.expectedResponseType;
|
|
10283
10283
|
const tracked = await this.lock.runExclusive(async () => {
|
|
10284
10284
|
if (this.ackFutures.has(envelope.id)) {
|
|
10285
|
-
logger$
|
|
10285
|
+
logger$16.debug('tracker_envelope_already_tracked', {
|
|
10286
10286
|
envp_id: envelope.id,
|
|
10287
10287
|
});
|
|
10288
10288
|
return null;
|
|
@@ -10292,7 +10292,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10292
10292
|
if (expectedResponseType & FameResponseType.REPLY ||
|
|
10293
10293
|
expectedResponseType & FameResponseType.STREAM) {
|
|
10294
10294
|
if (existingEnvId && existingEnvId !== envelope.id) {
|
|
10295
|
-
logger$
|
|
10295
|
+
logger$16.debug('envelope_already_tracked_for_replies', {
|
|
10296
10296
|
envp_id: envelope.id,
|
|
10297
10297
|
corr_id: corrId,
|
|
10298
10298
|
expected_response_type: expectedResponseType,
|
|
@@ -10341,7 +10341,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10341
10341
|
return null;
|
|
10342
10342
|
}
|
|
10343
10343
|
await this.scheduleTimer(tracked, options.retryPolicy ?? null, options.retryHandler ?? null);
|
|
10344
|
-
logger$
|
|
10344
|
+
logger$16.debug('tracker_registered_envelope', {
|
|
10345
10345
|
envp_id: envelope.id,
|
|
10346
10346
|
corr_id: tracked.originalEnvelope.corrId,
|
|
10347
10347
|
expected_response: tracked.expectedResponseType,
|
|
@@ -10365,21 +10365,21 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10365
10365
|
return this.awaitEnvelopeFuture(envelopeId, FameResponseType.REPLY | FameResponseType.STREAM, future, timeoutMs);
|
|
10366
10366
|
}
|
|
10367
10367
|
async onEnvelopeDelivered(inboxName, envelope, context) {
|
|
10368
|
-
logger$
|
|
10368
|
+
logger$16.debug('envelope_delivered', {
|
|
10369
10369
|
envp_id: envelope.id,
|
|
10370
10370
|
corr_id: envelope.corrId,
|
|
10371
10371
|
rtype: envelope.rtype ?? FameResponseType.NONE,
|
|
10372
10372
|
frame_type: envelope.frame?.type ?? 'unknown',
|
|
10373
10373
|
});
|
|
10374
10374
|
if (!envelope.corrId) {
|
|
10375
|
-
logger$
|
|
10375
|
+
logger$16.debug('envelope_delivered_no_corr_id', {
|
|
10376
10376
|
envelope_id: envelope.id,
|
|
10377
10377
|
});
|
|
10378
10378
|
return null;
|
|
10379
10379
|
}
|
|
10380
10380
|
if (this.isDeliveryAckFrame(envelope.frame)) {
|
|
10381
10381
|
if (!envelope.frame.refId) {
|
|
10382
|
-
logger$
|
|
10382
|
+
logger$16.debug('envelope_delivered_no_ref_id', {
|
|
10383
10383
|
envelope_id: envelope.id,
|
|
10384
10384
|
});
|
|
10385
10385
|
return null;
|
|
@@ -10417,7 +10417,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10417
10417
|
await inbox.set(envelope.id, tracked);
|
|
10418
10418
|
}
|
|
10419
10419
|
else {
|
|
10420
|
-
logger$
|
|
10420
|
+
logger$16.debug('tracker_duplicate_envelope_already_handled', {
|
|
10421
10421
|
envp_id: envelope.id,
|
|
10422
10422
|
status: tracked.status,
|
|
10423
10423
|
});
|
|
@@ -10460,7 +10460,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10460
10460
|
}
|
|
10461
10461
|
if (isFinalFailure) {
|
|
10462
10462
|
envelope.status = EnvelopeStatus.FAILED_TO_HANDLE;
|
|
10463
|
-
logger$
|
|
10463
|
+
logger$16.error('envelope_handle_failed_final', {
|
|
10464
10464
|
inbox_name: inboxName,
|
|
10465
10465
|
envp_id: envelope.originalEnvelope.id,
|
|
10466
10466
|
error: error?.message ?? 'unknown',
|
|
@@ -10471,7 +10471,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10471
10471
|
await inbox.delete(envelope.originalEnvelope.id);
|
|
10472
10472
|
return;
|
|
10473
10473
|
}
|
|
10474
|
-
logger$
|
|
10474
|
+
logger$16.warning('envelope_handle_failed_retry', {
|
|
10475
10475
|
inbox_name: inboxName,
|
|
10476
10476
|
envp_id: envelope.originalEnvelope.id,
|
|
10477
10477
|
error: error?.message ?? 'unknown',
|
|
@@ -10517,14 +10517,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10517
10517
|
if (handledViaFuture) {
|
|
10518
10518
|
await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
|
|
10519
10519
|
await this.clearTimer(refId);
|
|
10520
|
-
logger$
|
|
10520
|
+
logger$16.debug('tracker_ack_resolved_without_tracked_envelope', {
|
|
10521
10521
|
envp_id: envelope.id,
|
|
10522
10522
|
ref_id: refId,
|
|
10523
10523
|
corr_id: envelope.corrId,
|
|
10524
10524
|
});
|
|
10525
10525
|
return;
|
|
10526
10526
|
}
|
|
10527
|
-
logger$
|
|
10527
|
+
logger$16.debug('tracker_ack_for_unknown_envelope', {
|
|
10528
10528
|
envp_id: envelope.id,
|
|
10529
10529
|
ref_id: refId,
|
|
10530
10530
|
corr_id: envelope.corrId,
|
|
@@ -10532,7 +10532,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10532
10532
|
return;
|
|
10533
10533
|
}
|
|
10534
10534
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10535
|
-
logger$
|
|
10535
|
+
logger$16.debug('tracker_ack_corr_id_mismatch', {
|
|
10536
10536
|
envp_id: envelope.id,
|
|
10537
10537
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10538
10538
|
actual_corr_id: envelope.corrId,
|
|
@@ -10557,7 +10557,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10557
10557
|
for (const handler of this.eventHandlers) {
|
|
10558
10558
|
await handler.onEnvelopeAcked?.(tracked);
|
|
10559
10559
|
}
|
|
10560
|
-
logger$
|
|
10560
|
+
logger$16.debug('tracker_envelope_acked', {
|
|
10561
10561
|
envp_id: tracked.originalEnvelope.id,
|
|
10562
10562
|
});
|
|
10563
10563
|
}
|
|
@@ -10575,13 +10575,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10575
10575
|
const outbox = this.ensureOutbox();
|
|
10576
10576
|
const tracked = await outbox.get(envelope.frame.refId);
|
|
10577
10577
|
if (!tracked) {
|
|
10578
|
-
logger$
|
|
10578
|
+
logger$16.debug('tracker_nack_for_unknown_envelope', {
|
|
10579
10579
|
envp_id: envelope.id,
|
|
10580
10580
|
});
|
|
10581
10581
|
return;
|
|
10582
10582
|
}
|
|
10583
10583
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10584
|
-
logger$
|
|
10584
|
+
logger$16.debug('tracker_nack_corr_id_mismatch', {
|
|
10585
10585
|
envp_id: envelope.id,
|
|
10586
10586
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10587
10587
|
actual_corr_id: envelope.corrId,
|
|
@@ -10623,7 +10623,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10623
10623
|
for (const handler of this.eventHandlers) {
|
|
10624
10624
|
await handler.onEnvelopeNacked?.(tracked, ackFrame.reason ?? null);
|
|
10625
10625
|
}
|
|
10626
|
-
logger$
|
|
10626
|
+
logger$16.debug('tracker_envelope_nacked', {
|
|
10627
10627
|
envp_id: tracked.originalEnvelope.id,
|
|
10628
10628
|
reason: ackFrame.reason,
|
|
10629
10629
|
});
|
|
@@ -10671,7 +10671,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10671
10671
|
for (const handler of this.eventHandlers) {
|
|
10672
10672
|
await handler.onEnvelopeReplied?.(trackedEnvelope, envelope);
|
|
10673
10673
|
}
|
|
10674
|
-
logger$
|
|
10674
|
+
logger$16.debug('tracked_envelope_replied', {
|
|
10675
10675
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10676
10676
|
corr_id: envelope.corrId,
|
|
10677
10677
|
});
|
|
@@ -10745,7 +10745,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10745
10745
|
async addToInboxDlq(trackedEnvelope, reason = null) {
|
|
10746
10746
|
const dlq = this.inboxDlq;
|
|
10747
10747
|
if (!dlq) {
|
|
10748
|
-
logger$
|
|
10748
|
+
logger$16.error('dlq_not_initialized', {
|
|
10749
10749
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10750
10750
|
});
|
|
10751
10751
|
return;
|
|
@@ -10760,7 +10760,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10760
10760
|
const deadLetteredAt = Date.now();
|
|
10761
10761
|
setMetaWithLegacy(trackedEnvelope.meta, 'deadLetteredAtMs', 'dead_lettered_at_ms', deadLetteredAt);
|
|
10762
10762
|
await dlq.set(trackedEnvelope.originalEnvelope.id, trackedEnvelope);
|
|
10763
|
-
logger$
|
|
10763
|
+
logger$16.warning('envelope_moved_to_dlq', {
|
|
10764
10764
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10765
10765
|
service_name: trackedEnvelope.serviceName,
|
|
10766
10766
|
});
|
|
@@ -10789,7 +10789,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10789
10789
|
const toDelete = Object.entries(items).filter(([, value]) => predicate ? predicate(value) : true);
|
|
10790
10790
|
await Promise.all(toDelete.map(([key]) => dlq.delete(key)));
|
|
10791
10791
|
if (toDelete.length) {
|
|
10792
|
-
logger$
|
|
10792
|
+
logger$16.debug('dlq_purged', { count: toDelete.length });
|
|
10793
10793
|
}
|
|
10794
10794
|
return toDelete.length;
|
|
10795
10795
|
}
|
|
@@ -10842,11 +10842,11 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10842
10842
|
}
|
|
10843
10843
|
this.futuresSweeper = null;
|
|
10844
10844
|
}
|
|
10845
|
-
logger$
|
|
10845
|
+
logger$16.debug('tracker_cleanup_completed');
|
|
10846
10846
|
}
|
|
10847
10847
|
async recoverPending() {
|
|
10848
10848
|
const pending = await this.listPending();
|
|
10849
|
-
logger$
|
|
10849
|
+
logger$16.debug('tracker_recovering_pending', { count: pending.length });
|
|
10850
10850
|
await this.lock.runExclusive(async () => {
|
|
10851
10851
|
for (const tracked of pending) {
|
|
10852
10852
|
if (tracked.expectedResponseType & FameResponseType.ACK) {
|
|
@@ -10872,7 +10872,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10872
10872
|
for (const tracked of pending) {
|
|
10873
10873
|
await this.scheduleTimer(tracked, null, null);
|
|
10874
10874
|
}
|
|
10875
|
-
logger$
|
|
10875
|
+
logger$16.debug('tracker_recovery_completed', { count: pending.length });
|
|
10876
10876
|
}
|
|
10877
10877
|
ensureOutbox() {
|
|
10878
10878
|
if (!this.outbox) {
|
|
@@ -10887,7 +10887,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10887
10887
|
return this.inbox;
|
|
10888
10888
|
}
|
|
10889
10889
|
async waitForPendingAcks() {
|
|
10890
|
-
logger$
|
|
10890
|
+
logger$16.debug('tracker_node_preparing_to_stop_waiting_for_pending_acks');
|
|
10891
10891
|
const outbox = this.outbox;
|
|
10892
10892
|
if (!outbox) {
|
|
10893
10893
|
return;
|
|
@@ -10899,7 +10899,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10899
10899
|
continue;
|
|
10900
10900
|
}
|
|
10901
10901
|
if (!future.done) {
|
|
10902
|
-
logger$
|
|
10902
|
+
logger$16.debug('tracker_pending_ack_future_detected', {
|
|
10903
10903
|
envelope_id: envelopeId,
|
|
10904
10904
|
});
|
|
10905
10905
|
pending.push({ envelopeId, future });
|
|
@@ -10907,10 +10907,10 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10907
10907
|
}
|
|
10908
10908
|
});
|
|
10909
10909
|
if (!pending.length) {
|
|
10910
|
-
logger$
|
|
10910
|
+
logger$16.debug('tracker_no_pending_acks_to_wait_for');
|
|
10911
10911
|
return;
|
|
10912
10912
|
}
|
|
10913
|
-
logger$
|
|
10913
|
+
logger$16.debug('tracker_waiting_for_pending_acks', { count: pending.length });
|
|
10914
10914
|
for (const entry of pending) {
|
|
10915
10915
|
if (!entry) {
|
|
10916
10916
|
continue;
|
|
@@ -10927,19 +10927,19 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10927
10927
|
}
|
|
10928
10928
|
try {
|
|
10929
10929
|
await this.awaitWithTimeout(entry.future.promise, remainingMs);
|
|
10930
|
-
logger$
|
|
10930
|
+
logger$16.debug('tracker_received_ack', {
|
|
10931
10931
|
envelope_id: entry.envelopeId,
|
|
10932
10932
|
});
|
|
10933
10933
|
await outbox.delete(entry.envelopeId);
|
|
10934
10934
|
}
|
|
10935
10935
|
catch (error) {
|
|
10936
10936
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
10937
|
-
logger$
|
|
10937
|
+
logger$16.debug('tracker_ack_timeout_expired', {
|
|
10938
10938
|
envelope_id: entry.envelopeId,
|
|
10939
10939
|
});
|
|
10940
10940
|
}
|
|
10941
10941
|
else {
|
|
10942
|
-
logger$
|
|
10942
|
+
logger$16.debug('tracker_ack_wait_error', {
|
|
10943
10943
|
envelope_id: entry.envelopeId,
|
|
10944
10944
|
error: error instanceof Error ? error.message : String(error),
|
|
10945
10945
|
});
|
|
@@ -10947,13 +10947,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10947
10947
|
}
|
|
10948
10948
|
}
|
|
10949
10949
|
catch (error) {
|
|
10950
|
-
logger$
|
|
10950
|
+
logger$16.error('tracker_error_waiting_for_ack', {
|
|
10951
10951
|
envelope_id: entry.envelopeId,
|
|
10952
10952
|
error: error instanceof Error ? error.message : String(error),
|
|
10953
10953
|
});
|
|
10954
10954
|
}
|
|
10955
10955
|
}
|
|
10956
|
-
logger$
|
|
10956
|
+
logger$16.debug('tracker_finished_waiting_for_pending_acks');
|
|
10957
10957
|
}
|
|
10958
10958
|
async waitForPendingAckDispatches() {
|
|
10959
10959
|
while (this.pendingAckDispatches.size > 0) {
|
|
@@ -11011,7 +11011,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11011
11011
|
for (const handler of this.eventHandlers) {
|
|
11012
11012
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11013
11013
|
}
|
|
11014
|
-
logger$
|
|
11014
|
+
logger$16.debug('tracker_envelope_timed_out', {
|
|
11015
11015
|
envp_id: tracked.originalEnvelope.id,
|
|
11016
11016
|
});
|
|
11017
11017
|
return;
|
|
@@ -11024,7 +11024,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11024
11024
|
currentTracked.timeoutAtMs = nextTimeoutAt;
|
|
11025
11025
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11026
11026
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11027
|
-
logger$
|
|
11027
|
+
logger$16.debug('tracker_retry_deferred_during_shutdown', {
|
|
11028
11028
|
envp_id: tracked.originalEnvelope.id,
|
|
11029
11029
|
defer_ms: shutdownDeferMs,
|
|
11030
11030
|
});
|
|
@@ -11047,7 +11047,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11047
11047
|
});
|
|
11048
11048
|
}
|
|
11049
11049
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11050
|
-
logger$
|
|
11050
|
+
logger$16.debug('envelope_delivery_retry_scheduled', {
|
|
11051
11051
|
envp_id: tracked.originalEnvelope.id,
|
|
11052
11052
|
attempt: currentTracked.attempt,
|
|
11053
11053
|
max_retries: retryPolicy.maxRetries,
|
|
@@ -11059,7 +11059,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11059
11059
|
currentTracked.timeoutAtMs = currentTracked.overallTimeoutAtMs;
|
|
11060
11060
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11061
11061
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11062
|
-
logger$
|
|
11062
|
+
logger$16.debug('envelope_retries_exhausted_waiting_until_overall_timeout', {
|
|
11063
11063
|
envp_id: tracked.originalEnvelope.id,
|
|
11064
11064
|
attempt: currentTracked.attempt,
|
|
11065
11065
|
overall_timeout_at_ms: currentTracked.overallTimeoutAtMs,
|
|
@@ -11079,7 +11079,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11079
11079
|
for (const handler of this.eventHandlers) {
|
|
11080
11080
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11081
11081
|
}
|
|
11082
|
-
logger$
|
|
11082
|
+
logger$16.debug('tracker_envelope_timed_out', {
|
|
11083
11083
|
envp_id: tracked.originalEnvelope.id,
|
|
11084
11084
|
});
|
|
11085
11085
|
}
|
|
@@ -11087,7 +11087,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11087
11087
|
if (error instanceof TaskCancelledError) {
|
|
11088
11088
|
return;
|
|
11089
11089
|
}
|
|
11090
|
-
logger$
|
|
11090
|
+
logger$16.error('tracker_timer_error', {
|
|
11091
11091
|
envp_id: tracked.originalEnvelope.id,
|
|
11092
11092
|
error: error instanceof Error ? error.message : String(error),
|
|
11093
11093
|
});
|
|
@@ -11142,7 +11142,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11142
11142
|
if (timeoutSeconds !== null) {
|
|
11143
11143
|
return await this.awaitWithTimeout(future.promise, timeoutSeconds);
|
|
11144
11144
|
}
|
|
11145
|
-
logger$
|
|
11145
|
+
logger$16.debug('await_envelope_no_timeout_wait', {
|
|
11146
11146
|
envelope_id: envelopeId,
|
|
11147
11147
|
});
|
|
11148
11148
|
return await future.promise;
|
|
@@ -11151,7 +11151,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11151
11151
|
if (error instanceof Error && error.name !== 'TimeoutError') {
|
|
11152
11152
|
throw error;
|
|
11153
11153
|
}
|
|
11154
|
-
logger$
|
|
11154
|
+
logger$16.error('await_envelope_timeout_error', {
|
|
11155
11155
|
envelope_id: envelopeId,
|
|
11156
11156
|
timeout_ms: timeoutSeconds,
|
|
11157
11157
|
future_done: false,
|
|
@@ -11312,7 +11312,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11312
11312
|
this.replyDoneSince.delete(envId);
|
|
11313
11313
|
}
|
|
11314
11314
|
});
|
|
11315
|
-
logger$
|
|
11315
|
+
logger$16.debug('tracker_swept_completed_futures', {
|
|
11316
11316
|
ack_removed: toRemoveAck.length,
|
|
11317
11317
|
reply_removed: toRemoveReply.length,
|
|
11318
11318
|
grace_secs: this.futGcGraceSecs,
|
|
@@ -11326,7 +11326,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11326
11326
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
11327
11327
|
continue;
|
|
11328
11328
|
}
|
|
11329
|
-
logger$
|
|
11329
|
+
logger$16.error('tracker_sweeper_error', {
|
|
11330
11330
|
error: error instanceof Error ? error.message : String(error),
|
|
11331
11331
|
});
|
|
11332
11332
|
}
|
|
@@ -11357,14 +11357,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11357
11357
|
}
|
|
11358
11358
|
const node = this.node;
|
|
11359
11359
|
if (!envelope.replyTo) {
|
|
11360
|
-
logger$
|
|
11360
|
+
logger$16.error('cannot_send_ack_no_reply_to', { envp_id: envelope.id });
|
|
11361
11361
|
return;
|
|
11362
11362
|
}
|
|
11363
11363
|
if (!envelope.corrId) {
|
|
11364
|
-
logger$
|
|
11364
|
+
logger$16.error('cannot_send_ack_no_corr_id', { envp_id: envelope.id });
|
|
11365
11365
|
return;
|
|
11366
11366
|
}
|
|
11367
|
-
logger$
|
|
11367
|
+
logger$16.debug('tracker_sending_ack', {
|
|
11368
11368
|
envp_id: envelope.id,
|
|
11369
11369
|
ref_id: envelope.id,
|
|
11370
11370
|
to: envelope.replyTo,
|
|
@@ -11384,7 +11384,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11384
11384
|
.send(ackEnvelope)
|
|
11385
11385
|
.then(() => undefined)
|
|
11386
11386
|
.catch((error) => {
|
|
11387
|
-
logger$
|
|
11387
|
+
logger$16.error('tracker_ack_dispatch_failed', {
|
|
11388
11388
|
envp_id: envelope.id,
|
|
11389
11389
|
error: error instanceof Error ? error.message : String(error),
|
|
11390
11390
|
});
|
|
@@ -11470,7 +11470,7 @@ class AsyncEvent {
|
|
|
11470
11470
|
}
|
|
11471
11471
|
}
|
|
11472
11472
|
|
|
11473
|
-
const logger$
|
|
11473
|
+
const logger$15 = getLogger('naylence.fame.node.root_session_manager');
|
|
11474
11474
|
function resolveOption$1(options, primary, ...aliases) {
|
|
11475
11475
|
const record = options;
|
|
11476
11476
|
const primaryKey = primary;
|
|
@@ -11551,7 +11551,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11551
11551
|
this.onAdmissionFailed =
|
|
11552
11552
|
typeof onAdmissionFailed === 'function' ? onAdmissionFailed : undefined;
|
|
11553
11553
|
this.enableContinuousRefresh = enableContinuousRefresh ?? true;
|
|
11554
|
-
logger$
|
|
11554
|
+
logger$15.debug('created_root_session_manager');
|
|
11555
11555
|
}
|
|
11556
11556
|
get isReady() {
|
|
11557
11557
|
return this.readyEvent.isSet();
|
|
@@ -11576,7 +11576,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11576
11576
|
if (this.admissionTask) {
|
|
11577
11577
|
return;
|
|
11578
11578
|
}
|
|
11579
|
-
logger$
|
|
11579
|
+
logger$15.debug('root_session_manager_starting');
|
|
11580
11580
|
this.stopEvent.clear();
|
|
11581
11581
|
this.readyEvent.clear();
|
|
11582
11582
|
const taskName = `root-admission-${this.admissionEpoch}`;
|
|
@@ -11596,10 +11596,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11596
11596
|
await this.admissionTask.promise;
|
|
11597
11597
|
throw new FameConnectError('Root session manager failed to become ready');
|
|
11598
11598
|
}
|
|
11599
|
-
logger$
|
|
11599
|
+
logger$15.debug('root_session_manager_started');
|
|
11600
11600
|
}
|
|
11601
11601
|
async stop() {
|
|
11602
|
-
logger$
|
|
11602
|
+
logger$15.debug('root_session_manager_stopping');
|
|
11603
11603
|
this.stopEvent.set();
|
|
11604
11604
|
if (this.admissionTask) {
|
|
11605
11605
|
this.admissionTask.cancel();
|
|
@@ -11611,7 +11611,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11611
11611
|
await this.consumeTask(this.expiryGuardTask);
|
|
11612
11612
|
this.expiryGuardTask = null;
|
|
11613
11613
|
}
|
|
11614
|
-
logger$
|
|
11614
|
+
logger$15.debug('root_session_manager_stopped');
|
|
11615
11615
|
}
|
|
11616
11616
|
async awaitReady(timeoutMs) {
|
|
11617
11617
|
if (this.isReady) {
|
|
@@ -11652,12 +11652,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11652
11652
|
await this.onEpochChange(epoch);
|
|
11653
11653
|
}
|
|
11654
11654
|
else {
|
|
11655
|
-
logger$
|
|
11655
|
+
logger$15.debug('epoch_change_ignored_no_handler', { epoch });
|
|
11656
11656
|
}
|
|
11657
11657
|
}
|
|
11658
11658
|
static createForRootSentinel(node, admissionClient, requestedLogicals = [], enableContinuousRefresh = true, onEpochChange) {
|
|
11659
11659
|
const handleWelcome = async (frame) => {
|
|
11660
|
-
logger$
|
|
11660
|
+
logger$15.info('root_admission_successful', {
|
|
11661
11661
|
system_id: frame.systemId,
|
|
11662
11662
|
assigned_path: frame.assignedPath ?? null,
|
|
11663
11663
|
accepted_logicals: frame.acceptedLogicals ?? [],
|
|
@@ -11668,12 +11668,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11668
11668
|
? grant.purpose
|
|
11669
11669
|
: undefined;
|
|
11670
11670
|
if (purpose) {
|
|
11671
|
-
logger$
|
|
11671
|
+
logger$15.debug('received_admission_grant', { purpose });
|
|
11672
11672
|
}
|
|
11673
11673
|
}
|
|
11674
11674
|
};
|
|
11675
11675
|
const handleFailure = async (error) => {
|
|
11676
|
-
logger$
|
|
11676
|
+
logger$15.error('root_admission_failed_permanently', {
|
|
11677
11677
|
error: error.message,
|
|
11678
11678
|
});
|
|
11679
11679
|
};
|
|
@@ -11702,10 +11702,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11702
11702
|
this.readyEvent.set();
|
|
11703
11703
|
}
|
|
11704
11704
|
if (this.hadSuccessfulAdmission) {
|
|
11705
|
-
logger$
|
|
11705
|
+
logger$15.debug('root_admission_refreshed');
|
|
11706
11706
|
}
|
|
11707
11707
|
else {
|
|
11708
|
-
logger$
|
|
11708
|
+
logger$15.debug('root_admission_completed');
|
|
11709
11709
|
}
|
|
11710
11710
|
this.hadSuccessfulAdmission = true;
|
|
11711
11711
|
delay = RootSessionManager.BACKOFF_INITIAL;
|
|
@@ -11714,7 +11714,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11714
11714
|
await this.startExpiryGuard(welcomeFrame);
|
|
11715
11715
|
const expiryTriggered = await this.waitForExpiryOrStop();
|
|
11716
11716
|
if (expiryTriggered && !this.stopEvent.isSet()) {
|
|
11717
|
-
logger$
|
|
11717
|
+
logger$15.debug('performing_scheduled_re_admission');
|
|
11718
11718
|
continue;
|
|
11719
11719
|
}
|
|
11720
11720
|
}
|
|
@@ -11726,7 +11726,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11726
11726
|
}
|
|
11727
11727
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11728
11728
|
const willRetry = attempts < RootSessionManager.RETRY_MAX_ATTEMPTS;
|
|
11729
|
-
logger$
|
|
11729
|
+
logger$15.warning('root_admission_failed', {
|
|
11730
11730
|
error: errorObject.message,
|
|
11731
11731
|
attempt: attempts,
|
|
11732
11732
|
will_retry: willRetry,
|
|
@@ -11744,7 +11744,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11744
11744
|
}
|
|
11745
11745
|
}
|
|
11746
11746
|
if (attempts >= RootSessionManager.RETRY_MAX_ATTEMPTS) {
|
|
11747
|
-
logger$
|
|
11747
|
+
logger$15.error('root_admission_max_attempts_exceeded', {
|
|
11748
11748
|
max_attempts: RootSessionManager.RETRY_MAX_ATTEMPTS,
|
|
11749
11749
|
});
|
|
11750
11750
|
}
|
|
@@ -11821,7 +11821,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11821
11821
|
}
|
|
11822
11822
|
async expiryGuard(welcomeFrame, signal) {
|
|
11823
11823
|
if (!welcomeFrame.expiresAt) {
|
|
11824
|
-
logger$
|
|
11824
|
+
logger$15.debug('no_admission_expiry_configured');
|
|
11825
11825
|
await Promise.race([this.stopEvent.wait(), this.waitForAbort(signal)]);
|
|
11826
11826
|
return;
|
|
11827
11827
|
}
|
|
@@ -11830,7 +11830,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11830
11830
|
let delaySeconds = (expiresAt.getTime() - now.getTime()) / 1000 -
|
|
11831
11831
|
RootSessionManager.JWT_REFRESH_SAFETY;
|
|
11832
11832
|
delaySeconds = Math.max(delaySeconds, 0);
|
|
11833
|
-
logger$
|
|
11833
|
+
logger$15.debug('admission_expiry_guard_started', {
|
|
11834
11834
|
welcome_expires_at: expiresAt.toISOString(),
|
|
11835
11835
|
delay_seconds: delaySeconds,
|
|
11836
11836
|
refresh_safety_seconds: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11839,7 +11839,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11839
11839
|
if (this.stopEvent.isSet() || signal?.aborted) {
|
|
11840
11840
|
return;
|
|
11841
11841
|
}
|
|
11842
|
-
logger$
|
|
11842
|
+
logger$15.debug('admission_expiry_triggered_refresh', {
|
|
11843
11843
|
expires_at: expiresAt.toISOString(),
|
|
11844
11844
|
current_time: new Date().toISOString(),
|
|
11845
11845
|
seconds_before_expiry: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11854,7 +11854,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11854
11854
|
return;
|
|
11855
11855
|
}
|
|
11856
11856
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11857
|
-
logger$
|
|
11857
|
+
logger$15.debug('background_task_error', {
|
|
11858
11858
|
task_name: task.name,
|
|
11859
11859
|
error: errorObject.message,
|
|
11860
11860
|
});
|
|
@@ -11950,7 +11950,7 @@ class BoundedAsyncQueue {
|
|
|
11950
11950
|
}
|
|
11951
11951
|
}
|
|
11952
11952
|
|
|
11953
|
-
const logger$
|
|
11953
|
+
const logger$14 = getLogger('naylence.fame.connector.broadcast_channel_connector');
|
|
11954
11954
|
const BROADCAST_CHANNEL_CONNECTOR_TYPE$1 = 'broadcast-channel-connector';
|
|
11955
11955
|
const DEFAULT_CHANNEL$7 = 'naylence-fabric';
|
|
11956
11956
|
const DEFAULT_INBOX_CAPACITY$7 = 2048;
|
|
@@ -12039,7 +12039,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12039
12039
|
this.localNodeId = normalizedLocalNodeId;
|
|
12040
12040
|
this.targetNodeId = BroadcastChannelConnector.normalizeTargetNodeId(config.initialTargetNodeId);
|
|
12041
12041
|
this.channel = new BroadcastChannel(this.channelName);
|
|
12042
|
-
logger$
|
|
12042
|
+
logger$14.debug('broadcast_channel_connector_created', {
|
|
12043
12043
|
channel: this.channelName,
|
|
12044
12044
|
connector_id: this.connectorId,
|
|
12045
12045
|
local_node_id: this.localNodeId,
|
|
@@ -12051,7 +12051,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12051
12051
|
this.onMsg = (event) => {
|
|
12052
12052
|
// Guard: Don't process if listener was unregistered
|
|
12053
12053
|
if (!this.listenerRegistered) {
|
|
12054
|
-
logger$
|
|
12054
|
+
logger$14.warning('broadcast_channel_message_after_unregister', {
|
|
12055
12055
|
channel: this.channelName,
|
|
12056
12056
|
connector_id: this.connectorId,
|
|
12057
12057
|
timestamp: new Date().toISOString(),
|
|
@@ -12059,7 +12059,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12059
12059
|
return;
|
|
12060
12060
|
}
|
|
12061
12061
|
const message = event.data;
|
|
12062
|
-
logger$
|
|
12062
|
+
logger$14.debug('broadcast_channel_raw_event', {
|
|
12063
12063
|
channel: this.channelName,
|
|
12064
12064
|
connector_id: this.connectorId,
|
|
12065
12065
|
message_type: message && typeof message === 'object'
|
|
@@ -12075,7 +12075,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12075
12075
|
const busMessage = message;
|
|
12076
12076
|
const senderNodeId = BroadcastChannelConnector.normalizeNodeId(busMessage.senderNodeId);
|
|
12077
12077
|
if (!senderNodeId) {
|
|
12078
|
-
logger$
|
|
12078
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12079
12079
|
channel: this.channelName,
|
|
12080
12080
|
connector_id: this.connectorId,
|
|
12081
12081
|
reason: 'missing_sender_node_id',
|
|
@@ -12083,7 +12083,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12083
12083
|
return;
|
|
12084
12084
|
}
|
|
12085
12085
|
if (senderNodeId === this.localNodeId) {
|
|
12086
|
-
logger$
|
|
12086
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12087
12087
|
channel: this.channelName,
|
|
12088
12088
|
connector_id: this.connectorId,
|
|
12089
12089
|
reason: 'self_echo',
|
|
@@ -12097,14 +12097,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12097
12097
|
}
|
|
12098
12098
|
const payload = BroadcastChannelConnector.coercePayload(busMessage.payload);
|
|
12099
12099
|
if (!payload) {
|
|
12100
|
-
logger$
|
|
12100
|
+
logger$14.debug('broadcast_channel_payload_rejected', {
|
|
12101
12101
|
channel: this.channelName,
|
|
12102
12102
|
connector_id: this.connectorId,
|
|
12103
12103
|
reason: 'unrecognized_payload_type',
|
|
12104
12104
|
});
|
|
12105
12105
|
return;
|
|
12106
12106
|
}
|
|
12107
|
-
logger$
|
|
12107
|
+
logger$14.debug('broadcast_channel_message_received', {
|
|
12108
12108
|
channel: this.channelName,
|
|
12109
12109
|
sender_id: message?.senderId,
|
|
12110
12110
|
sender_node_id: senderNodeId,
|
|
@@ -12133,14 +12133,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12133
12133
|
}
|
|
12134
12134
|
catch (error) {
|
|
12135
12135
|
if (error instanceof QueueFullError) {
|
|
12136
|
-
logger$
|
|
12136
|
+
logger$14.warning('broadcast_channel_receive_queue_full', {
|
|
12137
12137
|
channel: this.channelName,
|
|
12138
12138
|
inbox_capacity: this.inboxCapacity,
|
|
12139
12139
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12140
12140
|
});
|
|
12141
12141
|
}
|
|
12142
12142
|
else {
|
|
12143
|
-
logger$
|
|
12143
|
+
logger$14.error('broadcast_channel_receive_error', {
|
|
12144
12144
|
channel: this.channelName,
|
|
12145
12145
|
error: error instanceof Error ? error.message : String(error),
|
|
12146
12146
|
});
|
|
@@ -12154,7 +12154,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12154
12154
|
// Setup visibility change monitoring
|
|
12155
12155
|
this.visibilityChangeHandler = () => {
|
|
12156
12156
|
const isHidden = document.hidden;
|
|
12157
|
-
logger$
|
|
12157
|
+
logger$14.debug('broadcast_channel_visibility_changed', {
|
|
12158
12158
|
channel: this.channelName,
|
|
12159
12159
|
connector_id: this.connectorId,
|
|
12160
12160
|
visibility: isHidden ? 'hidden' : 'visible',
|
|
@@ -12163,7 +12163,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12163
12163
|
// Pause/resume connector based on visibility
|
|
12164
12164
|
if (isHidden && this.state === ConnectorState.STARTED) {
|
|
12165
12165
|
this.pause().catch((err) => {
|
|
12166
|
-
logger$
|
|
12166
|
+
logger$14.warning('broadcast_channel_pause_failed', {
|
|
12167
12167
|
channel: this.channelName,
|
|
12168
12168
|
connector_id: this.connectorId,
|
|
12169
12169
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12172,7 +12172,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12172
12172
|
}
|
|
12173
12173
|
else if (!isHidden && this.state === ConnectorState.PAUSED) {
|
|
12174
12174
|
this.resume().catch((err) => {
|
|
12175
|
-
logger$
|
|
12175
|
+
logger$14.warning('broadcast_channel_resume_failed', {
|
|
12176
12176
|
channel: this.channelName,
|
|
12177
12177
|
connector_id: this.connectorId,
|
|
12178
12178
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12186,7 +12186,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12186
12186
|
// Track page lifecycle events to detect browser unload/discard
|
|
12187
12187
|
if (typeof window !== 'undefined') {
|
|
12188
12188
|
const lifecycleLogger = (event) => {
|
|
12189
|
-
logger$
|
|
12189
|
+
logger$14.debug('broadcast_channel_page_lifecycle', {
|
|
12190
12190
|
channel: this.channelName,
|
|
12191
12191
|
connector_id: this.connectorId,
|
|
12192
12192
|
event_type: event.type,
|
|
@@ -12202,7 +12202,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12202
12202
|
document.addEventListener('resume', lifecycleLogger);
|
|
12203
12203
|
}
|
|
12204
12204
|
// Log initial state with detailed visibility info
|
|
12205
|
-
logger$
|
|
12205
|
+
logger$14.debug('broadcast_channel_initial_visibility', {
|
|
12206
12206
|
channel: this.channelName,
|
|
12207
12207
|
connector_id: this.connectorId,
|
|
12208
12208
|
visibility: document.hidden ? 'hidden' : 'visible',
|
|
@@ -12234,14 +12234,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12234
12234
|
}
|
|
12235
12235
|
catch (error) {
|
|
12236
12236
|
if (error instanceof QueueFullError) {
|
|
12237
|
-
logger$
|
|
12237
|
+
logger$14.warning('broadcast_channel_push_queue_full', {
|
|
12238
12238
|
channel: this.channelName,
|
|
12239
12239
|
inbox_capacity: this.inboxCapacity,
|
|
12240
12240
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12241
12241
|
});
|
|
12242
12242
|
throw error;
|
|
12243
12243
|
}
|
|
12244
|
-
logger$
|
|
12244
|
+
logger$14.error('broadcast_channel_push_failed', {
|
|
12245
12245
|
channel: this.channelName,
|
|
12246
12246
|
error: error instanceof Error ? error.message : String(error),
|
|
12247
12247
|
});
|
|
@@ -12251,7 +12251,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12251
12251
|
async _transportSendBytes(data) {
|
|
12252
12252
|
ensureBroadcastEnvironment();
|
|
12253
12253
|
const targetNodeId = this.targetNodeId ?? '*';
|
|
12254
|
-
logger$
|
|
12254
|
+
logger$14.debug('broadcast_channel_message_sending', {
|
|
12255
12255
|
channel: this.channelName,
|
|
12256
12256
|
sender_id: this.connectorId,
|
|
12257
12257
|
sender_node_id: this.localNodeId,
|
|
@@ -12272,7 +12272,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12272
12272
|
return item;
|
|
12273
12273
|
}
|
|
12274
12274
|
async _transportClose(code, reason) {
|
|
12275
|
-
logger$
|
|
12275
|
+
logger$14.debug('broadcast_channel_transport_closing', {
|
|
12276
12276
|
channel: this.channelName,
|
|
12277
12277
|
connector_id: this.connectorId,
|
|
12278
12278
|
code,
|
|
@@ -12281,14 +12281,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12281
12281
|
timestamp: new Date().toISOString(),
|
|
12282
12282
|
});
|
|
12283
12283
|
if (this.listenerRegistered) {
|
|
12284
|
-
logger$
|
|
12284
|
+
logger$14.debug('broadcast_channel_removing_listener', {
|
|
12285
12285
|
channel: this.channelName,
|
|
12286
12286
|
connector_id: this.connectorId,
|
|
12287
12287
|
timestamp: new Date().toISOString(),
|
|
12288
12288
|
});
|
|
12289
12289
|
this.channel.removeEventListener('message', this.onMsg);
|
|
12290
12290
|
this.listenerRegistered = false;
|
|
12291
|
-
logger$
|
|
12291
|
+
logger$14.debug('broadcast_channel_listener_removed', {
|
|
12292
12292
|
channel: this.channelName,
|
|
12293
12293
|
connector_id: this.connectorId,
|
|
12294
12294
|
timestamp: new Date().toISOString(),
|
|
@@ -12301,13 +12301,13 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12301
12301
|
this.visibilityChangeListenerRegistered = false;
|
|
12302
12302
|
this.visibilityChangeHandler = undefined;
|
|
12303
12303
|
}
|
|
12304
|
-
logger$
|
|
12304
|
+
logger$14.debug('broadcast_channel_closing', {
|
|
12305
12305
|
channel: this.channelName,
|
|
12306
12306
|
connector_id: this.connectorId,
|
|
12307
12307
|
timestamp: new Date().toISOString(),
|
|
12308
12308
|
});
|
|
12309
12309
|
this.channel.close();
|
|
12310
|
-
logger$
|
|
12310
|
+
logger$14.debug('broadcast_channel_closed', {
|
|
12311
12311
|
channel: this.channelName,
|
|
12312
12312
|
connector_id: this.connectorId,
|
|
12313
12313
|
timestamp: new Date().toISOString(),
|
|
@@ -12331,7 +12331,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12331
12331
|
if (targetNodeId &&
|
|
12332
12332
|
targetNodeId !== '*' &&
|
|
12333
12333
|
targetNodeId !== this.localNodeId) {
|
|
12334
|
-
logger$
|
|
12334
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12335
12335
|
channel: this.channelName,
|
|
12336
12336
|
connector_id: this.connectorId,
|
|
12337
12337
|
reason: 'wildcard_target_mismatch',
|
|
@@ -12347,7 +12347,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12347
12347
|
if (expectedSender &&
|
|
12348
12348
|
expectedSender !== '*' &&
|
|
12349
12349
|
senderNodeId !== expectedSender) {
|
|
12350
|
-
logger$
|
|
12350
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12351
12351
|
channel: this.channelName,
|
|
12352
12352
|
connector_id: this.connectorId,
|
|
12353
12353
|
reason: 'unexpected_sender',
|
|
@@ -12360,7 +12360,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12360
12360
|
if (targetNodeId &&
|
|
12361
12361
|
targetNodeId !== '*' &&
|
|
12362
12362
|
targetNodeId !== this.localNodeId) {
|
|
12363
|
-
logger$
|
|
12363
|
+
logger$14.debug('broadcast_channel_message_rejected', {
|
|
12364
12364
|
channel: this.channelName,
|
|
12365
12365
|
connector_id: this.connectorId,
|
|
12366
12366
|
reason: 'unexpected_target',
|
|
@@ -12385,7 +12385,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12385
12385
|
return 'unknown';
|
|
12386
12386
|
}
|
|
12387
12387
|
logInboxSnapshot(event, extra = {}) {
|
|
12388
|
-
logger$
|
|
12388
|
+
logger$14.debug(event, {
|
|
12389
12389
|
channel: this.channelName,
|
|
12390
12390
|
connector_id: this.connectorId,
|
|
12391
12391
|
connector_state: this.state,
|
|
@@ -12401,7 +12401,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12401
12401
|
await super.start(inboundHandler);
|
|
12402
12402
|
// After transitioning to STARTED, check if tab is already hidden
|
|
12403
12403
|
if (typeof document !== 'undefined' && document.hidden) {
|
|
12404
|
-
logger$
|
|
12404
|
+
logger$14.debug('broadcast_channel_start_in_hidden_tab', {
|
|
12405
12405
|
channel: this.channelName,
|
|
12406
12406
|
connector_id: this.connectorId,
|
|
12407
12407
|
document_hidden: document.hidden,
|
|
@@ -12411,7 +12411,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12411
12411
|
});
|
|
12412
12412
|
// Immediately pause if tab is hidden at start time
|
|
12413
12413
|
await this.pause().catch((err) => {
|
|
12414
|
-
logger$
|
|
12414
|
+
logger$14.warning('broadcast_channel_initial_pause_failed', {
|
|
12415
12415
|
channel: this.channelName,
|
|
12416
12416
|
connector_id: this.connectorId,
|
|
12417
12417
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12429,7 +12429,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12429
12429
|
return;
|
|
12430
12430
|
}
|
|
12431
12431
|
this.targetNodeId = normalized;
|
|
12432
|
-
logger$
|
|
12432
|
+
logger$14.debug('broadcast_channel_target_updated', {
|
|
12433
12433
|
channel: this.channelName,
|
|
12434
12434
|
connector_id: this.connectorId,
|
|
12435
12435
|
local_node_id: this.localNodeId,
|
|
@@ -12439,7 +12439,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12439
12439
|
}
|
|
12440
12440
|
setWildcardTarget() {
|
|
12441
12441
|
this.targetNodeId = '*';
|
|
12442
|
-
logger$
|
|
12442
|
+
logger$14.debug('broadcast_channel_target_updated', {
|
|
12443
12443
|
channel: this.channelName,
|
|
12444
12444
|
connector_id: this.connectorId,
|
|
12445
12445
|
local_node_id: this.localNodeId,
|
|
@@ -12567,7 +12567,7 @@ function broadcastChannelGrantToConnectorConfig(grant) {
|
|
|
12567
12567
|
return config;
|
|
12568
12568
|
}
|
|
12569
12569
|
|
|
12570
|
-
const logger$
|
|
12570
|
+
const logger$13 = getLogger('naylence.fame.node.upstream_session_manager');
|
|
12571
12571
|
function isPlainRecord$4(value) {
|
|
12572
12572
|
if (typeof value !== 'object' || value === null) {
|
|
12573
12573
|
return false;
|
|
@@ -12688,7 +12688,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12688
12688
|
this.wrappedHandler = this.makeHeartbeatEnabledHandler(options.inboundHandler);
|
|
12689
12689
|
// Store the connection retry policy (can be null, in which case default behavior applies)
|
|
12690
12690
|
this.connectionRetryPolicy = options.retryPolicy ?? null;
|
|
12691
|
-
logger$
|
|
12691
|
+
logger$13.debug('created_upstream_session_manager', {
|
|
12692
12692
|
target_system_id: this.targetSystemId,
|
|
12693
12693
|
has_retry_policy: this.connectionRetryPolicy !== null,
|
|
12694
12694
|
});
|
|
@@ -12697,23 +12697,23 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12697
12697
|
return this.targetSystemId;
|
|
12698
12698
|
}
|
|
12699
12699
|
setupVisibilityListener() {
|
|
12700
|
-
logger$
|
|
12700
|
+
logger$13.debug('setup_visibility_listener_called', {
|
|
12701
12701
|
has_document: typeof document !== 'undefined',
|
|
12702
12702
|
});
|
|
12703
12703
|
if (typeof document !== 'undefined' && document.addEventListener) {
|
|
12704
12704
|
this._visibilityHandler = () => {
|
|
12705
|
-
logger$
|
|
12705
|
+
logger$13.debug('visibility_change_event_fired', {
|
|
12706
12706
|
state: document.visibilityState,
|
|
12707
12707
|
});
|
|
12708
12708
|
if (document.visibilityState === 'visible') {
|
|
12709
|
-
logger$
|
|
12709
|
+
logger$13.debug('visibility_change_detected_waking_up');
|
|
12710
12710
|
this.wakeEvent.set();
|
|
12711
12711
|
}
|
|
12712
12712
|
};
|
|
12713
12713
|
document.addEventListener('visibilitychange', this._visibilityHandler);
|
|
12714
12714
|
}
|
|
12715
12715
|
else {
|
|
12716
|
-
logger$
|
|
12716
|
+
logger$13.debug('setup_visibility_listener_skipped_no_document');
|
|
12717
12717
|
}
|
|
12718
12718
|
}
|
|
12719
12719
|
teardownVisibilityListener() {
|
|
@@ -12746,13 +12746,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12746
12746
|
}
|
|
12747
12747
|
throw new FameConnectError('Upstream session manager failed to attach');
|
|
12748
12748
|
}
|
|
12749
|
-
logger$
|
|
12749
|
+
logger$13.debug('upstream_session_manager_started');
|
|
12750
12750
|
}
|
|
12751
12751
|
getActiveConnector() {
|
|
12752
12752
|
return this.connector;
|
|
12753
12753
|
}
|
|
12754
12754
|
async stop() {
|
|
12755
|
-
logger$
|
|
12755
|
+
logger$13.debug('upstream_session_manager_stopping');
|
|
12756
12756
|
this.teardownVisibilityListener();
|
|
12757
12757
|
this.stopEvent.set();
|
|
12758
12758
|
this.currentStopSubtasks?.set();
|
|
@@ -12763,7 +12763,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12763
12763
|
}
|
|
12764
12764
|
catch (error) {
|
|
12765
12765
|
if (!(error instanceof TaskCancelledError)) {
|
|
12766
|
-
logger$
|
|
12766
|
+
logger$13.debug('fsm_task_stopped_with_error', {
|
|
12767
12767
|
error: error.message,
|
|
12768
12768
|
});
|
|
12769
12769
|
}
|
|
@@ -12772,13 +12772,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12772
12772
|
}
|
|
12773
12773
|
if (this.connector) {
|
|
12774
12774
|
await this.connector.stop().catch((error) => {
|
|
12775
|
-
logger$
|
|
12775
|
+
logger$13.debug('connector_stop_error', {
|
|
12776
12776
|
error: error.message,
|
|
12777
12777
|
});
|
|
12778
12778
|
});
|
|
12779
12779
|
this.connector = null;
|
|
12780
12780
|
}
|
|
12781
|
-
logger$
|
|
12781
|
+
logger$13.debug('upstream_session_manager_stopped');
|
|
12782
12782
|
}
|
|
12783
12783
|
async send(envelope) {
|
|
12784
12784
|
if (this.messageQueue.length >= UpstreamSessionManager.TX_QUEUE_MAX) {
|
|
@@ -12827,7 +12827,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12827
12827
|
const shouldFailFast = this.shouldFailFastOnError(error);
|
|
12828
12828
|
if (error instanceof FameTransportClose ||
|
|
12829
12829
|
error instanceof FameConnectError) {
|
|
12830
|
-
logger$
|
|
12830
|
+
logger$13.warning('upstream_link_closed', {
|
|
12831
12831
|
error: error.message,
|
|
12832
12832
|
will_retry: !shouldFailFast,
|
|
12833
12833
|
attempt: this.initialAttempts,
|
|
@@ -12840,13 +12840,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12840
12840
|
else {
|
|
12841
12841
|
const err = error;
|
|
12842
12842
|
if (err.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
12843
|
-
logger$
|
|
12843
|
+
logger$13.info('upstream_link_redirecting', {
|
|
12844
12844
|
error: err.message,
|
|
12845
12845
|
will_retry: true,
|
|
12846
12846
|
});
|
|
12847
12847
|
}
|
|
12848
12848
|
else {
|
|
12849
|
-
logger$
|
|
12849
|
+
logger$13.warning('upstream_link_closed', {
|
|
12850
12850
|
error: err.message,
|
|
12851
12851
|
will_retry: !shouldFailFast,
|
|
12852
12852
|
attempt: this.initialAttempts,
|
|
@@ -12890,7 +12890,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12890
12890
|
// If sleep was interrupted by visibility change (user returned to tab),
|
|
12891
12891
|
// reset backoff to initial delay for immediate retry with fresh backoff
|
|
12892
12892
|
if (wasWoken) {
|
|
12893
|
-
logger$
|
|
12893
|
+
logger$13.debug('backoff_reset_on_visibility_change', {
|
|
12894
12894
|
previous_delay: delay,
|
|
12895
12895
|
new_delay: UpstreamSessionManager.BACKOFF_INITIAL,
|
|
12896
12896
|
});
|
|
@@ -12909,7 +12909,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12909
12909
|
// Check if wake event is already set (e.g., visibility just changed)
|
|
12910
12910
|
if (this.wakeEvent.isSet()) {
|
|
12911
12911
|
this.wakeEvent.clear();
|
|
12912
|
-
logger$
|
|
12912
|
+
logger$13.debug('sleep_skipped_wake_event_pending');
|
|
12913
12913
|
return true;
|
|
12914
12914
|
}
|
|
12915
12915
|
let timeout;
|
|
@@ -12926,7 +12926,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12926
12926
|
]);
|
|
12927
12927
|
const wasWoken = this.wakeEvent.isSet();
|
|
12928
12928
|
if (wasWoken) {
|
|
12929
|
-
logger$
|
|
12929
|
+
logger$13.debug('sleep_interrupted_by_wake_event');
|
|
12930
12930
|
this.wakeEvent.clear();
|
|
12931
12931
|
}
|
|
12932
12932
|
if (timeout !== undefined) {
|
|
@@ -12989,7 +12989,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12989
12989
|
await connector.start(this.wrappedHandler);
|
|
12990
12990
|
this.connector = connector;
|
|
12991
12991
|
const callbackGrants = this.node.gatherSupportedCallbackGrants();
|
|
12992
|
-
logger$
|
|
12992
|
+
logger$13.debug('callback_grants_before_augmentation', {
|
|
12993
12993
|
count: callbackGrants.length,
|
|
12994
12994
|
types: callbackGrants.map((g) => g.type),
|
|
12995
12995
|
});
|
|
@@ -12999,7 +12999,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12999
12999
|
const broadcastCallbackGrant = shouldAddBroadcastGrant
|
|
13000
13000
|
? this.createBroadcastCallbackGrant(grant)
|
|
13001
13001
|
: null;
|
|
13002
|
-
logger$
|
|
13002
|
+
logger$13.debug('broadcast_callback_grant_check', {
|
|
13003
13003
|
should_add: shouldAddBroadcastGrant,
|
|
13004
13004
|
grant_created: !!broadcastCallbackGrant,
|
|
13005
13005
|
});
|
|
@@ -13018,12 +13018,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13018
13018
|
const isDuplicate = callbackGrants.some((existing) => JSON.stringify(existing) === JSON.stringify(grant));
|
|
13019
13019
|
if (!isDuplicate) {
|
|
13020
13020
|
callbackGrants.push(grant);
|
|
13021
|
-
logger$
|
|
13021
|
+
logger$13.debug('added_connection_grant_as_callback', {
|
|
13022
13022
|
type: grant.type,
|
|
13023
13023
|
});
|
|
13024
13024
|
}
|
|
13025
13025
|
else {
|
|
13026
|
-
logger$
|
|
13026
|
+
logger$13.debug('skipped_duplicate_connection_grant', {
|
|
13027
13027
|
type: grant.type,
|
|
13028
13028
|
});
|
|
13029
13029
|
}
|
|
@@ -13035,12 +13035,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13035
13035
|
if (broadcastCallbackGrant &&
|
|
13036
13036
|
this.shouldAdvertiseBroadcastGrant(grant, callbackGrants)) {
|
|
13037
13037
|
callbackGrants.push(broadcastCallbackGrant);
|
|
13038
|
-
logger$
|
|
13038
|
+
logger$13.debug('added_broadcast_callback_grant');
|
|
13039
13039
|
}
|
|
13040
13040
|
else if (broadcastCallbackGrant) {
|
|
13041
|
-
logger$
|
|
13041
|
+
logger$13.debug('skipped_duplicate_broadcast_callback_grant');
|
|
13042
13042
|
}
|
|
13043
|
-
logger$
|
|
13043
|
+
logger$13.debug('callback_grants_after_augmentation', {
|
|
13044
13044
|
count: callbackGrants.length,
|
|
13045
13045
|
types: callbackGrants.map((g) => g.type),
|
|
13046
13046
|
});
|
|
@@ -13053,7 +13053,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13053
13053
|
targetAware.setTargetNodeId(this.targetSystemId);
|
|
13054
13054
|
}
|
|
13055
13055
|
catch (error) {
|
|
13056
|
-
logger$
|
|
13056
|
+
logger$13.warning('broadcast_channel_target_apply_failed', {
|
|
13057
13057
|
error: error instanceof Error ? error.message : String(error),
|
|
13058
13058
|
target_node_id: this.targetSystemId,
|
|
13059
13059
|
});
|
|
@@ -13075,14 +13075,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13075
13075
|
});
|
|
13076
13076
|
}
|
|
13077
13077
|
else {
|
|
13078
|
-
logger$
|
|
13078
|
+
logger$13.warning('parent_epoch_changed', { epoch });
|
|
13079
13079
|
}
|
|
13080
13080
|
}
|
|
13081
13081
|
if (!this.readyEvent.isSet()) {
|
|
13082
13082
|
this.readyEvent.set();
|
|
13083
13083
|
}
|
|
13084
13084
|
if (this.messageQueue.length > 0) {
|
|
13085
|
-
logger$
|
|
13085
|
+
logger$13.debug('flushing_buffered_frames', {
|
|
13086
13086
|
queue_size: this.messageQueue.length,
|
|
13087
13087
|
});
|
|
13088
13088
|
this.queueEvent.set();
|
|
@@ -13099,12 +13099,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13099
13099
|
name: `expiry-guard-${this.connectEpoch}`,
|
|
13100
13100
|
});
|
|
13101
13101
|
if (this.hadSuccessfulAttach) {
|
|
13102
|
-
logger$
|
|
13102
|
+
logger$13.debug('reconnected_to_upstream', {
|
|
13103
13103
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13104
13104
|
});
|
|
13105
13105
|
}
|
|
13106
13106
|
else {
|
|
13107
|
-
logger$
|
|
13107
|
+
logger$13.debug('connected_to_upstream', {
|
|
13108
13108
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13109
13109
|
});
|
|
13110
13110
|
}
|
|
@@ -13122,18 +13122,18 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13122
13122
|
this.currentStopSubtasks = null;
|
|
13123
13123
|
await Promise.allSettled(tasks.map((task) => task.promise));
|
|
13124
13124
|
if (this.connector) {
|
|
13125
|
-
logger$
|
|
13125
|
+
logger$13.debug('upstream_stopping_old_connector', {
|
|
13126
13126
|
connect_epoch: this.connectEpoch,
|
|
13127
13127
|
target_system_id: this.targetSystemId,
|
|
13128
13128
|
timestamp: new Date().toISOString(),
|
|
13129
13129
|
});
|
|
13130
13130
|
await this.connector.stop().catch((err) => {
|
|
13131
|
-
logger$
|
|
13131
|
+
logger$13.warning('upstream_connector_stop_error', {
|
|
13132
13132
|
connect_epoch: this.connectEpoch,
|
|
13133
13133
|
error: err instanceof Error ? err.message : String(err),
|
|
13134
13134
|
});
|
|
13135
13135
|
});
|
|
13136
|
-
logger$
|
|
13136
|
+
logger$13.debug('upstream_old_connector_stopped', {
|
|
13137
13137
|
connect_epoch: this.connectEpoch,
|
|
13138
13138
|
target_system_id: this.targetSystemId,
|
|
13139
13139
|
timestamp: new Date().toISOString(),
|
|
@@ -13186,7 +13186,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13186
13186
|
});
|
|
13187
13187
|
}
|
|
13188
13188
|
catch (error) {
|
|
13189
|
-
logger$
|
|
13189
|
+
logger$13.debug('broadcast_callback_grant_generation_failed', {
|
|
13190
13190
|
error: error instanceof Error ? error.message : String(error),
|
|
13191
13191
|
});
|
|
13192
13192
|
return null;
|
|
@@ -13241,7 +13241,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13241
13241
|
}
|
|
13242
13242
|
}
|
|
13243
13243
|
async heartbeatLoop(connector, stopEvt, signal) {
|
|
13244
|
-
logger$
|
|
13244
|
+
logger$13.debug('starting_heartbeat_loop');
|
|
13245
13245
|
const intervalMs = UpstreamSessionManager.HEARTBEAT_INTERVAL * 1000;
|
|
13246
13246
|
const graceMs = intervalMs * UpstreamSessionManager.HEARTBEAT_GRACE;
|
|
13247
13247
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13277,7 +13277,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13277
13277
|
// Skip heartbeat if connector is paused (e.g., tab is hidden)
|
|
13278
13278
|
// Keep ack time current so we don't timeout immediately after resuming
|
|
13279
13279
|
if (currentState === ConnectorState.PAUSED) {
|
|
13280
|
-
logger$
|
|
13280
|
+
logger$13.debug('skipping_heartbeat_connector_paused', {
|
|
13281
13281
|
connector_state: currentState,
|
|
13282
13282
|
});
|
|
13283
13283
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13286,14 +13286,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13286
13286
|
// Reset ack time if just resumed from pause (prevents immediate timeout)
|
|
13287
13287
|
if (previousState === ConnectorState.PAUSED &&
|
|
13288
13288
|
currentState === ConnectorState.STARTED) {
|
|
13289
|
-
logger$
|
|
13289
|
+
logger$13.debug('connector_just_resumed_resetting_ack_time', {
|
|
13290
13290
|
previous_state: previousState,
|
|
13291
13291
|
current_state: currentState,
|
|
13292
13292
|
});
|
|
13293
13293
|
this.lastHeartbeatAckTime = Date.now();
|
|
13294
13294
|
}
|
|
13295
13295
|
const envelope = await this.makeHeartbeatEnvelope();
|
|
13296
|
-
logger$
|
|
13296
|
+
logger$13.debug('sending_heartbeat', {
|
|
13297
13297
|
hb_corr_id: envelope.corrId,
|
|
13298
13298
|
hb_env_id: envelope.id,
|
|
13299
13299
|
});
|
|
@@ -13319,7 +13319,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13319
13319
|
throw new FameConnectError('missed heartbeat acknowledgement');
|
|
13320
13320
|
}
|
|
13321
13321
|
}
|
|
13322
|
-
logger$
|
|
13322
|
+
logger$13.debug('completed_heartbeat_loop');
|
|
13323
13323
|
}
|
|
13324
13324
|
async messagePumpLoop(connector, stopEvt, signal) {
|
|
13325
13325
|
while (!stopEvt.isSet() && !signal?.aborted) {
|
|
@@ -13336,19 +13336,19 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13336
13336
|
if (!envelope) {
|
|
13337
13337
|
continue;
|
|
13338
13338
|
}
|
|
13339
|
-
logger$
|
|
13339
|
+
logger$13.debug('upstream_pump_sending_envelope', {
|
|
13340
13340
|
envelopeId: envelope.id,
|
|
13341
13341
|
type: envelope.frame?.type,
|
|
13342
13342
|
});
|
|
13343
13343
|
try {
|
|
13344
13344
|
await connector.send(envelope);
|
|
13345
|
-
logger$
|
|
13345
|
+
logger$13.debug('upstream_pump_sent_envelope', {
|
|
13346
13346
|
envelopeId: envelope.id,
|
|
13347
13347
|
});
|
|
13348
13348
|
}
|
|
13349
13349
|
catch (error) {
|
|
13350
13350
|
if (error instanceof FameMessageTooLarge) {
|
|
13351
|
-
logger$
|
|
13351
|
+
logger$13.error('failed_to_send_message', { error: error.message });
|
|
13352
13352
|
await this.handleMessageTooLarge(envelope, error.message);
|
|
13353
13353
|
}
|
|
13354
13354
|
else if (error instanceof FameTransportClose) {
|
|
@@ -13410,7 +13410,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13410
13410
|
await fabric.send(ackEnvelope);
|
|
13411
13411
|
}
|
|
13412
13412
|
catch (error) {
|
|
13413
|
-
logger$
|
|
13413
|
+
logger$13.warning('failed_to_send_nack', {
|
|
13414
13414
|
error: error.message,
|
|
13415
13415
|
});
|
|
13416
13416
|
}
|
|
@@ -13424,7 +13424,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13424
13424
|
timestamps.push(info.attachExpiresAt);
|
|
13425
13425
|
}
|
|
13426
13426
|
if (!timestamps.length) {
|
|
13427
|
-
logger$
|
|
13427
|
+
logger$13.debug('no_ttl_expiry_configured');
|
|
13428
13428
|
await this.waitEvent(stopEvt, signal);
|
|
13429
13429
|
return;
|
|
13430
13430
|
}
|
|
@@ -13433,7 +13433,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13433
13433
|
let delaySeconds = (earliest.getTime() - now.getTime()) / 1000 -
|
|
13434
13434
|
UpstreamSessionManager.JWT_REFRESH_SAFETY;
|
|
13435
13435
|
delaySeconds = Math.max(delaySeconds, UpstreamSessionManager.JWT_REFRESH_SAFETY);
|
|
13436
|
-
logger$
|
|
13436
|
+
logger$13.debug('ttl_expiry_guard_started', {
|
|
13437
13437
|
welcome_expires_at: welcome.frame.expiresAt ?? null,
|
|
13438
13438
|
attach_expires_at: info.attachExpiresAt?.toISOString?.() ?? null,
|
|
13439
13439
|
earliest_expiry: earliest.toISOString(),
|
|
@@ -13461,7 +13461,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13461
13461
|
}
|
|
13462
13462
|
}
|
|
13463
13463
|
if (!stopEvt.isSet()) {
|
|
13464
|
-
logger$
|
|
13464
|
+
logger$13.debug('ttl_expiry_triggered_reconnect', {
|
|
13465
13465
|
expires_at: earliest.toISOString(),
|
|
13466
13466
|
current_time: new Date().toISOString(),
|
|
13467
13467
|
seconds_before_expiry: UpstreamSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -13506,7 +13506,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13506
13506
|
}
|
|
13507
13507
|
await this.node.dispatchEnvelopeEvent('onEnvelopeReceived', this.node, env, context);
|
|
13508
13508
|
if (env.frame.type === 'NodeHeartbeatAck') {
|
|
13509
|
-
logger$
|
|
13509
|
+
logger$13.debug('received_heartbeat_ack', {
|
|
13510
13510
|
hb_ack_env_id: env.id,
|
|
13511
13511
|
hb_ack_corr_id: env.corrId,
|
|
13512
13512
|
hb_routing_epoch: env.frame.routingEpoch,
|
|
@@ -13520,7 +13520,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13520
13520
|
await this.onEpochChange(epoch);
|
|
13521
13521
|
}
|
|
13522
13522
|
else {
|
|
13523
|
-
logger$
|
|
13523
|
+
logger$13.warning('parent_epoch_changed', { epoch });
|
|
13524
13524
|
}
|
|
13525
13525
|
}
|
|
13526
13526
|
return;
|
|
@@ -13539,7 +13539,7 @@ UpstreamSessionManager.TX_QUEUE_MAX = 512;
|
|
|
13539
13539
|
UpstreamSessionManager.BACKOFF_INITIAL = 1; // seconds
|
|
13540
13540
|
UpstreamSessionManager.BACKOFF_CAP = 30; // seconds
|
|
13541
13541
|
|
|
13542
|
-
const logger$
|
|
13542
|
+
const logger$12 = getLogger('naylence.fame.node.admission.noop_admission_client');
|
|
13543
13543
|
class NoopAdmissionClient {
|
|
13544
13544
|
constructor(options = {}) {
|
|
13545
13545
|
this.hasUpstream = false;
|
|
@@ -13553,7 +13553,7 @@ class NoopAdmissionClient {
|
|
|
13553
13553
|
const acceptedLogicals = this.autoAcceptLogicals
|
|
13554
13554
|
? [...(requestedLogicals ?? [])]
|
|
13555
13555
|
: [];
|
|
13556
|
-
logger$
|
|
13556
|
+
logger$12.debug('noop_admission_hello', {
|
|
13557
13557
|
systemId: effectiveSystemId,
|
|
13558
13558
|
instanceId,
|
|
13559
13559
|
requestedLogicals,
|
|
@@ -13571,7 +13571,7 @@ class NoopAdmissionClient {
|
|
|
13571
13571
|
});
|
|
13572
13572
|
}
|
|
13573
13573
|
async close() {
|
|
13574
|
-
logger$
|
|
13574
|
+
logger$12.debug('noop_admission_close');
|
|
13575
13575
|
}
|
|
13576
13576
|
}
|
|
13577
13577
|
|
|
@@ -13777,7 +13777,7 @@ class DefaultServiceManager {
|
|
|
13777
13777
|
}
|
|
13778
13778
|
|
|
13779
13779
|
const SYSTEM_INBOX$1 = '__sys__';
|
|
13780
|
-
const logger$
|
|
13780
|
+
const logger$11 = getLogger('naylence.fame.node.node');
|
|
13781
13781
|
function isSnakeCase(name) {
|
|
13782
13782
|
return name.includes('_');
|
|
13783
13783
|
}
|
|
@@ -14047,7 +14047,7 @@ class FameNode extends TaskSpawner {
|
|
|
14047
14047
|
confirmIdentity(systemId, source) {
|
|
14048
14048
|
if (this._confirmedId) {
|
|
14049
14049
|
if (this._confirmedId !== systemId) {
|
|
14050
|
-
logger$
|
|
14050
|
+
logger$11.error('node_identity_mismatch', {
|
|
14051
14051
|
current_id: this._confirmedId,
|
|
14052
14052
|
new_id: systemId,
|
|
14053
14053
|
source,
|
|
@@ -14059,14 +14059,14 @@ class FameNode extends TaskSpawner {
|
|
|
14059
14059
|
const isReassignment = this._provisionalId !== systemId;
|
|
14060
14060
|
this._confirmedId = systemId;
|
|
14061
14061
|
if (isReassignment) {
|
|
14062
|
-
logger$
|
|
14062
|
+
logger$11.debug('node_identity_reassigned', {
|
|
14063
14063
|
system_id: systemId,
|
|
14064
14064
|
previous_id: this._provisionalId,
|
|
14065
14065
|
source,
|
|
14066
14066
|
});
|
|
14067
14067
|
}
|
|
14068
14068
|
else {
|
|
14069
|
-
logger$
|
|
14069
|
+
logger$11.debug('node_identity_confirmed', {
|
|
14070
14070
|
system_id: systemId,
|
|
14071
14071
|
source,
|
|
14072
14072
|
});
|
|
@@ -14134,7 +14134,7 @@ class FameNode extends TaskSpawner {
|
|
|
14134
14134
|
return;
|
|
14135
14135
|
}
|
|
14136
14136
|
if (frameType === 'NodeHeartbeat') {
|
|
14137
|
-
logger$
|
|
14137
|
+
logger$11.debug('received_heartbeat_frame', {
|
|
14138
14138
|
envelopeId: envelope.id,
|
|
14139
14139
|
corrId: envelope.corrId ?? null,
|
|
14140
14140
|
});
|
|
@@ -14146,7 +14146,7 @@ class FameNode extends TaskSpawner {
|
|
|
14146
14146
|
await this.handleDeliveryAck(envelope, context);
|
|
14147
14147
|
return;
|
|
14148
14148
|
}
|
|
14149
|
-
logger$
|
|
14149
|
+
logger$11.debug('unhandled_system_frame', {
|
|
14150
14150
|
envelopeId: envelope.id,
|
|
14151
14151
|
frameType,
|
|
14152
14152
|
});
|
|
@@ -14158,13 +14158,13 @@ class FameNode extends TaskSpawner {
|
|
|
14158
14158
|
}
|
|
14159
14159
|
await this._deliveryTracker.onEnvelopeDelivered(SYSTEM_INBOX$1, envelope, context);
|
|
14160
14160
|
if (frame.ok !== false) {
|
|
14161
|
-
logger$
|
|
14161
|
+
logger$11.debug('delivery_ack_received', {
|
|
14162
14162
|
envelopeId: envelope.id,
|
|
14163
14163
|
corrId: envelope.corrId ?? null,
|
|
14164
14164
|
});
|
|
14165
14165
|
return;
|
|
14166
14166
|
}
|
|
14167
|
-
logger$
|
|
14167
|
+
logger$11.warning('delivery_nack_received', {
|
|
14168
14168
|
envelopeId: envelope.id,
|
|
14169
14169
|
corrId: envelope.corrId ?? null,
|
|
14170
14170
|
code: frame.code ?? null,
|
|
@@ -14174,7 +14174,7 @@ class FameNode extends TaskSpawner {
|
|
|
14174
14174
|
await this.onDeliveryNack(frame, envelope, context);
|
|
14175
14175
|
}
|
|
14176
14176
|
async onDeliveryNack(frame, envelope, _context) {
|
|
14177
|
-
logger$
|
|
14177
|
+
logger$11.debug('delivery_nack_processed', {
|
|
14178
14178
|
envelopeId: envelope.id,
|
|
14179
14179
|
code: frame.code ?? null,
|
|
14180
14180
|
reason: frame.reason ?? null,
|
|
@@ -14289,7 +14289,7 @@ class FameNode extends TaskSpawner {
|
|
|
14289
14289
|
await this._bindingManager.restore();
|
|
14290
14290
|
await this._envelopeListenerManager.start();
|
|
14291
14291
|
this._isStarted = true;
|
|
14292
|
-
logger$
|
|
14292
|
+
logger$11.debug('node_started', {
|
|
14293
14293
|
node_id: this.id,
|
|
14294
14294
|
sid: this.sid,
|
|
14295
14295
|
path: this.physicalPath,
|
|
@@ -14321,7 +14321,7 @@ class FameNode extends TaskSpawner {
|
|
|
14321
14321
|
await this._serviceManager.stop();
|
|
14322
14322
|
await this.dispatchEvent('onNodeStopped', this);
|
|
14323
14323
|
this._isStarted = false;
|
|
14324
|
-
logger$
|
|
14324
|
+
logger$11.debug('node_stopped', {
|
|
14325
14325
|
node_id: this.id,
|
|
14326
14326
|
});
|
|
14327
14327
|
}
|
|
@@ -14511,20 +14511,20 @@ class FameNode extends TaskSpawner {
|
|
|
14511
14511
|
await this.forwardUpstream(processedEnvelope, context);
|
|
14512
14512
|
}
|
|
14513
14513
|
else {
|
|
14514
|
-
logger$
|
|
14514
|
+
logger$11.error('attempted_upstream_loop', {
|
|
14515
14515
|
envelopeId: processedEnvelope.id,
|
|
14516
14516
|
});
|
|
14517
14517
|
}
|
|
14518
14518
|
return;
|
|
14519
14519
|
}
|
|
14520
14520
|
if (!processedEnvelope.to) {
|
|
14521
|
-
logger$
|
|
14521
|
+
logger$11.error('dropping_envelope_without_destination', {
|
|
14522
14522
|
envelopeId: processedEnvelope.id,
|
|
14523
14523
|
capabilities: processedEnvelope.capabilities ?? [],
|
|
14524
14524
|
});
|
|
14525
14525
|
return;
|
|
14526
14526
|
}
|
|
14527
|
-
logger$
|
|
14527
|
+
logger$11.warning('no_local_handler_for_address', {
|
|
14528
14528
|
address: processedEnvelope.to.toString?.() ?? String(processedEnvelope.to),
|
|
14529
14529
|
originType: context?.originType ?? null,
|
|
14530
14530
|
});
|
|
@@ -14648,7 +14648,7 @@ class FameNode extends TaskSpawner {
|
|
|
14648
14648
|
}
|
|
14649
14649
|
}
|
|
14650
14650
|
catch (error) {
|
|
14651
|
-
logger$
|
|
14651
|
+
logger$11.warning('callback_grant_collection_failed', {
|
|
14652
14652
|
error: error instanceof Error ? error.message : String(error),
|
|
14653
14653
|
});
|
|
14654
14654
|
}
|
|
@@ -14711,7 +14711,7 @@ class FameNode extends TaskSpawner {
|
|
|
14711
14711
|
await store.set('self', record);
|
|
14712
14712
|
}
|
|
14713
14713
|
catch (error) {
|
|
14714
|
-
logger$
|
|
14714
|
+
logger$11.warning('node_meta_persist_failed', {
|
|
14715
14715
|
error: error instanceof Error ? error.message : String(error),
|
|
14716
14716
|
});
|
|
14717
14717
|
}
|
|
@@ -14849,44 +14849,12 @@ class ConnectionRetryPolicyFactory extends AbstractResourceFactory {
|
|
|
14849
14849
|
}
|
|
14850
14850
|
}
|
|
14851
14851
|
|
|
14852
|
-
|
|
14853
|
-
|
|
14854
|
-
|
|
14855
|
-
|
|
14856
|
-
|
|
14857
|
-
|
|
14858
|
-
throw new Error('Failed to create token provider from configuration');
|
|
14859
|
-
}
|
|
14860
|
-
return provider;
|
|
14861
|
-
}
|
|
14862
|
-
let provider = null;
|
|
14863
|
-
try {
|
|
14864
|
-
provider = await createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
14865
|
-
}
|
|
14866
|
-
catch (error) {
|
|
14867
|
-
const message = 'Failed to create default token provider' +
|
|
14868
|
-
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
14869
|
-
throw new Error(message);
|
|
14870
|
-
}
|
|
14871
|
-
if (!provider) {
|
|
14872
|
-
throw new Error('Failed to create default token provider');
|
|
14873
|
-
}
|
|
14874
|
-
return provider;
|
|
14875
|
-
}
|
|
14876
|
-
}
|
|
14877
|
-
|
|
14878
|
-
function isTokenProvider(candidate) {
|
|
14879
|
-
return (typeof candidate === 'object' &&
|
|
14880
|
-
candidate !== null &&
|
|
14881
|
-
typeof candidate.getToken === 'function');
|
|
14882
|
-
}
|
|
14883
|
-
function isIdentityExposingTokenProvider(candidate) {
|
|
14884
|
-
return (isTokenProvider(candidate) &&
|
|
14885
|
-
typeof candidate.getIdentity ===
|
|
14886
|
-
'function');
|
|
14887
|
-
}
|
|
14888
|
-
|
|
14889
|
-
const logger$11 = getLogger('naylence.fame.node.default_node_identity_policy');
|
|
14852
|
+
/**
|
|
14853
|
+
* Default node identity policy that preserves the current node ID.
|
|
14854
|
+
*
|
|
14855
|
+
* This policy does NOT derive identity from tokens or grants.
|
|
14856
|
+
* For token-subject-based identity, use TokenSubjectNodeIdentityPolicy.
|
|
14857
|
+
*/
|
|
14890
14858
|
class DefaultNodeIdentityPolicy {
|
|
14891
14859
|
async resolveInitialNodeId(context) {
|
|
14892
14860
|
if (context.configuredId) {
|
|
@@ -14898,44 +14866,10 @@ class DefaultNodeIdentityPolicy {
|
|
|
14898
14866
|
return await generateIdAsync({ mode: 'fingerprint' });
|
|
14899
14867
|
}
|
|
14900
14868
|
async resolveAdmissionNodeId(context) {
|
|
14901
|
-
|
|
14902
|
-
|
|
14903
|
-
for (const grant of context.grants) {
|
|
14904
|
-
try {
|
|
14905
|
-
const auth = grant.auth;
|
|
14906
|
-
if (!auth) {
|
|
14907
|
-
continue;
|
|
14908
|
-
}
|
|
14909
|
-
const tokenProviderConfig = (auth.tokenProvider ??
|
|
14910
|
-
auth.token_provider);
|
|
14911
|
-
if (!tokenProviderConfig ||
|
|
14912
|
-
typeof tokenProviderConfig.type !== 'string') {
|
|
14913
|
-
continue;
|
|
14914
|
-
}
|
|
14915
|
-
const provider = await TokenProviderFactory.createTokenProvider(tokenProviderConfig);
|
|
14916
|
-
if (isIdentityExposingTokenProvider(provider)) {
|
|
14917
|
-
const identity = await provider.getIdentity();
|
|
14918
|
-
if (identity && identity.subject) {
|
|
14919
|
-
logger$11.debug('identity_extracted_from_grant', {
|
|
14920
|
-
identity_id: identity.subject,
|
|
14921
|
-
grant_type: grant.type,
|
|
14922
|
-
});
|
|
14923
|
-
return identity.subject;
|
|
14924
|
-
}
|
|
14925
|
-
}
|
|
14926
|
-
}
|
|
14927
|
-
catch (error) {
|
|
14928
|
-
logger$11.warning('identity_extraction_failed', {
|
|
14929
|
-
error: error instanceof Error ? error.message : String(error),
|
|
14930
|
-
grant_type: grant.type,
|
|
14931
|
-
});
|
|
14932
|
-
}
|
|
14933
|
-
}
|
|
14934
|
-
}
|
|
14935
|
-
if (!context.currentNodeId) {
|
|
14936
|
-
return await generateIdAsync({ mode: 'fingerprint' });
|
|
14869
|
+
if (context.currentNodeId) {
|
|
14870
|
+
return context.currentNodeId;
|
|
14937
14871
|
}
|
|
14938
|
-
return
|
|
14872
|
+
return await generateIdAsync({ mode: 'fingerprint' });
|
|
14939
14873
|
}
|
|
14940
14874
|
}
|
|
14941
14875
|
|
|
@@ -17703,6 +17637,43 @@ var defaultNodeIdentityPolicyFactory = /*#__PURE__*/Object.freeze({
|
|
|
17703
17637
|
default: DefaultNodeIdentityPolicyFactory
|
|
17704
17638
|
});
|
|
17705
17639
|
|
|
17640
|
+
const TOKEN_PROVIDER_FACTORY_BASE_TYPE = 'TokenProviderFactory';
|
|
17641
|
+
class TokenProviderFactory extends AbstractResourceFactory {
|
|
17642
|
+
static async createTokenProvider(config, options = {}) {
|
|
17643
|
+
if (config) {
|
|
17644
|
+
const provider = await createResource$1(TOKEN_PROVIDER_FACTORY_BASE_TYPE, config, options);
|
|
17645
|
+
if (!provider) {
|
|
17646
|
+
throw new Error('Failed to create token provider from configuration');
|
|
17647
|
+
}
|
|
17648
|
+
return provider;
|
|
17649
|
+
}
|
|
17650
|
+
let provider = null;
|
|
17651
|
+
try {
|
|
17652
|
+
provider = await createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
17653
|
+
}
|
|
17654
|
+
catch (error) {
|
|
17655
|
+
const message = 'Failed to create default token provider' +
|
|
17656
|
+
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
17657
|
+
throw new Error(message);
|
|
17658
|
+
}
|
|
17659
|
+
if (!provider) {
|
|
17660
|
+
throw new Error('Failed to create default token provider');
|
|
17661
|
+
}
|
|
17662
|
+
return provider;
|
|
17663
|
+
}
|
|
17664
|
+
}
|
|
17665
|
+
|
|
17666
|
+
function isTokenProvider(candidate) {
|
|
17667
|
+
return (typeof candidate === 'object' &&
|
|
17668
|
+
candidate !== null &&
|
|
17669
|
+
typeof candidate.getToken === 'function');
|
|
17670
|
+
}
|
|
17671
|
+
function isIdentityExposingTokenProvider(candidate) {
|
|
17672
|
+
return (isTokenProvider(candidate) &&
|
|
17673
|
+
typeof candidate.getIdentity ===
|
|
17674
|
+
'function');
|
|
17675
|
+
}
|
|
17676
|
+
|
|
17706
17677
|
const logger$Y = getLogger('naylence.fame.node.token_subject_node_identity_policy');
|
|
17707
17678
|
class TokenSubjectNodeIdentityPolicy {
|
|
17708
17679
|
async resolveInitialNodeId(context) {
|