@naylence/runtime 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +367 -396
- package/dist/browser/index.mjs +367 -396
- package/dist/cjs/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/cjs/version.js +2 -2
- package/dist/esm/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/esm/version.js +2 -2
- package/dist/node/index.cjs +367 -396
- package/dist/node/index.mjs +367 -396
- package/dist/node/node.cjs +389 -418
- package/dist/node/node.mjs +389 -418
- package/dist/types/naylence/fame/node/default-node-identity-policy.d.ts +6 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/node/node.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$1p = 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$1p.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$1p.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$1p.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$1p.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$1p.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$1p.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$1p.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$1p.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$1p.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$1p.debug('shutdown_tasks_no_tasks_to_shutdown');
|
|
1037
1037
|
return;
|
|
1038
1038
|
}
|
|
1039
1039
|
this._suppressCompletionLogging = true;
|
|
1040
|
-
logger$
|
|
1040
|
+
logger$1p.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$1p.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$1p.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$1p.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$1o = 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$1o.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$1o.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$1o.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$1o.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$1o.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$1o.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$1o.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$1n = 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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1n.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$1m = 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$1m.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$1m.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$1m.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$1m.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$1m.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$1m.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$1m.debug('websocket_force_terminated', {
|
|
2975
2975
|
ready_state: socketAny.readyState,
|
|
2976
2976
|
});
|
|
2977
2977
|
}
|
|
2978
2978
|
catch (error) {
|
|
2979
|
-
logger$
|
|
2979
|
+
logger$1m.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$1m.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$1m.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$1l = 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$1l.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$1l.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$1l.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$1l.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$1l.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$1k = 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$1k.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$1k.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$1k);
|
|
3960
3960
|
}
|
|
3961
3961
|
}
|
|
3962
3962
|
|
|
@@ -4435,12 +4435,12 @@ async function ensureRuntimeFactoriesRegistered(registry = Registry) {
|
|
|
4435
4435
|
}
|
|
4436
4436
|
|
|
4437
4437
|
// This file is auto-generated during build - do not edit manually
|
|
4438
|
-
// Generated from package.json version: 0.4.
|
|
4438
|
+
// Generated from package.json version: 0.4.2
|
|
4439
4439
|
/**
|
|
4440
4440
|
* The package version, injected at build time.
|
|
4441
4441
|
* @internal
|
|
4442
4442
|
*/
|
|
4443
|
-
const VERSION = '0.4.
|
|
4443
|
+
const VERSION = '0.4.2';
|
|
4444
4444
|
|
|
4445
4445
|
let initialized = false;
|
|
4446
4446
|
const runtimePlugin = {
|
|
@@ -5647,7 +5647,7 @@ async function withLock(lock, operation) {
|
|
|
5647
5647
|
return await lock.runExclusive(operation);
|
|
5648
5648
|
}
|
|
5649
5649
|
|
|
5650
|
-
const logger$
|
|
5650
|
+
const logger$1j = getLogger('naylence.fame.storage.sqlite_storage_provider');
|
|
5651
5651
|
let cachedSqliteCtor;
|
|
5652
5652
|
async function loadSqliteConstructor() {
|
|
5653
5653
|
if (cachedSqliteCtor !== undefined) {
|
|
@@ -5671,7 +5671,7 @@ async function loadSqliteConstructor() {
|
|
|
5671
5671
|
}
|
|
5672
5672
|
catch (error) {
|
|
5673
5673
|
cachedSqliteCtor = null;
|
|
5674
|
-
logger$
|
|
5674
|
+
logger$1j.error('failed-to-load-better-sqlite3', {
|
|
5675
5675
|
error: error instanceof Error ? error.message : String(error),
|
|
5676
5676
|
});
|
|
5677
5677
|
throw new Error('Failed to load better-sqlite3. Install it to enable SQLite storage support.');
|
|
@@ -5706,7 +5706,7 @@ class SQLiteKeyValueStore {
|
|
|
5706
5706
|
}
|
|
5707
5707
|
catch (error) {
|
|
5708
5708
|
if (this.autoRecover && this.isCorruptionError(error)) {
|
|
5709
|
-
logger$
|
|
5709
|
+
logger$1j.warning('detected-corrupted-db', { path: this.dbPath });
|
|
5710
5710
|
await this.recoverCorruptedDb();
|
|
5711
5711
|
if (!this.db) {
|
|
5712
5712
|
throw new Error('Failed to recover SQLite database');
|
|
@@ -5761,7 +5761,7 @@ class SQLiteKeyValueStore {
|
|
|
5761
5761
|
await this.closeDatabase();
|
|
5762
5762
|
await this.quarantineCorruptedFiles();
|
|
5763
5763
|
await this.openDatabase();
|
|
5764
|
-
logger$
|
|
5764
|
+
logger$1j.warning('quarantined-corrupted-db', { path: this.dbPath });
|
|
5765
5765
|
}
|
|
5766
5766
|
async closeDatabase() {
|
|
5767
5767
|
if (this.db) {
|
|
@@ -5769,7 +5769,7 @@ class SQLiteKeyValueStore {
|
|
|
5769
5769
|
this.db.close();
|
|
5770
5770
|
}
|
|
5771
5771
|
catch (error) {
|
|
5772
|
-
logger$
|
|
5772
|
+
logger$1j.warning('failed-to-close-sqlite-db', {
|
|
5773
5773
|
path: this.dbPath,
|
|
5774
5774
|
error: error instanceof Error ? error.message : String(error),
|
|
5775
5775
|
});
|
|
@@ -5792,7 +5792,7 @@ class SQLiteKeyValueStore {
|
|
|
5792
5792
|
await fsPromises.rename(candidate, quarantinedName);
|
|
5793
5793
|
}
|
|
5794
5794
|
catch (error) {
|
|
5795
|
-
logger$
|
|
5795
|
+
logger$1j.error('failed-to-quarantine-sqlite-file', {
|
|
5796
5796
|
file: candidate,
|
|
5797
5797
|
error: error instanceof Error ? error.message : String(error),
|
|
5798
5798
|
});
|
|
@@ -5893,7 +5893,7 @@ class SQLiteKeyValueStore {
|
|
|
5893
5893
|
result[row.key] = this.deserialize(row.value);
|
|
5894
5894
|
}
|
|
5895
5895
|
catch (error) {
|
|
5896
|
-
logger$
|
|
5896
|
+
logger$1j.warning('skipping-corrupted-sqlite-entry', {
|
|
5897
5897
|
key: row.key,
|
|
5898
5898
|
error: error instanceof Error ? error.message : String(error),
|
|
5899
5899
|
});
|
|
@@ -6888,7 +6888,7 @@ class InMemoryBinding {
|
|
|
6888
6888
|
* TypeScript port of Python's InMemoryFanoutBroker that extends TaskSpawner
|
|
6889
6889
|
* to manage multiple WriteChannel subscribers with concurrent message distribution.
|
|
6890
6890
|
*/
|
|
6891
|
-
const logger$
|
|
6891
|
+
const logger$1i = getLogger('naylence.fame.channel.in_memory.in_memory_fanout_broker');
|
|
6892
6892
|
// Sentinel object for shutdown signaling
|
|
6893
6893
|
const SENTINEL = Symbol('fanout-broker-sentinel');
|
|
6894
6894
|
function isCloseable(obj) {
|
|
@@ -6941,7 +6941,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6941
6941
|
}
|
|
6942
6942
|
catch (error) {
|
|
6943
6943
|
// Ignore errors when sending sentinel (sink might be closed)
|
|
6944
|
-
logger$
|
|
6944
|
+
logger$1i.debug('error_sending_sentinel', {
|
|
6945
6945
|
error: error.message,
|
|
6946
6946
|
});
|
|
6947
6947
|
}
|
|
@@ -6955,7 +6955,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6955
6955
|
await sub.close();
|
|
6956
6956
|
}
|
|
6957
6957
|
catch (error) {
|
|
6958
|
-
logger$
|
|
6958
|
+
logger$1i.error('error_closing_subscriber', {
|
|
6959
6959
|
subscriber: sub.toString(),
|
|
6960
6960
|
error: error.message,
|
|
6961
6961
|
});
|
|
@@ -6995,7 +6995,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
6995
6995
|
[envelope, context] = extractEnvelopeAndContext(msg);
|
|
6996
6996
|
}
|
|
6997
6997
|
catch (error) {
|
|
6998
|
-
logger$
|
|
6998
|
+
logger$1i.debug('failed_to_extract_envelope', {
|
|
6999
6999
|
error: error.message,
|
|
7000
7000
|
});
|
|
7001
7001
|
continue;
|
|
@@ -7017,7 +7017,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7017
7017
|
await sub.send(messageToSend);
|
|
7018
7018
|
}
|
|
7019
7019
|
catch (error) {
|
|
7020
|
-
logger$
|
|
7020
|
+
logger$1i.error('error_sending_to_subscriber', {
|
|
7021
7021
|
subscriber: sub.toString(),
|
|
7022
7022
|
error: error.message,
|
|
7023
7023
|
action: 'unsubscribing',
|
|
@@ -7033,7 +7033,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
7033
7033
|
}
|
|
7034
7034
|
catch (error) {
|
|
7035
7035
|
// Critical broker-level error: log and back off, but keep the loop running
|
|
7036
|
-
logger$
|
|
7036
|
+
logger$1i.critical('receive_loop_failed_unexpectedly', {
|
|
7037
7037
|
error: error.message,
|
|
7038
7038
|
stack: error.stack,
|
|
7039
7039
|
});
|
|
@@ -7742,7 +7742,7 @@ function normalizeResponseType(value) {
|
|
|
7742
7742
|
return value;
|
|
7743
7743
|
}
|
|
7744
7744
|
|
|
7745
|
-
const logger$
|
|
7745
|
+
const logger$1h = getLogger('naylence.fame.node.binding_manager');
|
|
7746
7746
|
const SYSTEM_INBOX$3 = '__sys__';
|
|
7747
7747
|
const DEFAULT_ACK_TIMEOUT_MS = 20000;
|
|
7748
7748
|
class BindingStoreEntryRecord {
|
|
@@ -7828,7 +7828,7 @@ class BindingManager {
|
|
|
7828
7828
|
if (!this.bindings.has(key)) {
|
|
7829
7829
|
const binding = this.bindingFactory(new FameAddress(key));
|
|
7830
7830
|
this.bindings.set(key, binding);
|
|
7831
|
-
logger$
|
|
7831
|
+
logger$1h.debug('restored_binding', { address: key });
|
|
7832
7832
|
}
|
|
7833
7833
|
}
|
|
7834
7834
|
if (!this.hasUpstream) {
|
|
@@ -7838,13 +7838,13 @@ class BindingManager {
|
|
|
7838
7838
|
await this.readvertiseCapabilitiesUpstream();
|
|
7839
7839
|
}
|
|
7840
7840
|
async bind(participant, capabilities) {
|
|
7841
|
-
logger$
|
|
7841
|
+
logger$1h.debug('binding_participant', { participant });
|
|
7842
7842
|
const { prefixAddress, addresses, propagateAddress, capabilityAddress } = this.computeBindingAddresses(participant);
|
|
7843
7843
|
for (const address of addresses) {
|
|
7844
7844
|
if (!this.bindings.has(address)) {
|
|
7845
7845
|
const binding = this.bindingFactory(new FameAddress(address));
|
|
7846
7846
|
this.bindings.set(address, binding);
|
|
7847
|
-
logger$
|
|
7847
|
+
logger$1h.debug('bound_address', { address, participant });
|
|
7848
7848
|
}
|
|
7849
7849
|
}
|
|
7850
7850
|
let propagatedAddress = null;
|
|
@@ -7873,7 +7873,7 @@ class BindingManager {
|
|
|
7873
7873
|
await this.unbindAddressUpstream(propagatedAddress);
|
|
7874
7874
|
}
|
|
7875
7875
|
catch (rollbackError) {
|
|
7876
|
-
logger$
|
|
7876
|
+
logger$1h.error('bind_rollback_failed', {
|
|
7877
7877
|
address: propagatedAddress.toString(),
|
|
7878
7878
|
error: rollbackError.message,
|
|
7879
7879
|
});
|
|
@@ -7892,7 +7892,7 @@ class BindingManager {
|
|
|
7892
7892
|
physicalPath: null,
|
|
7893
7893
|
});
|
|
7894
7894
|
}
|
|
7895
|
-
logger$
|
|
7895
|
+
logger$1h.debug('bind_success', {
|
|
7896
7896
|
participant,
|
|
7897
7897
|
address: prefixAddress.toString(),
|
|
7898
7898
|
capabilities,
|
|
@@ -7928,7 +7928,7 @@ class BindingManager {
|
|
|
7928
7928
|
await this.bindingStore.delete(address);
|
|
7929
7929
|
}
|
|
7930
7930
|
}
|
|
7931
|
-
logger$
|
|
7931
|
+
logger$1h.debug('unbind_success', {
|
|
7932
7932
|
participant,
|
|
7933
7933
|
address: prefixAddress.toString(),
|
|
7934
7934
|
totalBindings: this.bindings.size,
|
|
@@ -7958,7 +7958,7 @@ class BindingManager {
|
|
|
7958
7958
|
await this.bindAddressUpstream(new FameAddress(address));
|
|
7959
7959
|
}
|
|
7960
7960
|
catch (error) {
|
|
7961
|
-
logger$
|
|
7961
|
+
logger$1h.error('rebind_failed', {
|
|
7962
7962
|
address,
|
|
7963
7963
|
error: error.message,
|
|
7964
7964
|
});
|
|
@@ -7977,7 +7977,7 @@ class BindingManager {
|
|
|
7977
7977
|
await this.advertiseCapabilities(new FameAddress(address), Array.from(capabilities));
|
|
7978
7978
|
}
|
|
7979
7979
|
catch (error) {
|
|
7980
|
-
logger$
|
|
7980
|
+
logger$1h.error('capability_replay_failed', {
|
|
7981
7981
|
address,
|
|
7982
7982
|
error: error.message,
|
|
7983
7983
|
});
|
|
@@ -8244,7 +8244,7 @@ class BindingManager {
|
|
|
8244
8244
|
}
|
|
8245
8245
|
}
|
|
8246
8246
|
|
|
8247
|
-
const logger$
|
|
8247
|
+
const logger$1g = getLogger('naylence.fame.node.response_context_manager');
|
|
8248
8248
|
function cloneSecurityContext(source) {
|
|
8249
8249
|
if (!source) {
|
|
8250
8250
|
return undefined;
|
|
@@ -8272,7 +8272,7 @@ class ResponseContextManager {
|
|
|
8272
8272
|
security: responseSecurity,
|
|
8273
8273
|
expectedResponseType: FameResponseType.NONE,
|
|
8274
8274
|
};
|
|
8275
|
-
logger$
|
|
8275
|
+
logger$1g.debug('created_response_context', {
|
|
8276
8276
|
request_id: requestEnvelope.id,
|
|
8277
8277
|
inherited_crypto_level: responseSecurity?.inboundCryptoLevel ?? null,
|
|
8278
8278
|
channel_id: responseSecurity?.cryptoChannelId ?? null,
|
|
@@ -8292,14 +8292,14 @@ class ResponseContextManager {
|
|
|
8292
8292
|
responseContext.fromSystemId = this.getId();
|
|
8293
8293
|
}
|
|
8294
8294
|
// Envelope-level metadata is intentionally omitted to defer to context usage.
|
|
8295
|
-
logger$
|
|
8295
|
+
logger$1g.debug('ensured_response_metadata', {
|
|
8296
8296
|
response_id: responseEnvelope.id,
|
|
8297
8297
|
request_id: requestEnvelope.id,
|
|
8298
8298
|
});
|
|
8299
8299
|
}
|
|
8300
8300
|
}
|
|
8301
8301
|
|
|
8302
|
-
const logger$
|
|
8302
|
+
const logger$1f = getLogger('naylence.fame.node.streaming_response_handler');
|
|
8303
8303
|
function isObject(value) {
|
|
8304
8304
|
return typeof value === 'object' && value !== null;
|
|
8305
8305
|
}
|
|
@@ -8418,12 +8418,12 @@ class StreamingResponseHandler {
|
|
|
8418
8418
|
}
|
|
8419
8419
|
async handleStreamingFameMessageResponses(responses, requestEnvelope, requestContext) {
|
|
8420
8420
|
const asyncResponses = toAsyncIterable(responses);
|
|
8421
|
-
logger$
|
|
8421
|
+
logger$1f.debug('handling_streaming_fame_message_responses', {
|
|
8422
8422
|
request_id: requestEnvelope.id,
|
|
8423
8423
|
});
|
|
8424
8424
|
for await (const response of asyncResponses) {
|
|
8425
8425
|
if (!response?.envelope) {
|
|
8426
|
-
logger$
|
|
8426
|
+
logger$1f.warning('invalid_streaming_response_type', {
|
|
8427
8427
|
request_id: requestEnvelope.id,
|
|
8428
8428
|
actual_type: typeof response,
|
|
8429
8429
|
});
|
|
@@ -8437,7 +8437,7 @@ class StreamingResponseHandler {
|
|
|
8437
8437
|
}
|
|
8438
8438
|
async handleStreamingResponse(result, requestEnvelope, requestContext, replyTo, requestId) {
|
|
8439
8439
|
const iterable = toAsyncIterable(result);
|
|
8440
|
-
logger$
|
|
8440
|
+
logger$1f.debug('handling_streaming_response', {
|
|
8441
8441
|
request_id: requestId,
|
|
8442
8442
|
reply_to: replyTo,
|
|
8443
8443
|
});
|
|
@@ -8448,7 +8448,7 @@ class StreamingResponseHandler {
|
|
|
8448
8448
|
await this.sendRpcResponse(null, requestEnvelope, requestContext, replyTo, requestId);
|
|
8449
8449
|
}
|
|
8450
8450
|
catch (error) {
|
|
8451
|
-
logger$
|
|
8451
|
+
logger$1f.error('streaming_response_handler_error', {
|
|
8452
8452
|
request_id: requestId,
|
|
8453
8453
|
error: error instanceof Error ? error.message : String(error),
|
|
8454
8454
|
});
|
|
@@ -8475,7 +8475,7 @@ class StreamingResponseHandler {
|
|
|
8475
8475
|
});
|
|
8476
8476
|
const responseContext = this.responseContextManager.createResponseContext(requestEnvelope, requestContext);
|
|
8477
8477
|
this.responseContextManager.ensureResponseMetadata(responseEnvelope, requestEnvelope, responseContext);
|
|
8478
|
-
logger$
|
|
8478
|
+
logger$1f.debug('sending_streaming_rpc_response', {
|
|
8479
8479
|
request_id: requestId,
|
|
8480
8480
|
response_envelope_id: responseEnvelope.id,
|
|
8481
8481
|
reply_to: replyTo,
|
|
@@ -8488,7 +8488,7 @@ class StreamingResponseHandler {
|
|
|
8488
8488
|
}
|
|
8489
8489
|
}
|
|
8490
8490
|
|
|
8491
|
-
const logger$
|
|
8491
|
+
const logger$1e = getLogger('naylence.fame.node.channel_polling_manager');
|
|
8492
8492
|
class ChannelPollingManager {
|
|
8493
8493
|
constructor(deliverWrapper, responseContextManager, streamingResponseHandler) {
|
|
8494
8494
|
this.deliverWrapper = deliverWrapper;
|
|
@@ -8496,7 +8496,7 @@ class ChannelPollingManager {
|
|
|
8496
8496
|
this.streamingResponseHandler = streamingResponseHandler;
|
|
8497
8497
|
}
|
|
8498
8498
|
async startPollingLoop(serviceName, channel, handler, stopState, pollTimeoutMs = DEFAULT_POLLING_TIMEOUT_MS) {
|
|
8499
|
-
logger$
|
|
8499
|
+
logger$1e.debug('poll_loop_started', {
|
|
8500
8500
|
recipient: serviceName,
|
|
8501
8501
|
});
|
|
8502
8502
|
try {
|
|
@@ -8504,7 +8504,7 @@ class ChannelPollingManager {
|
|
|
8504
8504
|
while (true) {
|
|
8505
8505
|
if (this.isStopRequested(stopState) && !draining) {
|
|
8506
8506
|
draining = true;
|
|
8507
|
-
logger$
|
|
8507
|
+
logger$1e.debug('poll_loop_draining_pending_messages', {
|
|
8508
8508
|
recipient: serviceName,
|
|
8509
8509
|
});
|
|
8510
8510
|
}
|
|
@@ -8514,7 +8514,7 @@ class ChannelPollingManager {
|
|
|
8514
8514
|
}
|
|
8515
8515
|
catch (error) {
|
|
8516
8516
|
if (error instanceof FameTransportClose) {
|
|
8517
|
-
logger$
|
|
8517
|
+
logger$1e.debug('channel_closed', {
|
|
8518
8518
|
recipient: serviceName,
|
|
8519
8519
|
message: error.message,
|
|
8520
8520
|
});
|
|
@@ -8527,7 +8527,7 @@ class ChannelPollingManager {
|
|
|
8527
8527
|
continue;
|
|
8528
8528
|
}
|
|
8529
8529
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
8530
|
-
logger$
|
|
8530
|
+
logger$1e.debug('listener_cancelled', {
|
|
8531
8531
|
recipient: serviceName,
|
|
8532
8532
|
});
|
|
8533
8533
|
throw error;
|
|
@@ -8539,13 +8539,13 @@ class ChannelPollingManager {
|
|
|
8539
8539
|
continue;
|
|
8540
8540
|
}
|
|
8541
8541
|
if (error instanceof Error && error.message === 'Channel is closed') {
|
|
8542
|
-
logger$
|
|
8542
|
+
logger$1e.debug('channel_closed', {
|
|
8543
8543
|
recipient: serviceName,
|
|
8544
8544
|
});
|
|
8545
8545
|
break;
|
|
8546
8546
|
}
|
|
8547
8547
|
if (error instanceof Error && error.name === 'TaskCancelledError') {
|
|
8548
|
-
logger$
|
|
8548
|
+
logger$1e.debug('listener_cancelled', {
|
|
8549
8549
|
recipient: serviceName,
|
|
8550
8550
|
});
|
|
8551
8551
|
throw error;
|
|
@@ -8557,12 +8557,12 @@ class ChannelPollingManager {
|
|
|
8557
8557
|
continue;
|
|
8558
8558
|
}
|
|
8559
8559
|
if (error instanceof Error && error.message.includes('closed')) {
|
|
8560
|
-
logger$
|
|
8560
|
+
logger$1e.debug('channel_closed', {
|
|
8561
8561
|
recipient: serviceName,
|
|
8562
8562
|
});
|
|
8563
8563
|
break;
|
|
8564
8564
|
}
|
|
8565
|
-
logger$
|
|
8565
|
+
logger$1e.error('transport_error', {
|
|
8566
8566
|
recipient: serviceName,
|
|
8567
8567
|
error: error instanceof Error ? error.message : String(error),
|
|
8568
8568
|
});
|
|
@@ -8578,7 +8578,7 @@ class ChannelPollingManager {
|
|
|
8578
8578
|
}
|
|
8579
8579
|
}
|
|
8580
8580
|
finally {
|
|
8581
|
-
logger$
|
|
8581
|
+
logger$1e.debug('poll_loop_exiting', {
|
|
8582
8582
|
recipient: serviceName,
|
|
8583
8583
|
});
|
|
8584
8584
|
}
|
|
@@ -8591,7 +8591,7 @@ class ChannelPollingManager {
|
|
|
8591
8591
|
await this.processHandlerResult(result, envelope, deliveryContext, serviceName);
|
|
8592
8592
|
}
|
|
8593
8593
|
catch (error) {
|
|
8594
|
-
logger$
|
|
8594
|
+
logger$1e.error('handler_crashed', {
|
|
8595
8595
|
recipient: serviceName,
|
|
8596
8596
|
error: error instanceof Error ? error.message : String(error),
|
|
8597
8597
|
});
|
|
@@ -8605,7 +8605,7 @@ class ChannelPollingManager {
|
|
|
8605
8605
|
return;
|
|
8606
8606
|
}
|
|
8607
8607
|
if (this.streamingResponseHandler.isStreamingFameMessageResponse(result)) {
|
|
8608
|
-
logger$
|
|
8608
|
+
logger$1e.debug('handling_streaming_fame_message_responses', {
|
|
8609
8609
|
service_name: serviceName,
|
|
8610
8610
|
envelope_id: envelope.id,
|
|
8611
8611
|
});
|
|
@@ -8613,7 +8613,7 @@ class ChannelPollingManager {
|
|
|
8613
8613
|
}
|
|
8614
8614
|
}
|
|
8615
8615
|
async handleMessageResponse(response, requestEnvelope, requestContext, serviceName) {
|
|
8616
|
-
logger$
|
|
8616
|
+
logger$1e.debug('delivering_envelope_response_message', {
|
|
8617
8617
|
service_name: serviceName,
|
|
8618
8618
|
response_envelope_id: response.envelope.id,
|
|
8619
8619
|
});
|
|
@@ -8633,7 +8633,7 @@ class ChannelPollingManager {
|
|
|
8633
8633
|
}
|
|
8634
8634
|
}
|
|
8635
8635
|
|
|
8636
|
-
const logger$
|
|
8636
|
+
const logger$1d = getLogger('naylence.fame.node.rpc_server_handler');
|
|
8637
8637
|
function isPlainRecord$6(value) {
|
|
8638
8638
|
if (typeof value !== 'object' || value === null) {
|
|
8639
8639
|
return false;
|
|
@@ -8677,13 +8677,13 @@ class RPCServerHandler {
|
|
|
8677
8677
|
}
|
|
8678
8678
|
async handleRpcRequest(envelope, handlerContext, handler, serviceName) {
|
|
8679
8679
|
if (!this.isDataFrame(envelope.frame)) {
|
|
8680
|
-
logger$
|
|
8680
|
+
logger$1d.warning('rpc_request_missing_data_frame', {
|
|
8681
8681
|
service_name: serviceName,
|
|
8682
8682
|
envelope_id: envelope.id,
|
|
8683
8683
|
});
|
|
8684
8684
|
return;
|
|
8685
8685
|
}
|
|
8686
|
-
logger$
|
|
8686
|
+
logger$1d.debug('rpc_request_received', {
|
|
8687
8687
|
service_name: serviceName,
|
|
8688
8688
|
envelope_id: envelope.id,
|
|
8689
8689
|
trace_id: envelope.traceId,
|
|
@@ -8695,7 +8695,7 @@ class RPCServerHandler {
|
|
|
8695
8695
|
request = parseRequest(envelope.frame.payload);
|
|
8696
8696
|
params = cloneParams(request.params);
|
|
8697
8697
|
const paramKeys = Object.keys(params);
|
|
8698
|
-
logger$
|
|
8698
|
+
logger$1d.debug('parsed_rpc_request', {
|
|
8699
8699
|
service_name: serviceName,
|
|
8700
8700
|
method: request.method,
|
|
8701
8701
|
request_id: request.id,
|
|
@@ -8704,7 +8704,7 @@ class RPCServerHandler {
|
|
|
8704
8704
|
});
|
|
8705
8705
|
}
|
|
8706
8706
|
catch (error) {
|
|
8707
|
-
logger$
|
|
8707
|
+
logger$1d.warning('request_decode_error', {
|
|
8708
8708
|
service_name: serviceName,
|
|
8709
8709
|
envelope_id: envelope.id,
|
|
8710
8710
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -8712,7 +8712,7 @@ class RPCServerHandler {
|
|
|
8712
8712
|
return;
|
|
8713
8713
|
}
|
|
8714
8714
|
if (request.id == null) {
|
|
8715
|
-
logger$
|
|
8715
|
+
logger$1d.warning('request_missing_id', {
|
|
8716
8716
|
service_name: serviceName,
|
|
8717
8717
|
envelope_id: envelope.id,
|
|
8718
8718
|
});
|
|
@@ -8720,7 +8720,7 @@ class RPCServerHandler {
|
|
|
8720
8720
|
}
|
|
8721
8721
|
const replyTo = this.resolveReplyTo(envelope, params);
|
|
8722
8722
|
if (!replyTo) {
|
|
8723
|
-
logger$
|
|
8723
|
+
logger$1d.warning('missing_reply_to', {
|
|
8724
8724
|
service_name: serviceName,
|
|
8725
8725
|
envelope_id: envelope.id,
|
|
8726
8726
|
request_id: request.id,
|
|
@@ -8729,13 +8729,13 @@ class RPCServerHandler {
|
|
|
8729
8729
|
}
|
|
8730
8730
|
let handlerResult;
|
|
8731
8731
|
try {
|
|
8732
|
-
logger$
|
|
8732
|
+
logger$1d.debug('calling_rpc_handler', {
|
|
8733
8733
|
service_name: serviceName,
|
|
8734
8734
|
method: request.method,
|
|
8735
8735
|
request_id: request.id,
|
|
8736
8736
|
});
|
|
8737
8737
|
handlerResult = await handler(request.method, params);
|
|
8738
|
-
logger$
|
|
8738
|
+
logger$1d.debug('rpc_handler_returned', {
|
|
8739
8739
|
service_name: serviceName,
|
|
8740
8740
|
method: request.method,
|
|
8741
8741
|
request_id: request.id,
|
|
@@ -8744,7 +8744,7 @@ class RPCServerHandler {
|
|
|
8744
8744
|
});
|
|
8745
8745
|
}
|
|
8746
8746
|
catch (error) {
|
|
8747
|
-
logger$
|
|
8747
|
+
logger$1d.error('rpc_handler_error', {
|
|
8748
8748
|
service_name: serviceName,
|
|
8749
8749
|
request_id: request.id,
|
|
8750
8750
|
envelope_id: envelope.id,
|
|
@@ -8754,7 +8754,7 @@ class RPCServerHandler {
|
|
|
8754
8754
|
return this.createTraditionalResponse(response, request.id, envelope, replyTo, handlerContext, serviceName);
|
|
8755
8755
|
}
|
|
8756
8756
|
if (isFameMessageResponse(handlerResult)) {
|
|
8757
|
-
logger$
|
|
8757
|
+
logger$1d.debug('returning_response_message', {
|
|
8758
8758
|
service_name: serviceName,
|
|
8759
8759
|
request_id: request.id,
|
|
8760
8760
|
response_envelope_id: handlerResult.envelope.id,
|
|
@@ -8762,7 +8762,7 @@ class RPCServerHandler {
|
|
|
8762
8762
|
return handlerResult;
|
|
8763
8763
|
}
|
|
8764
8764
|
if (this.streamingResponseHandler.isStreamingResult(handlerResult)) {
|
|
8765
|
-
logger$
|
|
8765
|
+
logger$1d.debug('handling_streaming_response', {
|
|
8766
8766
|
service_name: serviceName,
|
|
8767
8767
|
request_id: request.id,
|
|
8768
8768
|
envelope_id: envelope.id,
|
|
@@ -8791,7 +8791,7 @@ class RPCServerHandler {
|
|
|
8791
8791
|
return null;
|
|
8792
8792
|
}
|
|
8793
8793
|
async createTraditionalResponse(payload, requestId, requestEnvelope, replyTo, handlerContext, serviceName) {
|
|
8794
|
-
logger$
|
|
8794
|
+
logger$1d.debug('creating_traditional_response_envelope', {
|
|
8795
8795
|
service_name: serviceName,
|
|
8796
8796
|
request_id: requestId,
|
|
8797
8797
|
envelope_id: requestEnvelope.id,
|
|
@@ -8815,7 +8815,7 @@ class RPCServerHandler {
|
|
|
8815
8815
|
if (requestEnvelope.id) {
|
|
8816
8816
|
responseContext.meta['response-to-id'] = requestEnvelope.id;
|
|
8817
8817
|
}
|
|
8818
|
-
logger$
|
|
8818
|
+
logger$1d.debug('returning_traditional_response', {
|
|
8819
8819
|
service_name: serviceName,
|
|
8820
8820
|
request_id: requestId,
|
|
8821
8821
|
envelope_id: requestEnvelope.id,
|
|
@@ -8880,7 +8880,7 @@ function normalizeErrorCode(code) {
|
|
|
8880
8880
|
return code;
|
|
8881
8881
|
}
|
|
8882
8882
|
|
|
8883
|
-
const logger$
|
|
8883
|
+
const logger$1c = getLogger('naylence.fame.node.rpc_client_manager');
|
|
8884
8884
|
function isPlainRecord$5(value) {
|
|
8885
8885
|
if (typeof value !== 'object' || value === null) {
|
|
8886
8886
|
return false;
|
|
@@ -9097,7 +9097,7 @@ class RPCClientManager {
|
|
|
9097
9097
|
const metaReason = tracked.meta?.['nack_reason'];
|
|
9098
9098
|
const formattedMessage = formatDeliveryErrorMessage(typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR', reason ??
|
|
9099
9099
|
(typeof metaReason === 'string' ? metaReason : undefined));
|
|
9100
|
-
logger$
|
|
9100
|
+
logger$1c.debug('pending_request_rejected_by_delivery_nack', {
|
|
9101
9101
|
envelope_id: envelopeId,
|
|
9102
9102
|
request_id: requestId,
|
|
9103
9103
|
code: typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR',
|
|
@@ -9120,7 +9120,7 @@ class RPCClientManager {
|
|
|
9120
9120
|
this.trackerWithEvents.removeEventHandler?.(this.trackerEventHandler);
|
|
9121
9121
|
}
|
|
9122
9122
|
catch (error) {
|
|
9123
|
-
logger$
|
|
9123
|
+
logger$1c.debug('rpc_tracker_handler_remove_failed', {
|
|
9124
9124
|
error: error instanceof Error ? error.message : String(error),
|
|
9125
9125
|
});
|
|
9126
9126
|
}
|
|
@@ -9163,7 +9163,7 @@ class RPCClientManager {
|
|
|
9163
9163
|
this.rpcListenerAddress = await this.listenCallback(recipient, handler);
|
|
9164
9164
|
this.rpcBound = true;
|
|
9165
9165
|
this.boundPhysicalPath = currentPhysicalPath;
|
|
9166
|
-
logger$
|
|
9166
|
+
logger$1c.debug('rpc_reply_listener_bound', {
|
|
9167
9167
|
reply_recipient: recipient,
|
|
9168
9168
|
reply_address: this.rpcReplyAddress?.toString(),
|
|
9169
9169
|
listener_address: this.rpcListenerAddress?.toString(),
|
|
@@ -9257,7 +9257,7 @@ class RPCClientManager {
|
|
|
9257
9257
|
const finalizePromise = this.notifyStreamClosed(envelopeId);
|
|
9258
9258
|
if (finalizePromise) {
|
|
9259
9259
|
finalizePromise.catch((notifyError) => {
|
|
9260
|
-
logger$
|
|
9260
|
+
logger$1c.debug('stream_tracker_finalize_failed', {
|
|
9261
9261
|
request_id: requestId,
|
|
9262
9262
|
envelope_id: envelopeId,
|
|
9263
9263
|
error: notifyError instanceof Error
|
|
@@ -9318,7 +9318,7 @@ class RPCClientManager {
|
|
|
9318
9318
|
return iterator;
|
|
9319
9319
|
}
|
|
9320
9320
|
async sendRpcRequest(requestId, envelope, expectedResponseType, timeoutMs) {
|
|
9321
|
-
logger$
|
|
9321
|
+
logger$1c.debug('sending_rpc_request', {
|
|
9322
9322
|
envp_id: envelope.id,
|
|
9323
9323
|
corr_id: envelope.corrId,
|
|
9324
9324
|
request_id: requestId,
|
|
@@ -9334,7 +9334,7 @@ class RPCClientManager {
|
|
|
9334
9334
|
}
|
|
9335
9335
|
}
|
|
9336
9336
|
catch (error) {
|
|
9337
|
-
logger$
|
|
9337
|
+
logger$1c.warning('delivery_tracker_track_failed', {
|
|
9338
9338
|
request_id: requestId,
|
|
9339
9339
|
error: error instanceof Error ? error.message : String(error),
|
|
9340
9340
|
});
|
|
@@ -9347,14 +9347,14 @@ class RPCClientManager {
|
|
|
9347
9347
|
await this.deliverWrapper()(envelope, context);
|
|
9348
9348
|
}
|
|
9349
9349
|
async handleReplyEnvelope(envelope) {
|
|
9350
|
-
logger$
|
|
9350
|
+
logger$1c.debug('handle_reply_envelope_received', {
|
|
9351
9351
|
envelope_id: envelope.id,
|
|
9352
9352
|
corr_id: envelope.corrId,
|
|
9353
9353
|
frame_type: envelope.frame?.['type'],
|
|
9354
9354
|
});
|
|
9355
9355
|
let requestId = envelope.corrId ?? envelope.id;
|
|
9356
9356
|
if (!requestId) {
|
|
9357
|
-
logger$
|
|
9357
|
+
logger$1c.warning('reply_envelope_missing_corr_id', {
|
|
9358
9358
|
envelope_id: envelope.id,
|
|
9359
9359
|
});
|
|
9360
9360
|
return;
|
|
@@ -9372,12 +9372,12 @@ class RPCClientManager {
|
|
|
9372
9372
|
}
|
|
9373
9373
|
}
|
|
9374
9374
|
if (!entry) {
|
|
9375
|
-
logger$
|
|
9375
|
+
logger$1c.debug('no_pending_request_for_reply', {
|
|
9376
9376
|
request_id: requestId,
|
|
9377
9377
|
});
|
|
9378
9378
|
return;
|
|
9379
9379
|
}
|
|
9380
|
-
logger$
|
|
9380
|
+
logger$1c.debug('handle_reply_envelope', {
|
|
9381
9381
|
envelope_id: envelope.id,
|
|
9382
9382
|
request_id: requestId,
|
|
9383
9383
|
corr_id: envelope.corrId,
|
|
@@ -9390,7 +9390,7 @@ class RPCClientManager {
|
|
|
9390
9390
|
const ackIndicatesSuccess = frame.ok === true ||
|
|
9391
9391
|
(frame.ok === undefined && !frame.code && !frame.reason);
|
|
9392
9392
|
if (ackIndicatesSuccess) {
|
|
9393
|
-
logger$
|
|
9393
|
+
logger$1c.debug('pending_request_delivery_acknowledged', {
|
|
9394
9394
|
request_id: requestId,
|
|
9395
9395
|
envelope_id: envelope.id,
|
|
9396
9396
|
ref_id: frame.refId ?? null,
|
|
@@ -9418,7 +9418,7 @@ class RPCClientManager {
|
|
|
9418
9418
|
entry.timer = null;
|
|
9419
9419
|
}
|
|
9420
9420
|
if (!this.isDataFrame(envelope.frame)) {
|
|
9421
|
-
logger$
|
|
9421
|
+
logger$1c.warning('unexpected_reply_frame_type', {
|
|
9422
9422
|
request_id: requestId,
|
|
9423
9423
|
frame_type: envelope.frame?.['type'],
|
|
9424
9424
|
});
|
|
@@ -9484,7 +9484,7 @@ class RPCClientManager {
|
|
|
9484
9484
|
return;
|
|
9485
9485
|
}
|
|
9486
9486
|
Promise.resolve(this.deliveryTracker.onStreamItem(envelopeId, envelope)).catch((error) => {
|
|
9487
|
-
logger$
|
|
9487
|
+
logger$1c.debug('stream_tracker_push_failed', {
|
|
9488
9488
|
envelope_id: envelopeId,
|
|
9489
9489
|
error: error instanceof Error ? error.message : String(error),
|
|
9490
9490
|
});
|
|
@@ -9599,7 +9599,7 @@ function normalizeMailbox(mailbox) {
|
|
|
9599
9599
|
return mailbox;
|
|
9600
9600
|
}
|
|
9601
9601
|
|
|
9602
|
-
const logger$
|
|
9602
|
+
const logger$1b = getLogger('naylence.fame.node.envelope_listener_manager');
|
|
9603
9603
|
const SYSTEM_INBOX$2 = '__sys__';
|
|
9604
9604
|
class EnvelopeListener {
|
|
9605
9605
|
constructor(stopFn, task) {
|
|
@@ -9607,7 +9607,7 @@ class EnvelopeListener {
|
|
|
9607
9607
|
this.task = task;
|
|
9608
9608
|
}
|
|
9609
9609
|
stop() {
|
|
9610
|
-
logger$
|
|
9610
|
+
logger$1b.debug('stopping_listener', {
|
|
9611
9611
|
task_name: this.task.name,
|
|
9612
9612
|
});
|
|
9613
9613
|
try {
|
|
@@ -9615,7 +9615,7 @@ class EnvelopeListener {
|
|
|
9615
9615
|
if (maybeCleanup &&
|
|
9616
9616
|
typeof maybeCleanup.then === 'function') {
|
|
9617
9617
|
void maybeCleanup.catch((error) => {
|
|
9618
|
-
logger$
|
|
9618
|
+
logger$1b.debug('listener_stop_cleanup_failed', {
|
|
9619
9619
|
task_name: this.task.name,
|
|
9620
9620
|
error: error instanceof Error ? error.message : String(error),
|
|
9621
9621
|
});
|
|
@@ -9623,7 +9623,7 @@ class EnvelopeListener {
|
|
|
9623
9623
|
}
|
|
9624
9624
|
}
|
|
9625
9625
|
catch (error) {
|
|
9626
|
-
logger$
|
|
9626
|
+
logger$1b.debug('listener_stop_cleanup_failed', {
|
|
9627
9627
|
task_name: this.task.name,
|
|
9628
9628
|
error: error instanceof Error ? error.message : String(error),
|
|
9629
9629
|
});
|
|
@@ -9653,7 +9653,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9653
9653
|
envelope.replyTo = formatAddress(SYSTEM_INBOX$2, this.nodeLike.physicalPath);
|
|
9654
9654
|
}
|
|
9655
9655
|
catch (error) {
|
|
9656
|
-
logger$
|
|
9656
|
+
logger$1b.warning('default_reply_to_assignment_failed', {
|
|
9657
9657
|
envelope_id: envelope.id,
|
|
9658
9658
|
service_name: envelope.capabilities?.[0] ?? null,
|
|
9659
9659
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -9678,7 +9678,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9678
9678
|
if (serviceName === SYSTEM_INBOX$2) {
|
|
9679
9679
|
continue;
|
|
9680
9680
|
}
|
|
9681
|
-
logger$
|
|
9681
|
+
logger$1b.debug('stopping_listener_for_service', {
|
|
9682
9682
|
service_name: serviceName,
|
|
9683
9683
|
});
|
|
9684
9684
|
entry.listener.stop();
|
|
@@ -9688,7 +9688,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9688
9688
|
catch (error) {
|
|
9689
9689
|
if (!(error instanceof Error) ||
|
|
9690
9690
|
error.name !== 'TaskCancelledError') {
|
|
9691
|
-
logger$
|
|
9691
|
+
logger$1b.debug('listener_task_stopped', {
|
|
9692
9692
|
service_name: serviceName,
|
|
9693
9693
|
error: error instanceof Error ? error.message : String(error),
|
|
9694
9694
|
});
|
|
@@ -9696,7 +9696,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9696
9696
|
}
|
|
9697
9697
|
}
|
|
9698
9698
|
if (systemEntry) {
|
|
9699
|
-
logger$
|
|
9699
|
+
logger$1b.debug('stopping_listener_for_service', {
|
|
9700
9700
|
service_name: SYSTEM_INBOX$2,
|
|
9701
9701
|
});
|
|
9702
9702
|
systemEntry.listener.stop();
|
|
@@ -9706,7 +9706,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9706
9706
|
catch (error) {
|
|
9707
9707
|
if (!(error instanceof Error) ||
|
|
9708
9708
|
error.name !== 'TaskCancelledError') {
|
|
9709
|
-
logger$
|
|
9709
|
+
logger$1b.debug('listener_task_stopped', {
|
|
9710
9710
|
service_name: SYSTEM_INBOX$2,
|
|
9711
9711
|
error: error instanceof Error ? error.message : String(error),
|
|
9712
9712
|
});
|
|
@@ -9723,13 +9723,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9723
9723
|
}
|
|
9724
9724
|
async recoverUnhandledInboundEnvelopes() {
|
|
9725
9725
|
if (typeof this.deliveryTracker.listInbound !== 'function') {
|
|
9726
|
-
logger$
|
|
9726
|
+
logger$1b.debug('delivery_tracker_missing_inbound_listing');
|
|
9727
9727
|
return;
|
|
9728
9728
|
}
|
|
9729
9729
|
const failedInbound = await this.deliveryTracker.listInbound((env) => env.status === EnvelopeStatus.RECEIVED ||
|
|
9730
9730
|
env.status === EnvelopeStatus.FAILED_TO_HANDLE);
|
|
9731
9731
|
if (!failedInbound.length) {
|
|
9732
|
-
logger$
|
|
9732
|
+
logger$1b.debug('no_failed_inbound_envelopes_to_recover');
|
|
9733
9733
|
return;
|
|
9734
9734
|
}
|
|
9735
9735
|
const grouped = new Map();
|
|
@@ -9746,7 +9746,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9746
9746
|
this.pendingRecoveryEnvelopes.set(serviceName, envelopes);
|
|
9747
9747
|
}
|
|
9748
9748
|
});
|
|
9749
|
-
logger$
|
|
9749
|
+
logger$1b.debug('discovered_failed_inbound_envelopes', {
|
|
9750
9750
|
total: failedInbound.length,
|
|
9751
9751
|
services: Array.from(grouped.keys()),
|
|
9752
9752
|
});
|
|
@@ -9756,7 +9756,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9756
9756
|
const pollTimeoutMs = options.pollTimeoutMs ??
|
|
9757
9757
|
options.poll_timeout_ms ??
|
|
9758
9758
|
DEFAULT_POLLING_TIMEOUT_MS;
|
|
9759
|
-
logger$
|
|
9759
|
+
logger$1b.debug('listen_start', {
|
|
9760
9760
|
recipient: serviceName,
|
|
9761
9761
|
poll_timeout_ms: pollTimeoutMs ?? DEFAULT_POLLING_TIMEOUT_MS,
|
|
9762
9762
|
});
|
|
@@ -9787,7 +9787,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9787
9787
|
tracked?.mailboxType === MailboxType.OUTBOX ||
|
|
9788
9788
|
envelope.frame?.['type'] === 'DeliveryAck';
|
|
9789
9789
|
if (!shouldInvoke) {
|
|
9790
|
-
logger$
|
|
9790
|
+
logger$1b.debug('skipping_listener_handler', {
|
|
9791
9791
|
recipient: serviceName,
|
|
9792
9792
|
envelope_id: envelope.id,
|
|
9793
9793
|
tracked_status: tracked?.status,
|
|
@@ -9801,13 +9801,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9801
9801
|
? undefined
|
|
9802
9802
|
: (tracked ?? undefined);
|
|
9803
9803
|
if (trackedForHandler && trackedForHandler.attempt > 0) {
|
|
9804
|
-
logger$
|
|
9804
|
+
logger$1b.info('resuming_handler_retry_after_restart', {
|
|
9805
9805
|
envelope_id: envelope.id,
|
|
9806
9806
|
current_attempts: trackedForHandler.attempt,
|
|
9807
9807
|
service_name: serviceName,
|
|
9808
9808
|
});
|
|
9809
9809
|
}
|
|
9810
|
-
logger$
|
|
9810
|
+
logger$1b.debug('forwarding_to_listener_handler', {
|
|
9811
9811
|
recipient: serviceName,
|
|
9812
9812
|
envelope_id: envelope.id,
|
|
9813
9813
|
frame_type: envelope.frame?.['type'],
|
|
@@ -9826,7 +9826,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9826
9826
|
await channel.send(null);
|
|
9827
9827
|
}
|
|
9828
9828
|
catch (error) {
|
|
9829
|
-
logger$
|
|
9829
|
+
logger$1b.debug('listener_stop_signal_failed', {
|
|
9830
9830
|
service_name: serviceName,
|
|
9831
9831
|
error: error instanceof Error ? error.message : String(error),
|
|
9832
9832
|
});
|
|
@@ -9835,7 +9835,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9835
9835
|
await this.listenersLock.runExclusive(async () => {
|
|
9836
9836
|
const existing = this.listeners.get(serviceName);
|
|
9837
9837
|
if (existing) {
|
|
9838
|
-
logger$
|
|
9838
|
+
logger$1b.debug('replacing_envelope_listener', { recipient: serviceName });
|
|
9839
9839
|
existing.listener.stop();
|
|
9840
9840
|
try {
|
|
9841
9841
|
await existing.listener.task.promise;
|
|
@@ -9853,13 +9853,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9853
9853
|
return binding.address;
|
|
9854
9854
|
}
|
|
9855
9855
|
async listenRpc(serviceName, handler, options = {}) {
|
|
9856
|
-
logger$
|
|
9856
|
+
logger$1b.debug('rpc_listen_start', { service_name: serviceName });
|
|
9857
9857
|
const rpcHandler = async (envelope, context) => {
|
|
9858
9858
|
const result = await this.rpcServerHandler.handleRpcRequest(envelope, context, handler, serviceName);
|
|
9859
9859
|
return result ?? null;
|
|
9860
9860
|
};
|
|
9861
9861
|
const address = await this.listen(serviceName, rpcHandler, options);
|
|
9862
|
-
logger$
|
|
9862
|
+
logger$1b.debug('rpc_listen_bound', {
|
|
9863
9863
|
service_name: serviceName,
|
|
9864
9864
|
address: address.toString(),
|
|
9865
9865
|
});
|
|
@@ -9928,12 +9928,12 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9928
9928
|
return cached;
|
|
9929
9929
|
});
|
|
9930
9930
|
if (!envelopes.length) {
|
|
9931
|
-
logger$
|
|
9931
|
+
logger$1b.debug('no_cached_recovery_for_service', {
|
|
9932
9932
|
service_name: serviceName,
|
|
9933
9933
|
});
|
|
9934
9934
|
return;
|
|
9935
9935
|
}
|
|
9936
|
-
logger$
|
|
9936
|
+
logger$1b.debug('recovering_unhandled_envelopes_on_listen', {
|
|
9937
9937
|
service_name: serviceName,
|
|
9938
9938
|
count: envelopes.length,
|
|
9939
9939
|
envelope_ids: envelopes.map((trackedEnvelope) => trackedEnvelope.envelopeId),
|
|
@@ -9944,7 +9944,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9944
9944
|
async recoverServiceEnvelopes(serviceName, envelopes, handler) {
|
|
9945
9945
|
for (const tracked of envelopes) {
|
|
9946
9946
|
try {
|
|
9947
|
-
logger$
|
|
9947
|
+
logger$1b.warning('recovering_unhandled_envelope', {
|
|
9948
9948
|
envelope_id: tracked.envelopeId,
|
|
9949
9949
|
service_name: serviceName,
|
|
9950
9950
|
current_attempts: tracked.attempt,
|
|
@@ -9953,13 +9953,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
9953
9953
|
const originalEnvelope = tracked.originalEnvelope;
|
|
9954
9954
|
const receiverPolicy = this.nodeLike.deliveryPolicy?.receiverRetryPolicy ?? undefined;
|
|
9955
9955
|
await this.executeHandlerWithRetries(handler, originalEnvelope, undefined, receiverPolicy, tracked, serviceName);
|
|
9956
|
-
logger$
|
|
9956
|
+
logger$1b.debug('envelope_recovery_completed', {
|
|
9957
9957
|
envelope_id: tracked.envelopeId,
|
|
9958
9958
|
service_name: serviceName,
|
|
9959
9959
|
});
|
|
9960
9960
|
}
|
|
9961
9961
|
catch (error) {
|
|
9962
|
-
logger$
|
|
9962
|
+
logger$1b.error('envelope_recovery_failed', {
|
|
9963
9963
|
envelope_id: tracked.envelopeId,
|
|
9964
9964
|
service_name: serviceName,
|
|
9965
9965
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -10005,7 +10005,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10005
10005
|
await this.deliveryTracker.onEnvelopeHandled(trackedEnvelope);
|
|
10006
10006
|
}
|
|
10007
10007
|
if (currentAttempt > 0) {
|
|
10008
|
-
logger$
|
|
10008
|
+
logger$1b.info('handler_retry_succeeded', {
|
|
10009
10009
|
envelope_id: envelope.id,
|
|
10010
10010
|
attempt: currentAttempt + 1,
|
|
10011
10011
|
total_attempts: currentAttempt + 1,
|
|
@@ -10021,7 +10021,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10021
10021
|
await this.deliveryTracker.onEnvelopeHandleFailed(inboxName, trackedEnvelope, context, error instanceof Error ? error : new Error(String(error)), isFinalAttempt);
|
|
10022
10022
|
}
|
|
10023
10023
|
if (isFinalAttempt) {
|
|
10024
|
-
logger$
|
|
10024
|
+
logger$1b.error('handler_execution_failed_exhausted_retries', {
|
|
10025
10025
|
envelope_id: envelope.id,
|
|
10026
10026
|
total_attempts: attemptNumber,
|
|
10027
10027
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10030,7 +10030,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10030
10030
|
break;
|
|
10031
10031
|
}
|
|
10032
10032
|
const delayMs = retryPolicy?.nextDelayMs(attemptNumber) ?? 0;
|
|
10033
|
-
logger$
|
|
10033
|
+
logger$1b.warning('handler_execution_failed_will_retry', {
|
|
10034
10034
|
envelope_id: envelope.id,
|
|
10035
10035
|
attempt: attemptNumber,
|
|
10036
10036
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -10060,7 +10060,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
10060
10060
|
}
|
|
10061
10061
|
}
|
|
10062
10062
|
|
|
10063
|
-
const logger$
|
|
10063
|
+
const logger$1a = getLogger('naylence.fame.delivery.default_delivery_tracker');
|
|
10064
10064
|
const STREAM_END = Symbol('stream-end');
|
|
10065
10065
|
const SWEEPER_TICK = Symbol('tracker-sweeper-tick');
|
|
10066
10066
|
function createDeferred$2() {
|
|
@@ -10292,7 +10292,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10292
10292
|
const expectedResponseType = options.expectedResponseType;
|
|
10293
10293
|
const tracked = await this.lock.runExclusive(async () => {
|
|
10294
10294
|
if (this.ackFutures.has(envelope.id)) {
|
|
10295
|
-
logger$
|
|
10295
|
+
logger$1a.debug('tracker_envelope_already_tracked', {
|
|
10296
10296
|
envp_id: envelope.id,
|
|
10297
10297
|
});
|
|
10298
10298
|
return null;
|
|
@@ -10302,7 +10302,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10302
10302
|
if (expectedResponseType & FameResponseType.REPLY ||
|
|
10303
10303
|
expectedResponseType & FameResponseType.STREAM) {
|
|
10304
10304
|
if (existingEnvId && existingEnvId !== envelope.id) {
|
|
10305
|
-
logger$
|
|
10305
|
+
logger$1a.debug('envelope_already_tracked_for_replies', {
|
|
10306
10306
|
envp_id: envelope.id,
|
|
10307
10307
|
corr_id: corrId,
|
|
10308
10308
|
expected_response_type: expectedResponseType,
|
|
@@ -10351,7 +10351,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10351
10351
|
return null;
|
|
10352
10352
|
}
|
|
10353
10353
|
await this.scheduleTimer(tracked, options.retryPolicy ?? null, options.retryHandler ?? null);
|
|
10354
|
-
logger$
|
|
10354
|
+
logger$1a.debug('tracker_registered_envelope', {
|
|
10355
10355
|
envp_id: envelope.id,
|
|
10356
10356
|
corr_id: tracked.originalEnvelope.corrId,
|
|
10357
10357
|
expected_response: tracked.expectedResponseType,
|
|
@@ -10375,21 +10375,21 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10375
10375
|
return this.awaitEnvelopeFuture(envelopeId, FameResponseType.REPLY | FameResponseType.STREAM, future, timeoutMs);
|
|
10376
10376
|
}
|
|
10377
10377
|
async onEnvelopeDelivered(inboxName, envelope, context) {
|
|
10378
|
-
logger$
|
|
10378
|
+
logger$1a.debug('envelope_delivered', {
|
|
10379
10379
|
envp_id: envelope.id,
|
|
10380
10380
|
corr_id: envelope.corrId,
|
|
10381
10381
|
rtype: envelope.rtype ?? FameResponseType.NONE,
|
|
10382
10382
|
frame_type: envelope.frame?.type ?? 'unknown',
|
|
10383
10383
|
});
|
|
10384
10384
|
if (!envelope.corrId) {
|
|
10385
|
-
logger$
|
|
10385
|
+
logger$1a.debug('envelope_delivered_no_corr_id', {
|
|
10386
10386
|
envelope_id: envelope.id,
|
|
10387
10387
|
});
|
|
10388
10388
|
return null;
|
|
10389
10389
|
}
|
|
10390
10390
|
if (this.isDeliveryAckFrame(envelope.frame)) {
|
|
10391
10391
|
if (!envelope.frame.refId) {
|
|
10392
|
-
logger$
|
|
10392
|
+
logger$1a.debug('envelope_delivered_no_ref_id', {
|
|
10393
10393
|
envelope_id: envelope.id,
|
|
10394
10394
|
});
|
|
10395
10395
|
return null;
|
|
@@ -10427,7 +10427,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10427
10427
|
await inbox.set(envelope.id, tracked);
|
|
10428
10428
|
}
|
|
10429
10429
|
else {
|
|
10430
|
-
logger$
|
|
10430
|
+
logger$1a.debug('tracker_duplicate_envelope_already_handled', {
|
|
10431
10431
|
envp_id: envelope.id,
|
|
10432
10432
|
status: tracked.status,
|
|
10433
10433
|
});
|
|
@@ -10470,7 +10470,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10470
10470
|
}
|
|
10471
10471
|
if (isFinalFailure) {
|
|
10472
10472
|
envelope.status = EnvelopeStatus.FAILED_TO_HANDLE;
|
|
10473
|
-
logger$
|
|
10473
|
+
logger$1a.error('envelope_handle_failed_final', {
|
|
10474
10474
|
inbox_name: inboxName,
|
|
10475
10475
|
envp_id: envelope.originalEnvelope.id,
|
|
10476
10476
|
error: error?.message ?? 'unknown',
|
|
@@ -10481,7 +10481,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10481
10481
|
await inbox.delete(envelope.originalEnvelope.id);
|
|
10482
10482
|
return;
|
|
10483
10483
|
}
|
|
10484
|
-
logger$
|
|
10484
|
+
logger$1a.warning('envelope_handle_failed_retry', {
|
|
10485
10485
|
inbox_name: inboxName,
|
|
10486
10486
|
envp_id: envelope.originalEnvelope.id,
|
|
10487
10487
|
error: error?.message ?? 'unknown',
|
|
@@ -10527,14 +10527,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10527
10527
|
if (handledViaFuture) {
|
|
10528
10528
|
await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
|
|
10529
10529
|
await this.clearTimer(refId);
|
|
10530
|
-
logger$
|
|
10530
|
+
logger$1a.debug('tracker_ack_resolved_without_tracked_envelope', {
|
|
10531
10531
|
envp_id: envelope.id,
|
|
10532
10532
|
ref_id: refId,
|
|
10533
10533
|
corr_id: envelope.corrId,
|
|
10534
10534
|
});
|
|
10535
10535
|
return;
|
|
10536
10536
|
}
|
|
10537
|
-
logger$
|
|
10537
|
+
logger$1a.debug('tracker_ack_for_unknown_envelope', {
|
|
10538
10538
|
envp_id: envelope.id,
|
|
10539
10539
|
ref_id: refId,
|
|
10540
10540
|
corr_id: envelope.corrId,
|
|
@@ -10542,7 +10542,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10542
10542
|
return;
|
|
10543
10543
|
}
|
|
10544
10544
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10545
|
-
logger$
|
|
10545
|
+
logger$1a.debug('tracker_ack_corr_id_mismatch', {
|
|
10546
10546
|
envp_id: envelope.id,
|
|
10547
10547
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10548
10548
|
actual_corr_id: envelope.corrId,
|
|
@@ -10567,7 +10567,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10567
10567
|
for (const handler of this.eventHandlers) {
|
|
10568
10568
|
await handler.onEnvelopeAcked?.(tracked);
|
|
10569
10569
|
}
|
|
10570
|
-
logger$
|
|
10570
|
+
logger$1a.debug('tracker_envelope_acked', {
|
|
10571
10571
|
envp_id: tracked.originalEnvelope.id,
|
|
10572
10572
|
});
|
|
10573
10573
|
}
|
|
@@ -10585,13 +10585,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10585
10585
|
const outbox = this.ensureOutbox();
|
|
10586
10586
|
const tracked = await outbox.get(envelope.frame.refId);
|
|
10587
10587
|
if (!tracked) {
|
|
10588
|
-
logger$
|
|
10588
|
+
logger$1a.debug('tracker_nack_for_unknown_envelope', {
|
|
10589
10589
|
envp_id: envelope.id,
|
|
10590
10590
|
});
|
|
10591
10591
|
return;
|
|
10592
10592
|
}
|
|
10593
10593
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
10594
|
-
logger$
|
|
10594
|
+
logger$1a.debug('tracker_nack_corr_id_mismatch', {
|
|
10595
10595
|
envp_id: envelope.id,
|
|
10596
10596
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
10597
10597
|
actual_corr_id: envelope.corrId,
|
|
@@ -10633,7 +10633,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10633
10633
|
for (const handler of this.eventHandlers) {
|
|
10634
10634
|
await handler.onEnvelopeNacked?.(tracked, ackFrame.reason ?? null);
|
|
10635
10635
|
}
|
|
10636
|
-
logger$
|
|
10636
|
+
logger$1a.debug('tracker_envelope_nacked', {
|
|
10637
10637
|
envp_id: tracked.originalEnvelope.id,
|
|
10638
10638
|
reason: ackFrame.reason,
|
|
10639
10639
|
});
|
|
@@ -10681,7 +10681,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10681
10681
|
for (const handler of this.eventHandlers) {
|
|
10682
10682
|
await handler.onEnvelopeReplied?.(trackedEnvelope, envelope);
|
|
10683
10683
|
}
|
|
10684
|
-
logger$
|
|
10684
|
+
logger$1a.debug('tracked_envelope_replied', {
|
|
10685
10685
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10686
10686
|
corr_id: envelope.corrId,
|
|
10687
10687
|
});
|
|
@@ -10755,7 +10755,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10755
10755
|
async addToInboxDlq(trackedEnvelope, reason = null) {
|
|
10756
10756
|
const dlq = this.inboxDlq;
|
|
10757
10757
|
if (!dlq) {
|
|
10758
|
-
logger$
|
|
10758
|
+
logger$1a.error('dlq_not_initialized', {
|
|
10759
10759
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10760
10760
|
});
|
|
10761
10761
|
return;
|
|
@@ -10770,7 +10770,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10770
10770
|
const deadLetteredAt = Date.now();
|
|
10771
10771
|
setMetaWithLegacy(trackedEnvelope.meta, 'deadLetteredAtMs', 'dead_lettered_at_ms', deadLetteredAt);
|
|
10772
10772
|
await dlq.set(trackedEnvelope.originalEnvelope.id, trackedEnvelope);
|
|
10773
|
-
logger$
|
|
10773
|
+
logger$1a.warning('envelope_moved_to_dlq', {
|
|
10774
10774
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
10775
10775
|
service_name: trackedEnvelope.serviceName,
|
|
10776
10776
|
});
|
|
@@ -10799,7 +10799,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10799
10799
|
const toDelete = Object.entries(items).filter(([, value]) => predicate ? predicate(value) : true);
|
|
10800
10800
|
await Promise.all(toDelete.map(([key]) => dlq.delete(key)));
|
|
10801
10801
|
if (toDelete.length) {
|
|
10802
|
-
logger$
|
|
10802
|
+
logger$1a.debug('dlq_purged', { count: toDelete.length });
|
|
10803
10803
|
}
|
|
10804
10804
|
return toDelete.length;
|
|
10805
10805
|
}
|
|
@@ -10852,11 +10852,11 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10852
10852
|
}
|
|
10853
10853
|
this.futuresSweeper = null;
|
|
10854
10854
|
}
|
|
10855
|
-
logger$
|
|
10855
|
+
logger$1a.debug('tracker_cleanup_completed');
|
|
10856
10856
|
}
|
|
10857
10857
|
async recoverPending() {
|
|
10858
10858
|
const pending = await this.listPending();
|
|
10859
|
-
logger$
|
|
10859
|
+
logger$1a.debug('tracker_recovering_pending', { count: pending.length });
|
|
10860
10860
|
await this.lock.runExclusive(async () => {
|
|
10861
10861
|
for (const tracked of pending) {
|
|
10862
10862
|
if (tracked.expectedResponseType & FameResponseType.ACK) {
|
|
@@ -10882,7 +10882,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10882
10882
|
for (const tracked of pending) {
|
|
10883
10883
|
await this.scheduleTimer(tracked, null, null);
|
|
10884
10884
|
}
|
|
10885
|
-
logger$
|
|
10885
|
+
logger$1a.debug('tracker_recovery_completed', { count: pending.length });
|
|
10886
10886
|
}
|
|
10887
10887
|
ensureOutbox() {
|
|
10888
10888
|
if (!this.outbox) {
|
|
@@ -10897,7 +10897,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10897
10897
|
return this.inbox;
|
|
10898
10898
|
}
|
|
10899
10899
|
async waitForPendingAcks() {
|
|
10900
|
-
logger$
|
|
10900
|
+
logger$1a.debug('tracker_node_preparing_to_stop_waiting_for_pending_acks');
|
|
10901
10901
|
const outbox = this.outbox;
|
|
10902
10902
|
if (!outbox) {
|
|
10903
10903
|
return;
|
|
@@ -10909,7 +10909,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10909
10909
|
continue;
|
|
10910
10910
|
}
|
|
10911
10911
|
if (!future.done) {
|
|
10912
|
-
logger$
|
|
10912
|
+
logger$1a.debug('tracker_pending_ack_future_detected', {
|
|
10913
10913
|
envelope_id: envelopeId,
|
|
10914
10914
|
});
|
|
10915
10915
|
pending.push({ envelopeId, future });
|
|
@@ -10917,10 +10917,10 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10917
10917
|
}
|
|
10918
10918
|
});
|
|
10919
10919
|
if (!pending.length) {
|
|
10920
|
-
logger$
|
|
10920
|
+
logger$1a.debug('tracker_no_pending_acks_to_wait_for');
|
|
10921
10921
|
return;
|
|
10922
10922
|
}
|
|
10923
|
-
logger$
|
|
10923
|
+
logger$1a.debug('tracker_waiting_for_pending_acks', { count: pending.length });
|
|
10924
10924
|
for (const entry of pending) {
|
|
10925
10925
|
if (!entry) {
|
|
10926
10926
|
continue;
|
|
@@ -10937,19 +10937,19 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10937
10937
|
}
|
|
10938
10938
|
try {
|
|
10939
10939
|
await this.awaitWithTimeout(entry.future.promise, remainingMs);
|
|
10940
|
-
logger$
|
|
10940
|
+
logger$1a.debug('tracker_received_ack', {
|
|
10941
10941
|
envelope_id: entry.envelopeId,
|
|
10942
10942
|
});
|
|
10943
10943
|
await outbox.delete(entry.envelopeId);
|
|
10944
10944
|
}
|
|
10945
10945
|
catch (error) {
|
|
10946
10946
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
10947
|
-
logger$
|
|
10947
|
+
logger$1a.debug('tracker_ack_timeout_expired', {
|
|
10948
10948
|
envelope_id: entry.envelopeId,
|
|
10949
10949
|
});
|
|
10950
10950
|
}
|
|
10951
10951
|
else {
|
|
10952
|
-
logger$
|
|
10952
|
+
logger$1a.debug('tracker_ack_wait_error', {
|
|
10953
10953
|
envelope_id: entry.envelopeId,
|
|
10954
10954
|
error: error instanceof Error ? error.message : String(error),
|
|
10955
10955
|
});
|
|
@@ -10957,13 +10957,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
10957
10957
|
}
|
|
10958
10958
|
}
|
|
10959
10959
|
catch (error) {
|
|
10960
|
-
logger$
|
|
10960
|
+
logger$1a.error('tracker_error_waiting_for_ack', {
|
|
10961
10961
|
envelope_id: entry.envelopeId,
|
|
10962
10962
|
error: error instanceof Error ? error.message : String(error),
|
|
10963
10963
|
});
|
|
10964
10964
|
}
|
|
10965
10965
|
}
|
|
10966
|
-
logger$
|
|
10966
|
+
logger$1a.debug('tracker_finished_waiting_for_pending_acks');
|
|
10967
10967
|
}
|
|
10968
10968
|
async waitForPendingAckDispatches() {
|
|
10969
10969
|
while (this.pendingAckDispatches.size > 0) {
|
|
@@ -11021,7 +11021,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11021
11021
|
for (const handler of this.eventHandlers) {
|
|
11022
11022
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11023
11023
|
}
|
|
11024
|
-
logger$
|
|
11024
|
+
logger$1a.debug('tracker_envelope_timed_out', {
|
|
11025
11025
|
envp_id: tracked.originalEnvelope.id,
|
|
11026
11026
|
});
|
|
11027
11027
|
return;
|
|
@@ -11034,7 +11034,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11034
11034
|
currentTracked.timeoutAtMs = nextTimeoutAt;
|
|
11035
11035
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11036
11036
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11037
|
-
logger$
|
|
11037
|
+
logger$1a.debug('tracker_retry_deferred_during_shutdown', {
|
|
11038
11038
|
envp_id: tracked.originalEnvelope.id,
|
|
11039
11039
|
defer_ms: shutdownDeferMs,
|
|
11040
11040
|
});
|
|
@@ -11057,7 +11057,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11057
11057
|
});
|
|
11058
11058
|
}
|
|
11059
11059
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11060
|
-
logger$
|
|
11060
|
+
logger$1a.debug('envelope_delivery_retry_scheduled', {
|
|
11061
11061
|
envp_id: tracked.originalEnvelope.id,
|
|
11062
11062
|
attempt: currentTracked.attempt,
|
|
11063
11063
|
max_retries: retryPolicy.maxRetries,
|
|
@@ -11069,7 +11069,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11069
11069
|
currentTracked.timeoutAtMs = currentTracked.overallTimeoutAtMs;
|
|
11070
11070
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
11071
11071
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
11072
|
-
logger$
|
|
11072
|
+
logger$1a.debug('envelope_retries_exhausted_waiting_until_overall_timeout', {
|
|
11073
11073
|
envp_id: tracked.originalEnvelope.id,
|
|
11074
11074
|
attempt: currentTracked.attempt,
|
|
11075
11075
|
overall_timeout_at_ms: currentTracked.overallTimeoutAtMs,
|
|
@@ -11089,7 +11089,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11089
11089
|
for (const handler of this.eventHandlers) {
|
|
11090
11090
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
11091
11091
|
}
|
|
11092
|
-
logger$
|
|
11092
|
+
logger$1a.debug('tracker_envelope_timed_out', {
|
|
11093
11093
|
envp_id: tracked.originalEnvelope.id,
|
|
11094
11094
|
});
|
|
11095
11095
|
}
|
|
@@ -11097,7 +11097,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11097
11097
|
if (error instanceof TaskCancelledError) {
|
|
11098
11098
|
return;
|
|
11099
11099
|
}
|
|
11100
|
-
logger$
|
|
11100
|
+
logger$1a.error('tracker_timer_error', {
|
|
11101
11101
|
envp_id: tracked.originalEnvelope.id,
|
|
11102
11102
|
error: error instanceof Error ? error.message : String(error),
|
|
11103
11103
|
});
|
|
@@ -11152,7 +11152,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11152
11152
|
if (timeoutSeconds !== null) {
|
|
11153
11153
|
return await this.awaitWithTimeout(future.promise, timeoutSeconds);
|
|
11154
11154
|
}
|
|
11155
|
-
logger$
|
|
11155
|
+
logger$1a.debug('await_envelope_no_timeout_wait', {
|
|
11156
11156
|
envelope_id: envelopeId,
|
|
11157
11157
|
});
|
|
11158
11158
|
return await future.promise;
|
|
@@ -11161,7 +11161,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11161
11161
|
if (error instanceof Error && error.name !== 'TimeoutError') {
|
|
11162
11162
|
throw error;
|
|
11163
11163
|
}
|
|
11164
|
-
logger$
|
|
11164
|
+
logger$1a.error('await_envelope_timeout_error', {
|
|
11165
11165
|
envelope_id: envelopeId,
|
|
11166
11166
|
timeout_ms: timeoutSeconds,
|
|
11167
11167
|
future_done: false,
|
|
@@ -11322,7 +11322,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11322
11322
|
this.replyDoneSince.delete(envId);
|
|
11323
11323
|
}
|
|
11324
11324
|
});
|
|
11325
|
-
logger$
|
|
11325
|
+
logger$1a.debug('tracker_swept_completed_futures', {
|
|
11326
11326
|
ack_removed: toRemoveAck.length,
|
|
11327
11327
|
reply_removed: toRemoveReply.length,
|
|
11328
11328
|
grace_secs: this.futGcGraceSecs,
|
|
@@ -11336,7 +11336,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11336
11336
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
11337
11337
|
continue;
|
|
11338
11338
|
}
|
|
11339
|
-
logger$
|
|
11339
|
+
logger$1a.error('tracker_sweeper_error', {
|
|
11340
11340
|
error: error instanceof Error ? error.message : String(error),
|
|
11341
11341
|
});
|
|
11342
11342
|
}
|
|
@@ -11367,14 +11367,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11367
11367
|
}
|
|
11368
11368
|
const node = this.node;
|
|
11369
11369
|
if (!envelope.replyTo) {
|
|
11370
|
-
logger$
|
|
11370
|
+
logger$1a.error('cannot_send_ack_no_reply_to', { envp_id: envelope.id });
|
|
11371
11371
|
return;
|
|
11372
11372
|
}
|
|
11373
11373
|
if (!envelope.corrId) {
|
|
11374
|
-
logger$
|
|
11374
|
+
logger$1a.error('cannot_send_ack_no_corr_id', { envp_id: envelope.id });
|
|
11375
11375
|
return;
|
|
11376
11376
|
}
|
|
11377
|
-
logger$
|
|
11377
|
+
logger$1a.debug('tracker_sending_ack', {
|
|
11378
11378
|
envp_id: envelope.id,
|
|
11379
11379
|
ref_id: envelope.id,
|
|
11380
11380
|
to: envelope.replyTo,
|
|
@@ -11394,7 +11394,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
11394
11394
|
.send(ackEnvelope)
|
|
11395
11395
|
.then(() => undefined)
|
|
11396
11396
|
.catch((error) => {
|
|
11397
|
-
logger$
|
|
11397
|
+
logger$1a.error('tracker_ack_dispatch_failed', {
|
|
11398
11398
|
envp_id: envelope.id,
|
|
11399
11399
|
error: error instanceof Error ? error.message : String(error),
|
|
11400
11400
|
});
|
|
@@ -11480,7 +11480,7 @@ class AsyncEvent {
|
|
|
11480
11480
|
}
|
|
11481
11481
|
}
|
|
11482
11482
|
|
|
11483
|
-
const logger$
|
|
11483
|
+
const logger$19 = getLogger('naylence.fame.node.root_session_manager');
|
|
11484
11484
|
function resolveOption$1(options, primary, ...aliases) {
|
|
11485
11485
|
const record = options;
|
|
11486
11486
|
const primaryKey = primary;
|
|
@@ -11561,7 +11561,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11561
11561
|
this.onAdmissionFailed =
|
|
11562
11562
|
typeof onAdmissionFailed === 'function' ? onAdmissionFailed : undefined;
|
|
11563
11563
|
this.enableContinuousRefresh = enableContinuousRefresh ?? true;
|
|
11564
|
-
logger$
|
|
11564
|
+
logger$19.debug('created_root_session_manager');
|
|
11565
11565
|
}
|
|
11566
11566
|
get isReady() {
|
|
11567
11567
|
return this.readyEvent.isSet();
|
|
@@ -11586,7 +11586,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11586
11586
|
if (this.admissionTask) {
|
|
11587
11587
|
return;
|
|
11588
11588
|
}
|
|
11589
|
-
logger$
|
|
11589
|
+
logger$19.debug('root_session_manager_starting');
|
|
11590
11590
|
this.stopEvent.clear();
|
|
11591
11591
|
this.readyEvent.clear();
|
|
11592
11592
|
const taskName = `root-admission-${this.admissionEpoch}`;
|
|
@@ -11606,10 +11606,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11606
11606
|
await this.admissionTask.promise;
|
|
11607
11607
|
throw new FameConnectError('Root session manager failed to become ready');
|
|
11608
11608
|
}
|
|
11609
|
-
logger$
|
|
11609
|
+
logger$19.debug('root_session_manager_started');
|
|
11610
11610
|
}
|
|
11611
11611
|
async stop() {
|
|
11612
|
-
logger$
|
|
11612
|
+
logger$19.debug('root_session_manager_stopping');
|
|
11613
11613
|
this.stopEvent.set();
|
|
11614
11614
|
if (this.admissionTask) {
|
|
11615
11615
|
this.admissionTask.cancel();
|
|
@@ -11621,7 +11621,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11621
11621
|
await this.consumeTask(this.expiryGuardTask);
|
|
11622
11622
|
this.expiryGuardTask = null;
|
|
11623
11623
|
}
|
|
11624
|
-
logger$
|
|
11624
|
+
logger$19.debug('root_session_manager_stopped');
|
|
11625
11625
|
}
|
|
11626
11626
|
async awaitReady(timeoutMs) {
|
|
11627
11627
|
if (this.isReady) {
|
|
@@ -11662,12 +11662,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11662
11662
|
await this.onEpochChange(epoch);
|
|
11663
11663
|
}
|
|
11664
11664
|
else {
|
|
11665
|
-
logger$
|
|
11665
|
+
logger$19.debug('epoch_change_ignored_no_handler', { epoch });
|
|
11666
11666
|
}
|
|
11667
11667
|
}
|
|
11668
11668
|
static createForRootSentinel(node, admissionClient, requestedLogicals = [], enableContinuousRefresh = true, onEpochChange) {
|
|
11669
11669
|
const handleWelcome = async (frame) => {
|
|
11670
|
-
logger$
|
|
11670
|
+
logger$19.info('root_admission_successful', {
|
|
11671
11671
|
system_id: frame.systemId,
|
|
11672
11672
|
assigned_path: frame.assignedPath ?? null,
|
|
11673
11673
|
accepted_logicals: frame.acceptedLogicals ?? [],
|
|
@@ -11678,12 +11678,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11678
11678
|
? grant.purpose
|
|
11679
11679
|
: undefined;
|
|
11680
11680
|
if (purpose) {
|
|
11681
|
-
logger$
|
|
11681
|
+
logger$19.debug('received_admission_grant', { purpose });
|
|
11682
11682
|
}
|
|
11683
11683
|
}
|
|
11684
11684
|
};
|
|
11685
11685
|
const handleFailure = async (error) => {
|
|
11686
|
-
logger$
|
|
11686
|
+
logger$19.error('root_admission_failed_permanently', {
|
|
11687
11687
|
error: error.message,
|
|
11688
11688
|
});
|
|
11689
11689
|
};
|
|
@@ -11712,10 +11712,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11712
11712
|
this.readyEvent.set();
|
|
11713
11713
|
}
|
|
11714
11714
|
if (this.hadSuccessfulAdmission) {
|
|
11715
|
-
logger$
|
|
11715
|
+
logger$19.debug('root_admission_refreshed');
|
|
11716
11716
|
}
|
|
11717
11717
|
else {
|
|
11718
|
-
logger$
|
|
11718
|
+
logger$19.debug('root_admission_completed');
|
|
11719
11719
|
}
|
|
11720
11720
|
this.hadSuccessfulAdmission = true;
|
|
11721
11721
|
delay = RootSessionManager.BACKOFF_INITIAL;
|
|
@@ -11724,7 +11724,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11724
11724
|
await this.startExpiryGuard(welcomeFrame);
|
|
11725
11725
|
const expiryTriggered = await this.waitForExpiryOrStop();
|
|
11726
11726
|
if (expiryTriggered && !this.stopEvent.isSet()) {
|
|
11727
|
-
logger$
|
|
11727
|
+
logger$19.debug('performing_scheduled_re_admission');
|
|
11728
11728
|
continue;
|
|
11729
11729
|
}
|
|
11730
11730
|
}
|
|
@@ -11736,7 +11736,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11736
11736
|
}
|
|
11737
11737
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11738
11738
|
const willRetry = attempts < RootSessionManager.RETRY_MAX_ATTEMPTS;
|
|
11739
|
-
logger$
|
|
11739
|
+
logger$19.warning('root_admission_failed', {
|
|
11740
11740
|
error: errorObject.message,
|
|
11741
11741
|
attempt: attempts,
|
|
11742
11742
|
will_retry: willRetry,
|
|
@@ -11754,7 +11754,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11754
11754
|
}
|
|
11755
11755
|
}
|
|
11756
11756
|
if (attempts >= RootSessionManager.RETRY_MAX_ATTEMPTS) {
|
|
11757
|
-
logger$
|
|
11757
|
+
logger$19.error('root_admission_max_attempts_exceeded', {
|
|
11758
11758
|
max_attempts: RootSessionManager.RETRY_MAX_ATTEMPTS,
|
|
11759
11759
|
});
|
|
11760
11760
|
}
|
|
@@ -11831,7 +11831,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11831
11831
|
}
|
|
11832
11832
|
async expiryGuard(welcomeFrame, signal) {
|
|
11833
11833
|
if (!welcomeFrame.expiresAt) {
|
|
11834
|
-
logger$
|
|
11834
|
+
logger$19.debug('no_admission_expiry_configured');
|
|
11835
11835
|
await Promise.race([this.stopEvent.wait(), this.waitForAbort(signal)]);
|
|
11836
11836
|
return;
|
|
11837
11837
|
}
|
|
@@ -11840,7 +11840,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11840
11840
|
let delaySeconds = (expiresAt.getTime() - now.getTime()) / 1000 -
|
|
11841
11841
|
RootSessionManager.JWT_REFRESH_SAFETY;
|
|
11842
11842
|
delaySeconds = Math.max(delaySeconds, 0);
|
|
11843
|
-
logger$
|
|
11843
|
+
logger$19.debug('admission_expiry_guard_started', {
|
|
11844
11844
|
welcome_expires_at: expiresAt.toISOString(),
|
|
11845
11845
|
delay_seconds: delaySeconds,
|
|
11846
11846
|
refresh_safety_seconds: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11849,7 +11849,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11849
11849
|
if (this.stopEvent.isSet() || signal?.aborted) {
|
|
11850
11850
|
return;
|
|
11851
11851
|
}
|
|
11852
|
-
logger$
|
|
11852
|
+
logger$19.debug('admission_expiry_triggered_refresh', {
|
|
11853
11853
|
expires_at: expiresAt.toISOString(),
|
|
11854
11854
|
current_time: new Date().toISOString(),
|
|
11855
11855
|
seconds_before_expiry: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11864,7 +11864,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
11864
11864
|
return;
|
|
11865
11865
|
}
|
|
11866
11866
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
11867
|
-
logger$
|
|
11867
|
+
logger$19.debug('background_task_error', {
|
|
11868
11868
|
task_name: task.name,
|
|
11869
11869
|
error: errorObject.message,
|
|
11870
11870
|
});
|
|
@@ -11960,7 +11960,7 @@ class BoundedAsyncQueue {
|
|
|
11960
11960
|
}
|
|
11961
11961
|
}
|
|
11962
11962
|
|
|
11963
|
-
const logger$
|
|
11963
|
+
const logger$18 = getLogger('naylence.fame.connector.broadcast_channel_connector');
|
|
11964
11964
|
const BROADCAST_CHANNEL_CONNECTOR_TYPE$1 = 'broadcast-channel-connector';
|
|
11965
11965
|
const DEFAULT_CHANNEL$7 = 'naylence-fabric';
|
|
11966
11966
|
const DEFAULT_INBOX_CAPACITY$7 = 2048;
|
|
@@ -12049,7 +12049,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12049
12049
|
this.localNodeId = normalizedLocalNodeId;
|
|
12050
12050
|
this.targetNodeId = BroadcastChannelConnector.normalizeTargetNodeId(config.initialTargetNodeId);
|
|
12051
12051
|
this.channel = new BroadcastChannel(this.channelName);
|
|
12052
|
-
logger$
|
|
12052
|
+
logger$18.debug('broadcast_channel_connector_created', {
|
|
12053
12053
|
channel: this.channelName,
|
|
12054
12054
|
connector_id: this.connectorId,
|
|
12055
12055
|
local_node_id: this.localNodeId,
|
|
@@ -12061,7 +12061,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12061
12061
|
this.onMsg = (event) => {
|
|
12062
12062
|
// Guard: Don't process if listener was unregistered
|
|
12063
12063
|
if (!this.listenerRegistered) {
|
|
12064
|
-
logger$
|
|
12064
|
+
logger$18.warning('broadcast_channel_message_after_unregister', {
|
|
12065
12065
|
channel: this.channelName,
|
|
12066
12066
|
connector_id: this.connectorId,
|
|
12067
12067
|
timestamp: new Date().toISOString(),
|
|
@@ -12069,7 +12069,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12069
12069
|
return;
|
|
12070
12070
|
}
|
|
12071
12071
|
const message = event.data;
|
|
12072
|
-
logger$
|
|
12072
|
+
logger$18.debug('broadcast_channel_raw_event', {
|
|
12073
12073
|
channel: this.channelName,
|
|
12074
12074
|
connector_id: this.connectorId,
|
|
12075
12075
|
message_type: message && typeof message === 'object'
|
|
@@ -12085,7 +12085,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12085
12085
|
const busMessage = message;
|
|
12086
12086
|
const senderNodeId = BroadcastChannelConnector.normalizeNodeId(busMessage.senderNodeId);
|
|
12087
12087
|
if (!senderNodeId) {
|
|
12088
|
-
logger$
|
|
12088
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12089
12089
|
channel: this.channelName,
|
|
12090
12090
|
connector_id: this.connectorId,
|
|
12091
12091
|
reason: 'missing_sender_node_id',
|
|
@@ -12093,7 +12093,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12093
12093
|
return;
|
|
12094
12094
|
}
|
|
12095
12095
|
if (senderNodeId === this.localNodeId) {
|
|
12096
|
-
logger$
|
|
12096
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12097
12097
|
channel: this.channelName,
|
|
12098
12098
|
connector_id: this.connectorId,
|
|
12099
12099
|
reason: 'self_echo',
|
|
@@ -12107,14 +12107,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12107
12107
|
}
|
|
12108
12108
|
const payload = BroadcastChannelConnector.coercePayload(busMessage.payload);
|
|
12109
12109
|
if (!payload) {
|
|
12110
|
-
logger$
|
|
12110
|
+
logger$18.debug('broadcast_channel_payload_rejected', {
|
|
12111
12111
|
channel: this.channelName,
|
|
12112
12112
|
connector_id: this.connectorId,
|
|
12113
12113
|
reason: 'unrecognized_payload_type',
|
|
12114
12114
|
});
|
|
12115
12115
|
return;
|
|
12116
12116
|
}
|
|
12117
|
-
logger$
|
|
12117
|
+
logger$18.debug('broadcast_channel_message_received', {
|
|
12118
12118
|
channel: this.channelName,
|
|
12119
12119
|
sender_id: message?.senderId,
|
|
12120
12120
|
sender_node_id: senderNodeId,
|
|
@@ -12143,14 +12143,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12143
12143
|
}
|
|
12144
12144
|
catch (error) {
|
|
12145
12145
|
if (error instanceof QueueFullError) {
|
|
12146
|
-
logger$
|
|
12146
|
+
logger$18.warning('broadcast_channel_receive_queue_full', {
|
|
12147
12147
|
channel: this.channelName,
|
|
12148
12148
|
inbox_capacity: this.inboxCapacity,
|
|
12149
12149
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12150
12150
|
});
|
|
12151
12151
|
}
|
|
12152
12152
|
else {
|
|
12153
|
-
logger$
|
|
12153
|
+
logger$18.error('broadcast_channel_receive_error', {
|
|
12154
12154
|
channel: this.channelName,
|
|
12155
12155
|
error: error instanceof Error ? error.message : String(error),
|
|
12156
12156
|
});
|
|
@@ -12164,7 +12164,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12164
12164
|
// Setup visibility change monitoring
|
|
12165
12165
|
this.visibilityChangeHandler = () => {
|
|
12166
12166
|
const isHidden = document.hidden;
|
|
12167
|
-
logger$
|
|
12167
|
+
logger$18.debug('broadcast_channel_visibility_changed', {
|
|
12168
12168
|
channel: this.channelName,
|
|
12169
12169
|
connector_id: this.connectorId,
|
|
12170
12170
|
visibility: isHidden ? 'hidden' : 'visible',
|
|
@@ -12173,7 +12173,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12173
12173
|
// Pause/resume connector based on visibility
|
|
12174
12174
|
if (isHidden && this.state === ConnectorState.STARTED) {
|
|
12175
12175
|
this.pause().catch((err) => {
|
|
12176
|
-
logger$
|
|
12176
|
+
logger$18.warning('broadcast_channel_pause_failed', {
|
|
12177
12177
|
channel: this.channelName,
|
|
12178
12178
|
connector_id: this.connectorId,
|
|
12179
12179
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12182,7 +12182,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12182
12182
|
}
|
|
12183
12183
|
else if (!isHidden && this.state === ConnectorState.PAUSED) {
|
|
12184
12184
|
this.resume().catch((err) => {
|
|
12185
|
-
logger$
|
|
12185
|
+
logger$18.warning('broadcast_channel_resume_failed', {
|
|
12186
12186
|
channel: this.channelName,
|
|
12187
12187
|
connector_id: this.connectorId,
|
|
12188
12188
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12196,7 +12196,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12196
12196
|
// Track page lifecycle events to detect browser unload/discard
|
|
12197
12197
|
if (typeof window !== 'undefined') {
|
|
12198
12198
|
const lifecycleLogger = (event) => {
|
|
12199
|
-
logger$
|
|
12199
|
+
logger$18.debug('broadcast_channel_page_lifecycle', {
|
|
12200
12200
|
channel: this.channelName,
|
|
12201
12201
|
connector_id: this.connectorId,
|
|
12202
12202
|
event_type: event.type,
|
|
@@ -12212,7 +12212,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12212
12212
|
document.addEventListener('resume', lifecycleLogger);
|
|
12213
12213
|
}
|
|
12214
12214
|
// Log initial state with detailed visibility info
|
|
12215
|
-
logger$
|
|
12215
|
+
logger$18.debug('broadcast_channel_initial_visibility', {
|
|
12216
12216
|
channel: this.channelName,
|
|
12217
12217
|
connector_id: this.connectorId,
|
|
12218
12218
|
visibility: document.hidden ? 'hidden' : 'visible',
|
|
@@ -12244,14 +12244,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12244
12244
|
}
|
|
12245
12245
|
catch (error) {
|
|
12246
12246
|
if (error instanceof QueueFullError) {
|
|
12247
|
-
logger$
|
|
12247
|
+
logger$18.warning('broadcast_channel_push_queue_full', {
|
|
12248
12248
|
channel: this.channelName,
|
|
12249
12249
|
inbox_capacity: this.inboxCapacity,
|
|
12250
12250
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
12251
12251
|
});
|
|
12252
12252
|
throw error;
|
|
12253
12253
|
}
|
|
12254
|
-
logger$
|
|
12254
|
+
logger$18.error('broadcast_channel_push_failed', {
|
|
12255
12255
|
channel: this.channelName,
|
|
12256
12256
|
error: error instanceof Error ? error.message : String(error),
|
|
12257
12257
|
});
|
|
@@ -12261,7 +12261,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12261
12261
|
async _transportSendBytes(data) {
|
|
12262
12262
|
ensureBroadcastEnvironment();
|
|
12263
12263
|
const targetNodeId = this.targetNodeId ?? '*';
|
|
12264
|
-
logger$
|
|
12264
|
+
logger$18.debug('broadcast_channel_message_sending', {
|
|
12265
12265
|
channel: this.channelName,
|
|
12266
12266
|
sender_id: this.connectorId,
|
|
12267
12267
|
sender_node_id: this.localNodeId,
|
|
@@ -12282,7 +12282,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12282
12282
|
return item;
|
|
12283
12283
|
}
|
|
12284
12284
|
async _transportClose(code, reason) {
|
|
12285
|
-
logger$
|
|
12285
|
+
logger$18.debug('broadcast_channel_transport_closing', {
|
|
12286
12286
|
channel: this.channelName,
|
|
12287
12287
|
connector_id: this.connectorId,
|
|
12288
12288
|
code,
|
|
@@ -12291,14 +12291,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12291
12291
|
timestamp: new Date().toISOString(),
|
|
12292
12292
|
});
|
|
12293
12293
|
if (this.listenerRegistered) {
|
|
12294
|
-
logger$
|
|
12294
|
+
logger$18.debug('broadcast_channel_removing_listener', {
|
|
12295
12295
|
channel: this.channelName,
|
|
12296
12296
|
connector_id: this.connectorId,
|
|
12297
12297
|
timestamp: new Date().toISOString(),
|
|
12298
12298
|
});
|
|
12299
12299
|
this.channel.removeEventListener('message', this.onMsg);
|
|
12300
12300
|
this.listenerRegistered = false;
|
|
12301
|
-
logger$
|
|
12301
|
+
logger$18.debug('broadcast_channel_listener_removed', {
|
|
12302
12302
|
channel: this.channelName,
|
|
12303
12303
|
connector_id: this.connectorId,
|
|
12304
12304
|
timestamp: new Date().toISOString(),
|
|
@@ -12311,13 +12311,13 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12311
12311
|
this.visibilityChangeListenerRegistered = false;
|
|
12312
12312
|
this.visibilityChangeHandler = undefined;
|
|
12313
12313
|
}
|
|
12314
|
-
logger$
|
|
12314
|
+
logger$18.debug('broadcast_channel_closing', {
|
|
12315
12315
|
channel: this.channelName,
|
|
12316
12316
|
connector_id: this.connectorId,
|
|
12317
12317
|
timestamp: new Date().toISOString(),
|
|
12318
12318
|
});
|
|
12319
12319
|
this.channel.close();
|
|
12320
|
-
logger$
|
|
12320
|
+
logger$18.debug('broadcast_channel_closed', {
|
|
12321
12321
|
channel: this.channelName,
|
|
12322
12322
|
connector_id: this.connectorId,
|
|
12323
12323
|
timestamp: new Date().toISOString(),
|
|
@@ -12341,7 +12341,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12341
12341
|
if (targetNodeId &&
|
|
12342
12342
|
targetNodeId !== '*' &&
|
|
12343
12343
|
targetNodeId !== this.localNodeId) {
|
|
12344
|
-
logger$
|
|
12344
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12345
12345
|
channel: this.channelName,
|
|
12346
12346
|
connector_id: this.connectorId,
|
|
12347
12347
|
reason: 'wildcard_target_mismatch',
|
|
@@ -12357,7 +12357,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12357
12357
|
if (expectedSender &&
|
|
12358
12358
|
expectedSender !== '*' &&
|
|
12359
12359
|
senderNodeId !== expectedSender) {
|
|
12360
|
-
logger$
|
|
12360
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12361
12361
|
channel: this.channelName,
|
|
12362
12362
|
connector_id: this.connectorId,
|
|
12363
12363
|
reason: 'unexpected_sender',
|
|
@@ -12370,7 +12370,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12370
12370
|
if (targetNodeId &&
|
|
12371
12371
|
targetNodeId !== '*' &&
|
|
12372
12372
|
targetNodeId !== this.localNodeId) {
|
|
12373
|
-
logger$
|
|
12373
|
+
logger$18.debug('broadcast_channel_message_rejected', {
|
|
12374
12374
|
channel: this.channelName,
|
|
12375
12375
|
connector_id: this.connectorId,
|
|
12376
12376
|
reason: 'unexpected_target',
|
|
@@ -12395,7 +12395,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12395
12395
|
return 'unknown';
|
|
12396
12396
|
}
|
|
12397
12397
|
logInboxSnapshot(event, extra = {}) {
|
|
12398
|
-
logger$
|
|
12398
|
+
logger$18.debug(event, {
|
|
12399
12399
|
channel: this.channelName,
|
|
12400
12400
|
connector_id: this.connectorId,
|
|
12401
12401
|
connector_state: this.state,
|
|
@@ -12411,7 +12411,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12411
12411
|
await super.start(inboundHandler);
|
|
12412
12412
|
// After transitioning to STARTED, check if tab is already hidden
|
|
12413
12413
|
if (typeof document !== 'undefined' && document.hidden) {
|
|
12414
|
-
logger$
|
|
12414
|
+
logger$18.debug('broadcast_channel_start_in_hidden_tab', {
|
|
12415
12415
|
channel: this.channelName,
|
|
12416
12416
|
connector_id: this.connectorId,
|
|
12417
12417
|
document_hidden: document.hidden,
|
|
@@ -12421,7 +12421,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12421
12421
|
});
|
|
12422
12422
|
// Immediately pause if tab is hidden at start time
|
|
12423
12423
|
await this.pause().catch((err) => {
|
|
12424
|
-
logger$
|
|
12424
|
+
logger$18.warning('broadcast_channel_initial_pause_failed', {
|
|
12425
12425
|
channel: this.channelName,
|
|
12426
12426
|
connector_id: this.connectorId,
|
|
12427
12427
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -12439,7 +12439,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12439
12439
|
return;
|
|
12440
12440
|
}
|
|
12441
12441
|
this.targetNodeId = normalized;
|
|
12442
|
-
logger$
|
|
12442
|
+
logger$18.debug('broadcast_channel_target_updated', {
|
|
12443
12443
|
channel: this.channelName,
|
|
12444
12444
|
connector_id: this.connectorId,
|
|
12445
12445
|
local_node_id: this.localNodeId,
|
|
@@ -12449,7 +12449,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
12449
12449
|
}
|
|
12450
12450
|
setWildcardTarget() {
|
|
12451
12451
|
this.targetNodeId = '*';
|
|
12452
|
-
logger$
|
|
12452
|
+
logger$18.debug('broadcast_channel_target_updated', {
|
|
12453
12453
|
channel: this.channelName,
|
|
12454
12454
|
connector_id: this.connectorId,
|
|
12455
12455
|
local_node_id: this.localNodeId,
|
|
@@ -12577,7 +12577,7 @@ function broadcastChannelGrantToConnectorConfig(grant) {
|
|
|
12577
12577
|
return config;
|
|
12578
12578
|
}
|
|
12579
12579
|
|
|
12580
|
-
const logger$
|
|
12580
|
+
const logger$17 = getLogger('naylence.fame.node.upstream_session_manager');
|
|
12581
12581
|
function isPlainRecord$4(value) {
|
|
12582
12582
|
if (typeof value !== 'object' || value === null) {
|
|
12583
12583
|
return false;
|
|
@@ -12698,7 +12698,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12698
12698
|
this.wrappedHandler = this.makeHeartbeatEnabledHandler(options.inboundHandler);
|
|
12699
12699
|
// Store the connection retry policy (can be null, in which case default behavior applies)
|
|
12700
12700
|
this.connectionRetryPolicy = options.retryPolicy ?? null;
|
|
12701
|
-
logger$
|
|
12701
|
+
logger$17.debug('created_upstream_session_manager', {
|
|
12702
12702
|
target_system_id: this.targetSystemId,
|
|
12703
12703
|
has_retry_policy: this.connectionRetryPolicy !== null,
|
|
12704
12704
|
});
|
|
@@ -12707,23 +12707,23 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12707
12707
|
return this.targetSystemId;
|
|
12708
12708
|
}
|
|
12709
12709
|
setupVisibilityListener() {
|
|
12710
|
-
logger$
|
|
12710
|
+
logger$17.debug('setup_visibility_listener_called', {
|
|
12711
12711
|
has_document: typeof document !== 'undefined',
|
|
12712
12712
|
});
|
|
12713
12713
|
if (typeof document !== 'undefined' && document.addEventListener) {
|
|
12714
12714
|
this._visibilityHandler = () => {
|
|
12715
|
-
logger$
|
|
12715
|
+
logger$17.debug('visibility_change_event_fired', {
|
|
12716
12716
|
state: document.visibilityState,
|
|
12717
12717
|
});
|
|
12718
12718
|
if (document.visibilityState === 'visible') {
|
|
12719
|
-
logger$
|
|
12719
|
+
logger$17.debug('visibility_change_detected_waking_up');
|
|
12720
12720
|
this.wakeEvent.set();
|
|
12721
12721
|
}
|
|
12722
12722
|
};
|
|
12723
12723
|
document.addEventListener('visibilitychange', this._visibilityHandler);
|
|
12724
12724
|
}
|
|
12725
12725
|
else {
|
|
12726
|
-
logger$
|
|
12726
|
+
logger$17.debug('setup_visibility_listener_skipped_no_document');
|
|
12727
12727
|
}
|
|
12728
12728
|
}
|
|
12729
12729
|
teardownVisibilityListener() {
|
|
@@ -12756,13 +12756,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12756
12756
|
}
|
|
12757
12757
|
throw new FameConnectError('Upstream session manager failed to attach');
|
|
12758
12758
|
}
|
|
12759
|
-
logger$
|
|
12759
|
+
logger$17.debug('upstream_session_manager_started');
|
|
12760
12760
|
}
|
|
12761
12761
|
getActiveConnector() {
|
|
12762
12762
|
return this.connector;
|
|
12763
12763
|
}
|
|
12764
12764
|
async stop() {
|
|
12765
|
-
logger$
|
|
12765
|
+
logger$17.debug('upstream_session_manager_stopping');
|
|
12766
12766
|
this.teardownVisibilityListener();
|
|
12767
12767
|
this.stopEvent.set();
|
|
12768
12768
|
this.currentStopSubtasks?.set();
|
|
@@ -12773,7 +12773,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12773
12773
|
}
|
|
12774
12774
|
catch (error) {
|
|
12775
12775
|
if (!(error instanceof TaskCancelledError)) {
|
|
12776
|
-
logger$
|
|
12776
|
+
logger$17.debug('fsm_task_stopped_with_error', {
|
|
12777
12777
|
error: error.message,
|
|
12778
12778
|
});
|
|
12779
12779
|
}
|
|
@@ -12782,13 +12782,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12782
12782
|
}
|
|
12783
12783
|
if (this.connector) {
|
|
12784
12784
|
await this.connector.stop().catch((error) => {
|
|
12785
|
-
logger$
|
|
12785
|
+
logger$17.debug('connector_stop_error', {
|
|
12786
12786
|
error: error.message,
|
|
12787
12787
|
});
|
|
12788
12788
|
});
|
|
12789
12789
|
this.connector = null;
|
|
12790
12790
|
}
|
|
12791
|
-
logger$
|
|
12791
|
+
logger$17.debug('upstream_session_manager_stopped');
|
|
12792
12792
|
}
|
|
12793
12793
|
async send(envelope) {
|
|
12794
12794
|
if (this.messageQueue.length >= UpstreamSessionManager.TX_QUEUE_MAX) {
|
|
@@ -12837,7 +12837,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12837
12837
|
const shouldFailFast = this.shouldFailFastOnError(error);
|
|
12838
12838
|
if (error instanceof FameTransportClose ||
|
|
12839
12839
|
error instanceof FameConnectError) {
|
|
12840
|
-
logger$
|
|
12840
|
+
logger$17.warning('upstream_link_closed', {
|
|
12841
12841
|
error: error.message,
|
|
12842
12842
|
will_retry: !shouldFailFast,
|
|
12843
12843
|
attempt: this.initialAttempts,
|
|
@@ -12850,13 +12850,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12850
12850
|
else {
|
|
12851
12851
|
const err = error;
|
|
12852
12852
|
if (err.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
12853
|
-
logger$
|
|
12853
|
+
logger$17.info('upstream_link_redirecting', {
|
|
12854
12854
|
error: err.message,
|
|
12855
12855
|
will_retry: true,
|
|
12856
12856
|
});
|
|
12857
12857
|
}
|
|
12858
12858
|
else {
|
|
12859
|
-
logger$
|
|
12859
|
+
logger$17.warning('upstream_link_closed', {
|
|
12860
12860
|
error: err.message,
|
|
12861
12861
|
will_retry: !shouldFailFast,
|
|
12862
12862
|
attempt: this.initialAttempts,
|
|
@@ -12900,7 +12900,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12900
12900
|
// If sleep was interrupted by visibility change (user returned to tab),
|
|
12901
12901
|
// reset backoff to initial delay for immediate retry with fresh backoff
|
|
12902
12902
|
if (wasWoken) {
|
|
12903
|
-
logger$
|
|
12903
|
+
logger$17.debug('backoff_reset_on_visibility_change', {
|
|
12904
12904
|
previous_delay: delay,
|
|
12905
12905
|
new_delay: UpstreamSessionManager.BACKOFF_INITIAL,
|
|
12906
12906
|
});
|
|
@@ -12919,7 +12919,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12919
12919
|
// Check if wake event is already set (e.g., visibility just changed)
|
|
12920
12920
|
if (this.wakeEvent.isSet()) {
|
|
12921
12921
|
this.wakeEvent.clear();
|
|
12922
|
-
logger$
|
|
12922
|
+
logger$17.debug('sleep_skipped_wake_event_pending');
|
|
12923
12923
|
return true;
|
|
12924
12924
|
}
|
|
12925
12925
|
let timeout;
|
|
@@ -12936,7 +12936,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12936
12936
|
]);
|
|
12937
12937
|
const wasWoken = this.wakeEvent.isSet();
|
|
12938
12938
|
if (wasWoken) {
|
|
12939
|
-
logger$
|
|
12939
|
+
logger$17.debug('sleep_interrupted_by_wake_event');
|
|
12940
12940
|
this.wakeEvent.clear();
|
|
12941
12941
|
}
|
|
12942
12942
|
if (timeout !== undefined) {
|
|
@@ -12999,7 +12999,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
12999
12999
|
await connector.start(this.wrappedHandler);
|
|
13000
13000
|
this.connector = connector;
|
|
13001
13001
|
const callbackGrants = this.node.gatherSupportedCallbackGrants();
|
|
13002
|
-
logger$
|
|
13002
|
+
logger$17.debug('callback_grants_before_augmentation', {
|
|
13003
13003
|
count: callbackGrants.length,
|
|
13004
13004
|
types: callbackGrants.map((g) => g.type),
|
|
13005
13005
|
});
|
|
@@ -13009,7 +13009,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13009
13009
|
const broadcastCallbackGrant = shouldAddBroadcastGrant
|
|
13010
13010
|
? this.createBroadcastCallbackGrant(grant)
|
|
13011
13011
|
: null;
|
|
13012
|
-
logger$
|
|
13012
|
+
logger$17.debug('broadcast_callback_grant_check', {
|
|
13013
13013
|
should_add: shouldAddBroadcastGrant,
|
|
13014
13014
|
grant_created: !!broadcastCallbackGrant,
|
|
13015
13015
|
});
|
|
@@ -13028,12 +13028,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13028
13028
|
const isDuplicate = callbackGrants.some((existing) => JSON.stringify(existing) === JSON.stringify(grant));
|
|
13029
13029
|
if (!isDuplicate) {
|
|
13030
13030
|
callbackGrants.push(grant);
|
|
13031
|
-
logger$
|
|
13031
|
+
logger$17.debug('added_connection_grant_as_callback', {
|
|
13032
13032
|
type: grant.type,
|
|
13033
13033
|
});
|
|
13034
13034
|
}
|
|
13035
13035
|
else {
|
|
13036
|
-
logger$
|
|
13036
|
+
logger$17.debug('skipped_duplicate_connection_grant', {
|
|
13037
13037
|
type: grant.type,
|
|
13038
13038
|
});
|
|
13039
13039
|
}
|
|
@@ -13045,12 +13045,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13045
13045
|
if (broadcastCallbackGrant &&
|
|
13046
13046
|
this.shouldAdvertiseBroadcastGrant(grant, callbackGrants)) {
|
|
13047
13047
|
callbackGrants.push(broadcastCallbackGrant);
|
|
13048
|
-
logger$
|
|
13048
|
+
logger$17.debug('added_broadcast_callback_grant');
|
|
13049
13049
|
}
|
|
13050
13050
|
else if (broadcastCallbackGrant) {
|
|
13051
|
-
logger$
|
|
13051
|
+
logger$17.debug('skipped_duplicate_broadcast_callback_grant');
|
|
13052
13052
|
}
|
|
13053
|
-
logger$
|
|
13053
|
+
logger$17.debug('callback_grants_after_augmentation', {
|
|
13054
13054
|
count: callbackGrants.length,
|
|
13055
13055
|
types: callbackGrants.map((g) => g.type),
|
|
13056
13056
|
});
|
|
@@ -13063,7 +13063,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13063
13063
|
targetAware.setTargetNodeId(this.targetSystemId);
|
|
13064
13064
|
}
|
|
13065
13065
|
catch (error) {
|
|
13066
|
-
logger$
|
|
13066
|
+
logger$17.warning('broadcast_channel_target_apply_failed', {
|
|
13067
13067
|
error: error instanceof Error ? error.message : String(error),
|
|
13068
13068
|
target_node_id: this.targetSystemId,
|
|
13069
13069
|
});
|
|
@@ -13085,14 +13085,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13085
13085
|
});
|
|
13086
13086
|
}
|
|
13087
13087
|
else {
|
|
13088
|
-
logger$
|
|
13088
|
+
logger$17.warning('parent_epoch_changed', { epoch });
|
|
13089
13089
|
}
|
|
13090
13090
|
}
|
|
13091
13091
|
if (!this.readyEvent.isSet()) {
|
|
13092
13092
|
this.readyEvent.set();
|
|
13093
13093
|
}
|
|
13094
13094
|
if (this.messageQueue.length > 0) {
|
|
13095
|
-
logger$
|
|
13095
|
+
logger$17.debug('flushing_buffered_frames', {
|
|
13096
13096
|
queue_size: this.messageQueue.length,
|
|
13097
13097
|
});
|
|
13098
13098
|
this.queueEvent.set();
|
|
@@ -13109,12 +13109,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13109
13109
|
name: `expiry-guard-${this.connectEpoch}`,
|
|
13110
13110
|
});
|
|
13111
13111
|
if (this.hadSuccessfulAttach) {
|
|
13112
|
-
logger$
|
|
13112
|
+
logger$17.debug('reconnected_to_upstream', {
|
|
13113
13113
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13114
13114
|
});
|
|
13115
13115
|
}
|
|
13116
13116
|
else {
|
|
13117
|
-
logger$
|
|
13117
|
+
logger$17.debug('connected_to_upstream', {
|
|
13118
13118
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
13119
13119
|
});
|
|
13120
13120
|
}
|
|
@@ -13132,18 +13132,18 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13132
13132
|
this.currentStopSubtasks = null;
|
|
13133
13133
|
await Promise.allSettled(tasks.map((task) => task.promise));
|
|
13134
13134
|
if (this.connector) {
|
|
13135
|
-
logger$
|
|
13135
|
+
logger$17.debug('upstream_stopping_old_connector', {
|
|
13136
13136
|
connect_epoch: this.connectEpoch,
|
|
13137
13137
|
target_system_id: this.targetSystemId,
|
|
13138
13138
|
timestamp: new Date().toISOString(),
|
|
13139
13139
|
});
|
|
13140
13140
|
await this.connector.stop().catch((err) => {
|
|
13141
|
-
logger$
|
|
13141
|
+
logger$17.warning('upstream_connector_stop_error', {
|
|
13142
13142
|
connect_epoch: this.connectEpoch,
|
|
13143
13143
|
error: err instanceof Error ? err.message : String(err),
|
|
13144
13144
|
});
|
|
13145
13145
|
});
|
|
13146
|
-
logger$
|
|
13146
|
+
logger$17.debug('upstream_old_connector_stopped', {
|
|
13147
13147
|
connect_epoch: this.connectEpoch,
|
|
13148
13148
|
target_system_id: this.targetSystemId,
|
|
13149
13149
|
timestamp: new Date().toISOString(),
|
|
@@ -13196,7 +13196,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13196
13196
|
});
|
|
13197
13197
|
}
|
|
13198
13198
|
catch (error) {
|
|
13199
|
-
logger$
|
|
13199
|
+
logger$17.debug('broadcast_callback_grant_generation_failed', {
|
|
13200
13200
|
error: error instanceof Error ? error.message : String(error),
|
|
13201
13201
|
});
|
|
13202
13202
|
return null;
|
|
@@ -13251,7 +13251,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13251
13251
|
}
|
|
13252
13252
|
}
|
|
13253
13253
|
async heartbeatLoop(connector, stopEvt, signal) {
|
|
13254
|
-
logger$
|
|
13254
|
+
logger$17.debug('starting_heartbeat_loop');
|
|
13255
13255
|
const intervalMs = UpstreamSessionManager.HEARTBEAT_INTERVAL * 1000;
|
|
13256
13256
|
const graceMs = intervalMs * UpstreamSessionManager.HEARTBEAT_GRACE;
|
|
13257
13257
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13287,7 +13287,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13287
13287
|
// Skip heartbeat if connector is paused (e.g., tab is hidden)
|
|
13288
13288
|
// Keep ack time current so we don't timeout immediately after resuming
|
|
13289
13289
|
if (currentState === ConnectorState.PAUSED) {
|
|
13290
|
-
logger$
|
|
13290
|
+
logger$17.debug('skipping_heartbeat_connector_paused', {
|
|
13291
13291
|
connector_state: currentState,
|
|
13292
13292
|
});
|
|
13293
13293
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -13296,14 +13296,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13296
13296
|
// Reset ack time if just resumed from pause (prevents immediate timeout)
|
|
13297
13297
|
if (previousState === ConnectorState.PAUSED &&
|
|
13298
13298
|
currentState === ConnectorState.STARTED) {
|
|
13299
|
-
logger$
|
|
13299
|
+
logger$17.debug('connector_just_resumed_resetting_ack_time', {
|
|
13300
13300
|
previous_state: previousState,
|
|
13301
13301
|
current_state: currentState,
|
|
13302
13302
|
});
|
|
13303
13303
|
this.lastHeartbeatAckTime = Date.now();
|
|
13304
13304
|
}
|
|
13305
13305
|
const envelope = await this.makeHeartbeatEnvelope();
|
|
13306
|
-
logger$
|
|
13306
|
+
logger$17.debug('sending_heartbeat', {
|
|
13307
13307
|
hb_corr_id: envelope.corrId,
|
|
13308
13308
|
hb_env_id: envelope.id,
|
|
13309
13309
|
});
|
|
@@ -13329,7 +13329,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13329
13329
|
throw new FameConnectError('missed heartbeat acknowledgement');
|
|
13330
13330
|
}
|
|
13331
13331
|
}
|
|
13332
|
-
logger$
|
|
13332
|
+
logger$17.debug('completed_heartbeat_loop');
|
|
13333
13333
|
}
|
|
13334
13334
|
async messagePumpLoop(connector, stopEvt, signal) {
|
|
13335
13335
|
while (!stopEvt.isSet() && !signal?.aborted) {
|
|
@@ -13346,19 +13346,19 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13346
13346
|
if (!envelope) {
|
|
13347
13347
|
continue;
|
|
13348
13348
|
}
|
|
13349
|
-
logger$
|
|
13349
|
+
logger$17.debug('upstream_pump_sending_envelope', {
|
|
13350
13350
|
envelopeId: envelope.id,
|
|
13351
13351
|
type: envelope.frame?.type,
|
|
13352
13352
|
});
|
|
13353
13353
|
try {
|
|
13354
13354
|
await connector.send(envelope);
|
|
13355
|
-
logger$
|
|
13355
|
+
logger$17.debug('upstream_pump_sent_envelope', {
|
|
13356
13356
|
envelopeId: envelope.id,
|
|
13357
13357
|
});
|
|
13358
13358
|
}
|
|
13359
13359
|
catch (error) {
|
|
13360
13360
|
if (error instanceof FameMessageTooLarge) {
|
|
13361
|
-
logger$
|
|
13361
|
+
logger$17.error('failed_to_send_message', { error: error.message });
|
|
13362
13362
|
await this.handleMessageTooLarge(envelope, error.message);
|
|
13363
13363
|
}
|
|
13364
13364
|
else if (error instanceof FameTransportClose) {
|
|
@@ -13420,7 +13420,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13420
13420
|
await fabric.send(ackEnvelope);
|
|
13421
13421
|
}
|
|
13422
13422
|
catch (error) {
|
|
13423
|
-
logger$
|
|
13423
|
+
logger$17.warning('failed_to_send_nack', {
|
|
13424
13424
|
error: error.message,
|
|
13425
13425
|
});
|
|
13426
13426
|
}
|
|
@@ -13434,7 +13434,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13434
13434
|
timestamps.push(info.attachExpiresAt);
|
|
13435
13435
|
}
|
|
13436
13436
|
if (!timestamps.length) {
|
|
13437
|
-
logger$
|
|
13437
|
+
logger$17.debug('no_ttl_expiry_configured');
|
|
13438
13438
|
await this.waitEvent(stopEvt, signal);
|
|
13439
13439
|
return;
|
|
13440
13440
|
}
|
|
@@ -13443,7 +13443,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13443
13443
|
let delaySeconds = (earliest.getTime() - now.getTime()) / 1000 -
|
|
13444
13444
|
UpstreamSessionManager.JWT_REFRESH_SAFETY;
|
|
13445
13445
|
delaySeconds = Math.max(delaySeconds, UpstreamSessionManager.JWT_REFRESH_SAFETY);
|
|
13446
|
-
logger$
|
|
13446
|
+
logger$17.debug('ttl_expiry_guard_started', {
|
|
13447
13447
|
welcome_expires_at: welcome.frame.expiresAt ?? null,
|
|
13448
13448
|
attach_expires_at: info.attachExpiresAt?.toISOString?.() ?? null,
|
|
13449
13449
|
earliest_expiry: earliest.toISOString(),
|
|
@@ -13471,7 +13471,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13471
13471
|
}
|
|
13472
13472
|
}
|
|
13473
13473
|
if (!stopEvt.isSet()) {
|
|
13474
|
-
logger$
|
|
13474
|
+
logger$17.debug('ttl_expiry_triggered_reconnect', {
|
|
13475
13475
|
expires_at: earliest.toISOString(),
|
|
13476
13476
|
current_time: new Date().toISOString(),
|
|
13477
13477
|
seconds_before_expiry: UpstreamSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -13516,7 +13516,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13516
13516
|
}
|
|
13517
13517
|
await this.node.dispatchEnvelopeEvent('onEnvelopeReceived', this.node, env, context);
|
|
13518
13518
|
if (env.frame.type === 'NodeHeartbeatAck') {
|
|
13519
|
-
logger$
|
|
13519
|
+
logger$17.debug('received_heartbeat_ack', {
|
|
13520
13520
|
hb_ack_env_id: env.id,
|
|
13521
13521
|
hb_ack_corr_id: env.corrId,
|
|
13522
13522
|
hb_routing_epoch: env.frame.routingEpoch,
|
|
@@ -13530,7 +13530,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
13530
13530
|
await this.onEpochChange(epoch);
|
|
13531
13531
|
}
|
|
13532
13532
|
else {
|
|
13533
|
-
logger$
|
|
13533
|
+
logger$17.warning('parent_epoch_changed', { epoch });
|
|
13534
13534
|
}
|
|
13535
13535
|
}
|
|
13536
13536
|
return;
|
|
@@ -13549,7 +13549,7 @@ UpstreamSessionManager.TX_QUEUE_MAX = 512;
|
|
|
13549
13549
|
UpstreamSessionManager.BACKOFF_INITIAL = 1; // seconds
|
|
13550
13550
|
UpstreamSessionManager.BACKOFF_CAP = 30; // seconds
|
|
13551
13551
|
|
|
13552
|
-
const logger$
|
|
13552
|
+
const logger$16 = getLogger('naylence.fame.node.admission.noop_admission_client');
|
|
13553
13553
|
class NoopAdmissionClient {
|
|
13554
13554
|
constructor(options = {}) {
|
|
13555
13555
|
this.hasUpstream = false;
|
|
@@ -13563,7 +13563,7 @@ class NoopAdmissionClient {
|
|
|
13563
13563
|
const acceptedLogicals = this.autoAcceptLogicals
|
|
13564
13564
|
? [...(requestedLogicals ?? [])]
|
|
13565
13565
|
: [];
|
|
13566
|
-
logger$
|
|
13566
|
+
logger$16.debug('noop_admission_hello', {
|
|
13567
13567
|
systemId: effectiveSystemId,
|
|
13568
13568
|
instanceId,
|
|
13569
13569
|
requestedLogicals,
|
|
@@ -13581,7 +13581,7 @@ class NoopAdmissionClient {
|
|
|
13581
13581
|
});
|
|
13582
13582
|
}
|
|
13583
13583
|
async close() {
|
|
13584
|
-
logger$
|
|
13584
|
+
logger$16.debug('noop_admission_close');
|
|
13585
13585
|
}
|
|
13586
13586
|
}
|
|
13587
13587
|
|
|
@@ -13787,7 +13787,7 @@ class DefaultServiceManager {
|
|
|
13787
13787
|
}
|
|
13788
13788
|
|
|
13789
13789
|
const SYSTEM_INBOX$1 = '__sys__';
|
|
13790
|
-
const logger$
|
|
13790
|
+
const logger$15 = getLogger('naylence.fame.node.node');
|
|
13791
13791
|
function isSnakeCase(name) {
|
|
13792
13792
|
return name.includes('_');
|
|
13793
13793
|
}
|
|
@@ -14057,7 +14057,7 @@ class FameNode extends TaskSpawner {
|
|
|
14057
14057
|
confirmIdentity(systemId, source) {
|
|
14058
14058
|
if (this._confirmedId) {
|
|
14059
14059
|
if (this._confirmedId !== systemId) {
|
|
14060
|
-
logger$
|
|
14060
|
+
logger$15.error('node_identity_mismatch', {
|
|
14061
14061
|
current_id: this._confirmedId,
|
|
14062
14062
|
new_id: systemId,
|
|
14063
14063
|
source,
|
|
@@ -14069,14 +14069,14 @@ class FameNode extends TaskSpawner {
|
|
|
14069
14069
|
const isReassignment = this._provisionalId !== systemId;
|
|
14070
14070
|
this._confirmedId = systemId;
|
|
14071
14071
|
if (isReassignment) {
|
|
14072
|
-
logger$
|
|
14072
|
+
logger$15.debug('node_identity_reassigned', {
|
|
14073
14073
|
system_id: systemId,
|
|
14074
14074
|
previous_id: this._provisionalId,
|
|
14075
14075
|
source,
|
|
14076
14076
|
});
|
|
14077
14077
|
}
|
|
14078
14078
|
else {
|
|
14079
|
-
logger$
|
|
14079
|
+
logger$15.debug('node_identity_confirmed', {
|
|
14080
14080
|
system_id: systemId,
|
|
14081
14081
|
source,
|
|
14082
14082
|
});
|
|
@@ -14144,7 +14144,7 @@ class FameNode extends TaskSpawner {
|
|
|
14144
14144
|
return;
|
|
14145
14145
|
}
|
|
14146
14146
|
if (frameType === 'NodeHeartbeat') {
|
|
14147
|
-
logger$
|
|
14147
|
+
logger$15.debug('received_heartbeat_frame', {
|
|
14148
14148
|
envelopeId: envelope.id,
|
|
14149
14149
|
corrId: envelope.corrId ?? null,
|
|
14150
14150
|
});
|
|
@@ -14156,7 +14156,7 @@ class FameNode extends TaskSpawner {
|
|
|
14156
14156
|
await this.handleDeliveryAck(envelope, context);
|
|
14157
14157
|
return;
|
|
14158
14158
|
}
|
|
14159
|
-
logger$
|
|
14159
|
+
logger$15.debug('unhandled_system_frame', {
|
|
14160
14160
|
envelopeId: envelope.id,
|
|
14161
14161
|
frameType,
|
|
14162
14162
|
});
|
|
@@ -14168,13 +14168,13 @@ class FameNode extends TaskSpawner {
|
|
|
14168
14168
|
}
|
|
14169
14169
|
await this._deliveryTracker.onEnvelopeDelivered(SYSTEM_INBOX$1, envelope, context);
|
|
14170
14170
|
if (frame.ok !== false) {
|
|
14171
|
-
logger$
|
|
14171
|
+
logger$15.debug('delivery_ack_received', {
|
|
14172
14172
|
envelopeId: envelope.id,
|
|
14173
14173
|
corrId: envelope.corrId ?? null,
|
|
14174
14174
|
});
|
|
14175
14175
|
return;
|
|
14176
14176
|
}
|
|
14177
|
-
logger$
|
|
14177
|
+
logger$15.warning('delivery_nack_received', {
|
|
14178
14178
|
envelopeId: envelope.id,
|
|
14179
14179
|
corrId: envelope.corrId ?? null,
|
|
14180
14180
|
code: frame.code ?? null,
|
|
@@ -14184,7 +14184,7 @@ class FameNode extends TaskSpawner {
|
|
|
14184
14184
|
await this.onDeliveryNack(frame, envelope, context);
|
|
14185
14185
|
}
|
|
14186
14186
|
async onDeliveryNack(frame, envelope, _context) {
|
|
14187
|
-
logger$
|
|
14187
|
+
logger$15.debug('delivery_nack_processed', {
|
|
14188
14188
|
envelopeId: envelope.id,
|
|
14189
14189
|
code: frame.code ?? null,
|
|
14190
14190
|
reason: frame.reason ?? null,
|
|
@@ -14299,7 +14299,7 @@ class FameNode extends TaskSpawner {
|
|
|
14299
14299
|
await this._bindingManager.restore();
|
|
14300
14300
|
await this._envelopeListenerManager.start();
|
|
14301
14301
|
this._isStarted = true;
|
|
14302
|
-
logger$
|
|
14302
|
+
logger$15.debug('node_started', {
|
|
14303
14303
|
node_id: this.id,
|
|
14304
14304
|
sid: this.sid,
|
|
14305
14305
|
path: this.physicalPath,
|
|
@@ -14331,7 +14331,7 @@ class FameNode extends TaskSpawner {
|
|
|
14331
14331
|
await this._serviceManager.stop();
|
|
14332
14332
|
await this.dispatchEvent('onNodeStopped', this);
|
|
14333
14333
|
this._isStarted = false;
|
|
14334
|
-
logger$
|
|
14334
|
+
logger$15.debug('node_stopped', {
|
|
14335
14335
|
node_id: this.id,
|
|
14336
14336
|
});
|
|
14337
14337
|
}
|
|
@@ -14521,20 +14521,20 @@ class FameNode extends TaskSpawner {
|
|
|
14521
14521
|
await this.forwardUpstream(processedEnvelope, context);
|
|
14522
14522
|
}
|
|
14523
14523
|
else {
|
|
14524
|
-
logger$
|
|
14524
|
+
logger$15.error('attempted_upstream_loop', {
|
|
14525
14525
|
envelopeId: processedEnvelope.id,
|
|
14526
14526
|
});
|
|
14527
14527
|
}
|
|
14528
14528
|
return;
|
|
14529
14529
|
}
|
|
14530
14530
|
if (!processedEnvelope.to) {
|
|
14531
|
-
logger$
|
|
14531
|
+
logger$15.error('dropping_envelope_without_destination', {
|
|
14532
14532
|
envelopeId: processedEnvelope.id,
|
|
14533
14533
|
capabilities: processedEnvelope.capabilities ?? [],
|
|
14534
14534
|
});
|
|
14535
14535
|
return;
|
|
14536
14536
|
}
|
|
14537
|
-
logger$
|
|
14537
|
+
logger$15.warning('no_local_handler_for_address', {
|
|
14538
14538
|
address: processedEnvelope.to.toString?.() ?? String(processedEnvelope.to),
|
|
14539
14539
|
originType: context?.originType ?? null,
|
|
14540
14540
|
});
|
|
@@ -14658,7 +14658,7 @@ class FameNode extends TaskSpawner {
|
|
|
14658
14658
|
}
|
|
14659
14659
|
}
|
|
14660
14660
|
catch (error) {
|
|
14661
|
-
logger$
|
|
14661
|
+
logger$15.warning('callback_grant_collection_failed', {
|
|
14662
14662
|
error: error instanceof Error ? error.message : String(error),
|
|
14663
14663
|
});
|
|
14664
14664
|
}
|
|
@@ -14721,7 +14721,7 @@ class FameNode extends TaskSpawner {
|
|
|
14721
14721
|
await store.set('self', record);
|
|
14722
14722
|
}
|
|
14723
14723
|
catch (error) {
|
|
14724
|
-
logger$
|
|
14724
|
+
logger$15.warning('node_meta_persist_failed', {
|
|
14725
14725
|
error: error instanceof Error ? error.message : String(error),
|
|
14726
14726
|
});
|
|
14727
14727
|
}
|
|
@@ -14859,44 +14859,12 @@ class ConnectionRetryPolicyFactory extends AbstractResourceFactory {
|
|
|
14859
14859
|
}
|
|
14860
14860
|
}
|
|
14861
14861
|
|
|
14862
|
-
|
|
14863
|
-
|
|
14864
|
-
|
|
14865
|
-
|
|
14866
|
-
|
|
14867
|
-
|
|
14868
|
-
throw new Error('Failed to create token provider from configuration');
|
|
14869
|
-
}
|
|
14870
|
-
return provider;
|
|
14871
|
-
}
|
|
14872
|
-
let provider = null;
|
|
14873
|
-
try {
|
|
14874
|
-
provider = await createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
14875
|
-
}
|
|
14876
|
-
catch (error) {
|
|
14877
|
-
const message = 'Failed to create default token provider' +
|
|
14878
|
-
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
14879
|
-
throw new Error(message);
|
|
14880
|
-
}
|
|
14881
|
-
if (!provider) {
|
|
14882
|
-
throw new Error('Failed to create default token provider');
|
|
14883
|
-
}
|
|
14884
|
-
return provider;
|
|
14885
|
-
}
|
|
14886
|
-
}
|
|
14887
|
-
|
|
14888
|
-
function isTokenProvider(candidate) {
|
|
14889
|
-
return (typeof candidate === 'object' &&
|
|
14890
|
-
candidate !== null &&
|
|
14891
|
-
typeof candidate.getToken === 'function');
|
|
14892
|
-
}
|
|
14893
|
-
function isIdentityExposingTokenProvider(candidate) {
|
|
14894
|
-
return (isTokenProvider(candidate) &&
|
|
14895
|
-
typeof candidate.getIdentity ===
|
|
14896
|
-
'function');
|
|
14897
|
-
}
|
|
14898
|
-
|
|
14899
|
-
const logger$15 = getLogger('naylence.fame.node.default_node_identity_policy');
|
|
14862
|
+
/**
|
|
14863
|
+
* Default node identity policy that preserves the current node ID.
|
|
14864
|
+
*
|
|
14865
|
+
* This policy does NOT derive identity from tokens or grants.
|
|
14866
|
+
* For token-subject-based identity, use TokenSubjectNodeIdentityPolicy.
|
|
14867
|
+
*/
|
|
14900
14868
|
class DefaultNodeIdentityPolicy {
|
|
14901
14869
|
async resolveInitialNodeId(context) {
|
|
14902
14870
|
if (context.configuredId) {
|
|
@@ -14908,44 +14876,10 @@ class DefaultNodeIdentityPolicy {
|
|
|
14908
14876
|
return await generateIdAsync({ mode: 'fingerprint' });
|
|
14909
14877
|
}
|
|
14910
14878
|
async resolveAdmissionNodeId(context) {
|
|
14911
|
-
|
|
14912
|
-
|
|
14913
|
-
for (const grant of context.grants) {
|
|
14914
|
-
try {
|
|
14915
|
-
const auth = grant.auth;
|
|
14916
|
-
if (!auth) {
|
|
14917
|
-
continue;
|
|
14918
|
-
}
|
|
14919
|
-
const tokenProviderConfig = (auth.tokenProvider ??
|
|
14920
|
-
auth.token_provider);
|
|
14921
|
-
if (!tokenProviderConfig ||
|
|
14922
|
-
typeof tokenProviderConfig.type !== 'string') {
|
|
14923
|
-
continue;
|
|
14924
|
-
}
|
|
14925
|
-
const provider = await TokenProviderFactory.createTokenProvider(tokenProviderConfig);
|
|
14926
|
-
if (isIdentityExposingTokenProvider(provider)) {
|
|
14927
|
-
const identity = await provider.getIdentity();
|
|
14928
|
-
if (identity && identity.subject) {
|
|
14929
|
-
logger$15.debug('identity_extracted_from_grant', {
|
|
14930
|
-
identity_id: identity.subject,
|
|
14931
|
-
grant_type: grant.type,
|
|
14932
|
-
});
|
|
14933
|
-
return identity.subject;
|
|
14934
|
-
}
|
|
14935
|
-
}
|
|
14936
|
-
}
|
|
14937
|
-
catch (error) {
|
|
14938
|
-
logger$15.warning('identity_extraction_failed', {
|
|
14939
|
-
error: error instanceof Error ? error.message : String(error),
|
|
14940
|
-
grant_type: grant.type,
|
|
14941
|
-
});
|
|
14942
|
-
}
|
|
14943
|
-
}
|
|
14944
|
-
}
|
|
14945
|
-
if (!context.currentNodeId) {
|
|
14946
|
-
return await generateIdAsync({ mode: 'fingerprint' });
|
|
14879
|
+
if (context.currentNodeId) {
|
|
14880
|
+
return context.currentNodeId;
|
|
14947
14881
|
}
|
|
14948
|
-
return
|
|
14882
|
+
return await generateIdAsync({ mode: 'fingerprint' });
|
|
14949
14883
|
}
|
|
14950
14884
|
}
|
|
14951
14885
|
|
|
@@ -17717,6 +17651,43 @@ var defaultNodeIdentityPolicyFactory = /*#__PURE__*/Object.freeze({
|
|
|
17717
17651
|
default: DefaultNodeIdentityPolicyFactory
|
|
17718
17652
|
});
|
|
17719
17653
|
|
|
17654
|
+
const TOKEN_PROVIDER_FACTORY_BASE_TYPE = 'TokenProviderFactory';
|
|
17655
|
+
class TokenProviderFactory extends AbstractResourceFactory {
|
|
17656
|
+
static async createTokenProvider(config, options = {}) {
|
|
17657
|
+
if (config) {
|
|
17658
|
+
const provider = await createResource$1(TOKEN_PROVIDER_FACTORY_BASE_TYPE, config, options);
|
|
17659
|
+
if (!provider) {
|
|
17660
|
+
throw new Error('Failed to create token provider from configuration');
|
|
17661
|
+
}
|
|
17662
|
+
return provider;
|
|
17663
|
+
}
|
|
17664
|
+
let provider = null;
|
|
17665
|
+
try {
|
|
17666
|
+
provider = await createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
17667
|
+
}
|
|
17668
|
+
catch (error) {
|
|
17669
|
+
const message = 'Failed to create default token provider' +
|
|
17670
|
+
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
17671
|
+
throw new Error(message);
|
|
17672
|
+
}
|
|
17673
|
+
if (!provider) {
|
|
17674
|
+
throw new Error('Failed to create default token provider');
|
|
17675
|
+
}
|
|
17676
|
+
return provider;
|
|
17677
|
+
}
|
|
17678
|
+
}
|
|
17679
|
+
|
|
17680
|
+
function isTokenProvider(candidate) {
|
|
17681
|
+
return (typeof candidate === 'object' &&
|
|
17682
|
+
candidate !== null &&
|
|
17683
|
+
typeof candidate.getToken === 'function');
|
|
17684
|
+
}
|
|
17685
|
+
function isIdentityExposingTokenProvider(candidate) {
|
|
17686
|
+
return (isTokenProvider(candidate) &&
|
|
17687
|
+
typeof candidate.getIdentity ===
|
|
17688
|
+
'function');
|
|
17689
|
+
}
|
|
17690
|
+
|
|
17720
17691
|
const logger$10 = getLogger('naylence.fame.node.token_subject_node_identity_policy');
|
|
17721
17692
|
class TokenSubjectNodeIdentityPolicy {
|
|
17722
17693
|
async resolveInitialNodeId(context) {
|