@naylence/runtime 0.3.21 → 0.3.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +367 -396
- package/dist/browser/index.mjs +367 -396
- package/dist/cjs/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/cjs/version.js +2 -2
- package/dist/esm/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/esm/version.js +2 -2
- package/dist/node/index.cjs +367 -396
- package/dist/node/index.mjs +367 -396
- package/dist/node/node.cjs +389 -418
- package/dist/node/node.mjs +389 -418
- package/dist/types/naylence/fame/node/default-node-identity-policy.d.ts +6 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/browser/index.cjs
CHANGED
|
@@ -515,12 +515,12 @@ async function ensureRuntimeFactoriesRegistered(registry = factory.Registry) {
|
|
|
515
515
|
}
|
|
516
516
|
|
|
517
517
|
// This file is auto-generated during build - do not edit manually
|
|
518
|
-
// Generated from package.json version: 0.3.
|
|
518
|
+
// Generated from package.json version: 0.3.22
|
|
519
519
|
/**
|
|
520
520
|
* The package version, injected at build time.
|
|
521
521
|
* @internal
|
|
522
522
|
*/
|
|
523
|
-
const VERSION = '0.3.
|
|
523
|
+
const VERSION = '0.3.22';
|
|
524
524
|
|
|
525
525
|
let initialized = false;
|
|
526
526
|
const runtimePlugin = {
|
|
@@ -1365,7 +1365,7 @@ class TaskCancelledError extends Error {
|
|
|
1365
1365
|
* Provides functionality similar to Python's asyncio TaskSpawner with proper
|
|
1366
1366
|
* error handling, cancellation, and graceful shutdown capabilities.
|
|
1367
1367
|
*/
|
|
1368
|
-
const logger$
|
|
1368
|
+
const logger$1g = getLogger('naylence.fame.util.task_spawner');
|
|
1369
1369
|
function firstDefined(source, keys) {
|
|
1370
1370
|
for (const key of keys) {
|
|
1371
1371
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
@@ -1526,7 +1526,7 @@ class TaskSpawner {
|
|
|
1526
1526
|
const taskId = `task-${++this._taskCounter}`;
|
|
1527
1527
|
const taskName = normalizedOptions.name || `unnamed-${taskId}`;
|
|
1528
1528
|
const timeout = normalizedOptions.timeout ?? this._config.defaultTimeout;
|
|
1529
|
-
logger$
|
|
1529
|
+
logger$1g.debug('starting_background_task', {
|
|
1530
1530
|
task_name: taskName,
|
|
1531
1531
|
task_id: taskId,
|
|
1532
1532
|
});
|
|
@@ -1543,7 +1543,7 @@ class TaskSpawner {
|
|
|
1543
1543
|
task.promise
|
|
1544
1544
|
.then(() => {
|
|
1545
1545
|
if (!this._suppressCompletionLogging) {
|
|
1546
|
-
logger$
|
|
1546
|
+
logger$1g.debug('task_completed_successfully', {
|
|
1547
1547
|
task_name: taskName,
|
|
1548
1548
|
task_id: taskId,
|
|
1549
1549
|
duration_ms: Date.now() - task.startTime,
|
|
@@ -1597,7 +1597,7 @@ class TaskSpawner {
|
|
|
1597
1597
|
error.name === 'AbortError' ||
|
|
1598
1598
|
error.message === 'Task cancelled' ||
|
|
1599
1599
|
error.message === 'Aborted') {
|
|
1600
|
-
logger$
|
|
1600
|
+
logger$1g.debug('task_cancelled', {
|
|
1601
1601
|
task_name: taskName,
|
|
1602
1602
|
note: 'Task cancelled as requested',
|
|
1603
1603
|
});
|
|
@@ -1605,7 +1605,7 @@ class TaskSpawner {
|
|
|
1605
1605
|
}
|
|
1606
1606
|
// Handle timeout
|
|
1607
1607
|
if (error instanceof TaskTimeoutError) {
|
|
1608
|
-
logger$
|
|
1608
|
+
logger$1g.warning('task_timed_out', {
|
|
1609
1609
|
task_name: taskName,
|
|
1610
1610
|
error: error.message,
|
|
1611
1611
|
});
|
|
@@ -1617,7 +1617,7 @@ class TaskSpawner {
|
|
|
1617
1617
|
// Handle known WebSocket shutdown race condition (similar to Python version)
|
|
1618
1618
|
if (error.message.includes("await wasn't used with future") ||
|
|
1619
1619
|
error.message.includes('WebSocket closed during receive')) {
|
|
1620
|
-
logger$
|
|
1620
|
+
logger$1g.debug('task_shutdown_race_condition_handled', {
|
|
1621
1621
|
task_name: taskName,
|
|
1622
1622
|
note: 'Normal WebSocket close timing during shutdown - not an error',
|
|
1623
1623
|
});
|
|
@@ -1627,7 +1627,7 @@ class TaskSpawner {
|
|
|
1627
1627
|
if (error.name === 'FameTransportClose' ||
|
|
1628
1628
|
error.message.includes('normal closure') ||
|
|
1629
1629
|
error.message.includes('Connection closed')) {
|
|
1630
|
-
logger$
|
|
1630
|
+
logger$1g.debug('task_shutdown_completed_normally', {
|
|
1631
1631
|
task_name: taskName,
|
|
1632
1632
|
note: 'Task closed normally during shutdown',
|
|
1633
1633
|
});
|
|
@@ -1635,7 +1635,7 @@ class TaskSpawner {
|
|
|
1635
1635
|
}
|
|
1636
1636
|
// Handle PKCE redirect "errors" as info
|
|
1637
1637
|
if (error.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
1638
|
-
logger$
|
|
1638
|
+
logger$1g.debug('background_task_redirecting', {
|
|
1639
1639
|
task_name: taskName,
|
|
1640
1640
|
note: 'Task interrupted for PKCE redirect',
|
|
1641
1641
|
});
|
|
@@ -1648,14 +1648,14 @@ class TaskSpawner {
|
|
|
1648
1648
|
// Log retriable errors as warnings (they'll be retried by upstream logic)
|
|
1649
1649
|
// Log non-retriable errors as errors (fatal failures)
|
|
1650
1650
|
if (isRetriableError) {
|
|
1651
|
-
logger$
|
|
1651
|
+
logger$1g.warning('background_task_failed', {
|
|
1652
1652
|
task_name: taskName,
|
|
1653
1653
|
error: error.message,
|
|
1654
1654
|
retriable: true,
|
|
1655
1655
|
});
|
|
1656
1656
|
}
|
|
1657
1657
|
else {
|
|
1658
|
-
logger$
|
|
1658
|
+
logger$1g.error('background_task_failed', {
|
|
1659
1659
|
task_name: taskName,
|
|
1660
1660
|
error: error.message,
|
|
1661
1661
|
stack: error.stack,
|
|
@@ -1674,11 +1674,11 @@ class TaskSpawner {
|
|
|
1674
1674
|
async shutdownTasks(options = {}) {
|
|
1675
1675
|
const { gracePeriod, cancelHanging, joinTimeout } = normalizeShutdownOptions(options);
|
|
1676
1676
|
if (this._tasks.size === 0) {
|
|
1677
|
-
logger$
|
|
1677
|
+
logger$1g.debug('shutdown_tasks_no_tasks_to_shutdown');
|
|
1678
1678
|
return;
|
|
1679
1679
|
}
|
|
1680
1680
|
this._suppressCompletionLogging = true;
|
|
1681
|
-
logger$
|
|
1681
|
+
logger$1g.debug('shutting_down_tasks', {
|
|
1682
1682
|
task_count: this._tasks.size,
|
|
1683
1683
|
task_names: Array.from(this._tasks.values()).map((t) => t.name),
|
|
1684
1684
|
grace_period_ms: gracePeriod,
|
|
@@ -1693,7 +1693,7 @@ class TaskSpawner {
|
|
|
1693
1693
|
if (cancelHanging) {
|
|
1694
1694
|
const stillRunning = tasks.filter((task) => task.getState() === TaskState.RUNNING && !completed.has(task));
|
|
1695
1695
|
if (stillRunning.length > 0) {
|
|
1696
|
-
logger$
|
|
1696
|
+
logger$1g.debug('tasks_did_not_complete_within_grace_period', {
|
|
1697
1697
|
hanging_count: stillRunning.length,
|
|
1698
1698
|
});
|
|
1699
1699
|
// Wait for them to finish with individual timeouts
|
|
@@ -1703,7 +1703,7 @@ class TaskSpawner {
|
|
|
1703
1703
|
}
|
|
1704
1704
|
catch (error) {
|
|
1705
1705
|
if (error instanceof TaskTimeoutError) {
|
|
1706
|
-
logger$
|
|
1706
|
+
logger$1g.warning('task_did_not_shutdown', {
|
|
1707
1707
|
task_name: task.name || task.id,
|
|
1708
1708
|
join_timeout_ms: joinTimeout,
|
|
1709
1709
|
});
|
|
@@ -1714,7 +1714,7 @@ class TaskSpawner {
|
|
|
1714
1714
|
}
|
|
1715
1715
|
else if (!(error instanceof TaskCancelledError)) {
|
|
1716
1716
|
/* istanbul ignore next - unreachable defensive branch */
|
|
1717
|
-
logger$
|
|
1717
|
+
logger$1g.error('task_raised_during_cancellation', {
|
|
1718
1718
|
task_name: task.name || task.id,
|
|
1719
1719
|
error: error instanceof Error ? error.message : String(error),
|
|
1720
1720
|
});
|
|
@@ -2851,7 +2851,7 @@ async function safeImport(loader, dependencyNameOrOptions, maybeOptions) {
|
|
|
2851
2851
|
* condition/promise and ensure at most one notifier coroutine exists for a
|
|
2852
2852
|
* flow at any time.
|
|
2853
2853
|
*/
|
|
2854
|
-
const logger$
|
|
2854
|
+
const logger$1f = getLogger('naylence.fame.flow.flow_controller');
|
|
2855
2855
|
/**
|
|
2856
2856
|
* Simple condition variable implementation for TypeScript/Node.js
|
|
2857
2857
|
* Similar to Python's asyncio.Condition
|
|
@@ -2985,7 +2985,7 @@ class FlowController {
|
|
|
2985
2985
|
const newBalance = Math.max(0, Math.min(this.initialWindow, prev + delta));
|
|
2986
2986
|
this.credits.set(flowId, newBalance);
|
|
2987
2987
|
const crossedZero = prev <= 0 && newBalance > 0;
|
|
2988
|
-
logger$
|
|
2988
|
+
logger$1f.debug('flow_controller_add_credits', {
|
|
2989
2989
|
flow_id: flowId,
|
|
2990
2990
|
delta,
|
|
2991
2991
|
prev_balance: prev,
|
|
@@ -3005,12 +3005,12 @@ class FlowController {
|
|
|
3005
3005
|
async acquire(flowId) {
|
|
3006
3006
|
this.ensureFlow(flowId);
|
|
3007
3007
|
const condition = this.conditions.get(flowId);
|
|
3008
|
-
logger$
|
|
3008
|
+
logger$1f.debug('flow_controller_acquire_attempt', {
|
|
3009
3009
|
flow_id: flowId,
|
|
3010
3010
|
current_balance: this.credits.get(flowId),
|
|
3011
3011
|
});
|
|
3012
3012
|
while (this.credits.get(flowId) <= 0) {
|
|
3013
|
-
logger$
|
|
3013
|
+
logger$1f.debug('flow_controller_waiting_for_credits', {
|
|
3014
3014
|
flow_id: flowId,
|
|
3015
3015
|
current_balance: this.credits.get(flowId),
|
|
3016
3016
|
});
|
|
@@ -3018,12 +3018,12 @@ class FlowController {
|
|
|
3018
3018
|
}
|
|
3019
3019
|
const newBalance = this.credits.get(flowId) - 1;
|
|
3020
3020
|
this.credits.set(flowId, newBalance);
|
|
3021
|
-
logger$
|
|
3021
|
+
logger$1f.debug('flow_controller_acquire_success', {
|
|
3022
3022
|
flow_id: flowId,
|
|
3023
3023
|
new_balance: newBalance,
|
|
3024
3024
|
});
|
|
3025
3025
|
if (newBalance <= this.lowWatermark) {
|
|
3026
|
-
logger$
|
|
3026
|
+
logger$1f.debug('flow_controller_acquire_below_low_watermark', {
|
|
3027
3027
|
flow_id: flowId,
|
|
3028
3028
|
low_watermark: this.lowWatermark,
|
|
3029
3029
|
});
|
|
@@ -3047,7 +3047,7 @@ class FlowController {
|
|
|
3047
3047
|
const current = this.credits.get(flowId);
|
|
3048
3048
|
const remaining = Math.max(current - credits, 0);
|
|
3049
3049
|
this.credits.set(flowId, remaining);
|
|
3050
|
-
logger$
|
|
3050
|
+
logger$1f.debug('flow_controller_consume', {
|
|
3051
3051
|
flow_id: flowId,
|
|
3052
3052
|
requested: credits,
|
|
3053
3053
|
prev_balance: current,
|
|
@@ -3073,7 +3073,7 @@ class FlowController {
|
|
|
3073
3073
|
this.windowIds.delete(flowId);
|
|
3074
3074
|
this.credits.set(flowId, this.initialWindow);
|
|
3075
3075
|
this.wakeWaiters(flowId);
|
|
3076
|
-
logger$
|
|
3076
|
+
logger$1f.debug('flow_controller_flow_reset', {
|
|
3077
3077
|
flow_id: flowId,
|
|
3078
3078
|
reset_balance: this.initialWindow,
|
|
3079
3079
|
});
|
|
@@ -3361,7 +3361,7 @@ class InMemoryBinding {
|
|
|
3361
3361
|
* TypeScript port of Python's InMemoryFanoutBroker that extends TaskSpawner
|
|
3362
3362
|
* to manage multiple WriteChannel subscribers with concurrent message distribution.
|
|
3363
3363
|
*/
|
|
3364
|
-
const logger$
|
|
3364
|
+
const logger$1e = getLogger('naylence.fame.channel.in_memory.in_memory_fanout_broker');
|
|
3365
3365
|
// Sentinel object for shutdown signaling
|
|
3366
3366
|
const SENTINEL = Symbol('fanout-broker-sentinel');
|
|
3367
3367
|
function isCloseable(obj) {
|
|
@@ -3414,7 +3414,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3414
3414
|
}
|
|
3415
3415
|
catch (error) {
|
|
3416
3416
|
// Ignore errors when sending sentinel (sink might be closed)
|
|
3417
|
-
logger$
|
|
3417
|
+
logger$1e.debug('error_sending_sentinel', {
|
|
3418
3418
|
error: error.message,
|
|
3419
3419
|
});
|
|
3420
3420
|
}
|
|
@@ -3428,7 +3428,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3428
3428
|
await sub.close();
|
|
3429
3429
|
}
|
|
3430
3430
|
catch (error) {
|
|
3431
|
-
logger$
|
|
3431
|
+
logger$1e.error('error_closing_subscriber', {
|
|
3432
3432
|
subscriber: sub.toString(),
|
|
3433
3433
|
error: error.message,
|
|
3434
3434
|
});
|
|
@@ -3468,7 +3468,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3468
3468
|
[envelope, context] = core.extractEnvelopeAndContext(msg);
|
|
3469
3469
|
}
|
|
3470
3470
|
catch (error) {
|
|
3471
|
-
logger$
|
|
3471
|
+
logger$1e.debug('failed_to_extract_envelope', {
|
|
3472
3472
|
error: error.message,
|
|
3473
3473
|
});
|
|
3474
3474
|
continue;
|
|
@@ -3490,7 +3490,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3490
3490
|
await sub.send(messageToSend);
|
|
3491
3491
|
}
|
|
3492
3492
|
catch (error) {
|
|
3493
|
-
logger$
|
|
3493
|
+
logger$1e.error('error_sending_to_subscriber', {
|
|
3494
3494
|
subscriber: sub.toString(),
|
|
3495
3495
|
error: error.message,
|
|
3496
3496
|
action: 'unsubscribing',
|
|
@@ -3506,7 +3506,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3506
3506
|
}
|
|
3507
3507
|
catch (error) {
|
|
3508
3508
|
// Critical broker-level error: log and back off, but keep the loop running
|
|
3509
|
-
logger$
|
|
3509
|
+
logger$1e.critical('receive_loop_failed_unexpectedly', {
|
|
3510
3510
|
error: error.message,
|
|
3511
3511
|
stack: error.stack,
|
|
3512
3512
|
});
|
|
@@ -5182,7 +5182,7 @@ function normalizeResponseType(value) {
|
|
|
5182
5182
|
return value;
|
|
5183
5183
|
}
|
|
5184
5184
|
|
|
5185
|
-
const logger$
|
|
5185
|
+
const logger$1d = getLogger('naylence.fame.node.binding_manager');
|
|
5186
5186
|
const SYSTEM_INBOX$3 = '__sys__';
|
|
5187
5187
|
const DEFAULT_ACK_TIMEOUT_MS = 20000;
|
|
5188
5188
|
class BindingStoreEntryRecord {
|
|
@@ -5268,7 +5268,7 @@ class BindingManager {
|
|
|
5268
5268
|
if (!this.bindings.has(key)) {
|
|
5269
5269
|
const binding = this.bindingFactory(new core.FameAddress(key));
|
|
5270
5270
|
this.bindings.set(key, binding);
|
|
5271
|
-
logger$
|
|
5271
|
+
logger$1d.debug('restored_binding', { address: key });
|
|
5272
5272
|
}
|
|
5273
5273
|
}
|
|
5274
5274
|
if (!this.hasUpstream) {
|
|
@@ -5278,13 +5278,13 @@ class BindingManager {
|
|
|
5278
5278
|
await this.readvertiseCapabilitiesUpstream();
|
|
5279
5279
|
}
|
|
5280
5280
|
async bind(participant, capabilities) {
|
|
5281
|
-
logger$
|
|
5281
|
+
logger$1d.debug('binding_participant', { participant });
|
|
5282
5282
|
const { prefixAddress, addresses, propagateAddress, capabilityAddress } = this.computeBindingAddresses(participant);
|
|
5283
5283
|
for (const address of addresses) {
|
|
5284
5284
|
if (!this.bindings.has(address)) {
|
|
5285
5285
|
const binding = this.bindingFactory(new core.FameAddress(address));
|
|
5286
5286
|
this.bindings.set(address, binding);
|
|
5287
|
-
logger$
|
|
5287
|
+
logger$1d.debug('bound_address', { address, participant });
|
|
5288
5288
|
}
|
|
5289
5289
|
}
|
|
5290
5290
|
let propagatedAddress = null;
|
|
@@ -5313,7 +5313,7 @@ class BindingManager {
|
|
|
5313
5313
|
await this.unbindAddressUpstream(propagatedAddress);
|
|
5314
5314
|
}
|
|
5315
5315
|
catch (rollbackError) {
|
|
5316
|
-
logger$
|
|
5316
|
+
logger$1d.error('bind_rollback_failed', {
|
|
5317
5317
|
address: propagatedAddress.toString(),
|
|
5318
5318
|
error: rollbackError.message,
|
|
5319
5319
|
});
|
|
@@ -5332,7 +5332,7 @@ class BindingManager {
|
|
|
5332
5332
|
physicalPath: null,
|
|
5333
5333
|
});
|
|
5334
5334
|
}
|
|
5335
|
-
logger$
|
|
5335
|
+
logger$1d.debug('bind_success', {
|
|
5336
5336
|
participant,
|
|
5337
5337
|
address: prefixAddress.toString(),
|
|
5338
5338
|
capabilities,
|
|
@@ -5368,7 +5368,7 @@ class BindingManager {
|
|
|
5368
5368
|
await this.bindingStore.delete(address);
|
|
5369
5369
|
}
|
|
5370
5370
|
}
|
|
5371
|
-
logger$
|
|
5371
|
+
logger$1d.debug('unbind_success', {
|
|
5372
5372
|
participant,
|
|
5373
5373
|
address: prefixAddress.toString(),
|
|
5374
5374
|
totalBindings: this.bindings.size,
|
|
@@ -5398,7 +5398,7 @@ class BindingManager {
|
|
|
5398
5398
|
await this.bindAddressUpstream(new core.FameAddress(address));
|
|
5399
5399
|
}
|
|
5400
5400
|
catch (error) {
|
|
5401
|
-
logger$
|
|
5401
|
+
logger$1d.error('rebind_failed', {
|
|
5402
5402
|
address,
|
|
5403
5403
|
error: error.message,
|
|
5404
5404
|
});
|
|
@@ -5417,7 +5417,7 @@ class BindingManager {
|
|
|
5417
5417
|
await this.advertiseCapabilities(new core.FameAddress(address), Array.from(capabilities));
|
|
5418
5418
|
}
|
|
5419
5419
|
catch (error) {
|
|
5420
|
-
logger$
|
|
5420
|
+
logger$1d.error('capability_replay_failed', {
|
|
5421
5421
|
address,
|
|
5422
5422
|
error: error.message,
|
|
5423
5423
|
});
|
|
@@ -5684,7 +5684,7 @@ class BindingManager {
|
|
|
5684
5684
|
}
|
|
5685
5685
|
}
|
|
5686
5686
|
|
|
5687
|
-
const logger$
|
|
5687
|
+
const logger$1c = getLogger('naylence.fame.node.response_context_manager');
|
|
5688
5688
|
function cloneSecurityContext(source) {
|
|
5689
5689
|
if (!source) {
|
|
5690
5690
|
return undefined;
|
|
@@ -5712,7 +5712,7 @@ class ResponseContextManager {
|
|
|
5712
5712
|
security: responseSecurity,
|
|
5713
5713
|
expectedResponseType: core.FameResponseType.NONE,
|
|
5714
5714
|
};
|
|
5715
|
-
logger$
|
|
5715
|
+
logger$1c.debug('created_response_context', {
|
|
5716
5716
|
request_id: requestEnvelope.id,
|
|
5717
5717
|
inherited_crypto_level: responseSecurity?.inboundCryptoLevel ?? null,
|
|
5718
5718
|
channel_id: responseSecurity?.cryptoChannelId ?? null,
|
|
@@ -5732,14 +5732,14 @@ class ResponseContextManager {
|
|
|
5732
5732
|
responseContext.fromSystemId = this.getId();
|
|
5733
5733
|
}
|
|
5734
5734
|
// Envelope-level metadata is intentionally omitted to defer to context usage.
|
|
5735
|
-
logger$
|
|
5735
|
+
logger$1c.debug('ensured_response_metadata', {
|
|
5736
5736
|
response_id: responseEnvelope.id,
|
|
5737
5737
|
request_id: requestEnvelope.id,
|
|
5738
5738
|
});
|
|
5739
5739
|
}
|
|
5740
5740
|
}
|
|
5741
5741
|
|
|
5742
|
-
const logger$
|
|
5742
|
+
const logger$1b = getLogger('naylence.fame.node.streaming_response_handler');
|
|
5743
5743
|
function isObject(value) {
|
|
5744
5744
|
return typeof value === 'object' && value !== null;
|
|
5745
5745
|
}
|
|
@@ -5858,12 +5858,12 @@ class StreamingResponseHandler {
|
|
|
5858
5858
|
}
|
|
5859
5859
|
async handleStreamingFameMessageResponses(responses, requestEnvelope, requestContext) {
|
|
5860
5860
|
const asyncResponses = toAsyncIterable(responses);
|
|
5861
|
-
logger$
|
|
5861
|
+
logger$1b.debug('handling_streaming_fame_message_responses', {
|
|
5862
5862
|
request_id: requestEnvelope.id,
|
|
5863
5863
|
});
|
|
5864
5864
|
for await (const response of asyncResponses) {
|
|
5865
5865
|
if (!response?.envelope) {
|
|
5866
|
-
logger$
|
|
5866
|
+
logger$1b.warning('invalid_streaming_response_type', {
|
|
5867
5867
|
request_id: requestEnvelope.id,
|
|
5868
5868
|
actual_type: typeof response,
|
|
5869
5869
|
});
|
|
@@ -5877,7 +5877,7 @@ class StreamingResponseHandler {
|
|
|
5877
5877
|
}
|
|
5878
5878
|
async handleStreamingResponse(result, requestEnvelope, requestContext, replyTo, requestId) {
|
|
5879
5879
|
const iterable = toAsyncIterable(result);
|
|
5880
|
-
logger$
|
|
5880
|
+
logger$1b.debug('handling_streaming_response', {
|
|
5881
5881
|
request_id: requestId,
|
|
5882
5882
|
reply_to: replyTo,
|
|
5883
5883
|
});
|
|
@@ -5888,7 +5888,7 @@ class StreamingResponseHandler {
|
|
|
5888
5888
|
await this.sendRpcResponse(null, requestEnvelope, requestContext, replyTo, requestId);
|
|
5889
5889
|
}
|
|
5890
5890
|
catch (error) {
|
|
5891
|
-
logger$
|
|
5891
|
+
logger$1b.error('streaming_response_handler_error', {
|
|
5892
5892
|
request_id: requestId,
|
|
5893
5893
|
error: error instanceof Error ? error.message : String(error),
|
|
5894
5894
|
});
|
|
@@ -5915,7 +5915,7 @@ class StreamingResponseHandler {
|
|
|
5915
5915
|
});
|
|
5916
5916
|
const responseContext = this.responseContextManager.createResponseContext(requestEnvelope, requestContext);
|
|
5917
5917
|
this.responseContextManager.ensureResponseMetadata(responseEnvelope, requestEnvelope, responseContext);
|
|
5918
|
-
logger$
|
|
5918
|
+
logger$1b.debug('sending_streaming_rpc_response', {
|
|
5919
5919
|
request_id: requestId,
|
|
5920
5920
|
response_envelope_id: responseEnvelope.id,
|
|
5921
5921
|
reply_to: replyTo,
|
|
@@ -5928,7 +5928,7 @@ class StreamingResponseHandler {
|
|
|
5928
5928
|
}
|
|
5929
5929
|
}
|
|
5930
5930
|
|
|
5931
|
-
const logger$
|
|
5931
|
+
const logger$1a = getLogger('naylence.fame.node.channel_polling_manager');
|
|
5932
5932
|
class ChannelPollingManager {
|
|
5933
5933
|
constructor(deliverWrapper, responseContextManager, streamingResponseHandler) {
|
|
5934
5934
|
this.deliverWrapper = deliverWrapper;
|
|
@@ -5936,7 +5936,7 @@ class ChannelPollingManager {
|
|
|
5936
5936
|
this.streamingResponseHandler = streamingResponseHandler;
|
|
5937
5937
|
}
|
|
5938
5938
|
async startPollingLoop(serviceName, channel, handler, stopState, pollTimeoutMs = core.DEFAULT_POLLING_TIMEOUT_MS) {
|
|
5939
|
-
logger$
|
|
5939
|
+
logger$1a.debug('poll_loop_started', {
|
|
5940
5940
|
recipient: serviceName,
|
|
5941
5941
|
});
|
|
5942
5942
|
try {
|
|
@@ -5944,7 +5944,7 @@ class ChannelPollingManager {
|
|
|
5944
5944
|
while (true) {
|
|
5945
5945
|
if (this.isStopRequested(stopState) && !draining) {
|
|
5946
5946
|
draining = true;
|
|
5947
|
-
logger$
|
|
5947
|
+
logger$1a.debug('poll_loop_draining_pending_messages', {
|
|
5948
5948
|
recipient: serviceName,
|
|
5949
5949
|
});
|
|
5950
5950
|
}
|
|
@@ -5954,7 +5954,7 @@ class ChannelPollingManager {
|
|
|
5954
5954
|
}
|
|
5955
5955
|
catch (error) {
|
|
5956
5956
|
if (error instanceof FameTransportClose) {
|
|
5957
|
-
logger$
|
|
5957
|
+
logger$1a.debug('channel_closed', {
|
|
5958
5958
|
recipient: serviceName,
|
|
5959
5959
|
message: error.message,
|
|
5960
5960
|
});
|
|
@@ -5967,7 +5967,7 @@ class ChannelPollingManager {
|
|
|
5967
5967
|
continue;
|
|
5968
5968
|
}
|
|
5969
5969
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
5970
|
-
logger$
|
|
5970
|
+
logger$1a.debug('listener_cancelled', {
|
|
5971
5971
|
recipient: serviceName,
|
|
5972
5972
|
});
|
|
5973
5973
|
throw error;
|
|
@@ -5979,13 +5979,13 @@ class ChannelPollingManager {
|
|
|
5979
5979
|
continue;
|
|
5980
5980
|
}
|
|
5981
5981
|
if (error instanceof Error && error.message === 'Channel is closed') {
|
|
5982
|
-
logger$
|
|
5982
|
+
logger$1a.debug('channel_closed', {
|
|
5983
5983
|
recipient: serviceName,
|
|
5984
5984
|
});
|
|
5985
5985
|
break;
|
|
5986
5986
|
}
|
|
5987
5987
|
if (error instanceof Error && error.name === 'TaskCancelledError') {
|
|
5988
|
-
logger$
|
|
5988
|
+
logger$1a.debug('listener_cancelled', {
|
|
5989
5989
|
recipient: serviceName,
|
|
5990
5990
|
});
|
|
5991
5991
|
throw error;
|
|
@@ -5997,12 +5997,12 @@ class ChannelPollingManager {
|
|
|
5997
5997
|
continue;
|
|
5998
5998
|
}
|
|
5999
5999
|
if (error instanceof Error && error.message.includes('closed')) {
|
|
6000
|
-
logger$
|
|
6000
|
+
logger$1a.debug('channel_closed', {
|
|
6001
6001
|
recipient: serviceName,
|
|
6002
6002
|
});
|
|
6003
6003
|
break;
|
|
6004
6004
|
}
|
|
6005
|
-
logger$
|
|
6005
|
+
logger$1a.error('transport_error', {
|
|
6006
6006
|
recipient: serviceName,
|
|
6007
6007
|
error: error instanceof Error ? error.message : String(error),
|
|
6008
6008
|
});
|
|
@@ -6018,7 +6018,7 @@ class ChannelPollingManager {
|
|
|
6018
6018
|
}
|
|
6019
6019
|
}
|
|
6020
6020
|
finally {
|
|
6021
|
-
logger$
|
|
6021
|
+
logger$1a.debug('poll_loop_exiting', {
|
|
6022
6022
|
recipient: serviceName,
|
|
6023
6023
|
});
|
|
6024
6024
|
}
|
|
@@ -6031,7 +6031,7 @@ class ChannelPollingManager {
|
|
|
6031
6031
|
await this.processHandlerResult(result, envelope, deliveryContext, serviceName);
|
|
6032
6032
|
}
|
|
6033
6033
|
catch (error) {
|
|
6034
|
-
logger$
|
|
6034
|
+
logger$1a.error('handler_crashed', {
|
|
6035
6035
|
recipient: serviceName,
|
|
6036
6036
|
error: error instanceof Error ? error.message : String(error),
|
|
6037
6037
|
});
|
|
@@ -6045,7 +6045,7 @@ class ChannelPollingManager {
|
|
|
6045
6045
|
return;
|
|
6046
6046
|
}
|
|
6047
6047
|
if (this.streamingResponseHandler.isStreamingFameMessageResponse(result)) {
|
|
6048
|
-
logger$
|
|
6048
|
+
logger$1a.debug('handling_streaming_fame_message_responses', {
|
|
6049
6049
|
service_name: serviceName,
|
|
6050
6050
|
envelope_id: envelope.id,
|
|
6051
6051
|
});
|
|
@@ -6053,7 +6053,7 @@ class ChannelPollingManager {
|
|
|
6053
6053
|
}
|
|
6054
6054
|
}
|
|
6055
6055
|
async handleMessageResponse(response, requestEnvelope, requestContext, serviceName) {
|
|
6056
|
-
logger$
|
|
6056
|
+
logger$1a.debug('delivering_envelope_response_message', {
|
|
6057
6057
|
service_name: serviceName,
|
|
6058
6058
|
response_envelope_id: response.envelope.id,
|
|
6059
6059
|
});
|
|
@@ -6073,7 +6073,7 @@ class ChannelPollingManager {
|
|
|
6073
6073
|
}
|
|
6074
6074
|
}
|
|
6075
6075
|
|
|
6076
|
-
const logger$
|
|
6076
|
+
const logger$19 = getLogger('naylence.fame.node.rpc_server_handler');
|
|
6077
6077
|
function isPlainRecord$6(value) {
|
|
6078
6078
|
if (typeof value !== 'object' || value === null) {
|
|
6079
6079
|
return false;
|
|
@@ -6117,13 +6117,13 @@ class RPCServerHandler {
|
|
|
6117
6117
|
}
|
|
6118
6118
|
async handleRpcRequest(envelope, handlerContext, handler, serviceName) {
|
|
6119
6119
|
if (!this.isDataFrame(envelope.frame)) {
|
|
6120
|
-
logger$
|
|
6120
|
+
logger$19.warning('rpc_request_missing_data_frame', {
|
|
6121
6121
|
service_name: serviceName,
|
|
6122
6122
|
envelope_id: envelope.id,
|
|
6123
6123
|
});
|
|
6124
6124
|
return;
|
|
6125
6125
|
}
|
|
6126
|
-
logger$
|
|
6126
|
+
logger$19.debug('rpc_request_received', {
|
|
6127
6127
|
service_name: serviceName,
|
|
6128
6128
|
envelope_id: envelope.id,
|
|
6129
6129
|
trace_id: envelope.traceId,
|
|
@@ -6135,7 +6135,7 @@ class RPCServerHandler {
|
|
|
6135
6135
|
request = core.parseRequest(envelope.frame.payload);
|
|
6136
6136
|
params = cloneParams(request.params);
|
|
6137
6137
|
const paramKeys = Object.keys(params);
|
|
6138
|
-
logger$
|
|
6138
|
+
logger$19.debug('parsed_rpc_request', {
|
|
6139
6139
|
service_name: serviceName,
|
|
6140
6140
|
method: request.method,
|
|
6141
6141
|
request_id: request.id,
|
|
@@ -6144,7 +6144,7 @@ class RPCServerHandler {
|
|
|
6144
6144
|
});
|
|
6145
6145
|
}
|
|
6146
6146
|
catch (error) {
|
|
6147
|
-
logger$
|
|
6147
|
+
logger$19.warning('request_decode_error', {
|
|
6148
6148
|
service_name: serviceName,
|
|
6149
6149
|
envelope_id: envelope.id,
|
|
6150
6150
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -6152,7 +6152,7 @@ class RPCServerHandler {
|
|
|
6152
6152
|
return;
|
|
6153
6153
|
}
|
|
6154
6154
|
if (request.id == null) {
|
|
6155
|
-
logger$
|
|
6155
|
+
logger$19.warning('request_missing_id', {
|
|
6156
6156
|
service_name: serviceName,
|
|
6157
6157
|
envelope_id: envelope.id,
|
|
6158
6158
|
});
|
|
@@ -6160,7 +6160,7 @@ class RPCServerHandler {
|
|
|
6160
6160
|
}
|
|
6161
6161
|
const replyTo = this.resolveReplyTo(envelope, params);
|
|
6162
6162
|
if (!replyTo) {
|
|
6163
|
-
logger$
|
|
6163
|
+
logger$19.warning('missing_reply_to', {
|
|
6164
6164
|
service_name: serviceName,
|
|
6165
6165
|
envelope_id: envelope.id,
|
|
6166
6166
|
request_id: request.id,
|
|
@@ -6169,13 +6169,13 @@ class RPCServerHandler {
|
|
|
6169
6169
|
}
|
|
6170
6170
|
let handlerResult;
|
|
6171
6171
|
try {
|
|
6172
|
-
logger$
|
|
6172
|
+
logger$19.debug('calling_rpc_handler', {
|
|
6173
6173
|
service_name: serviceName,
|
|
6174
6174
|
method: request.method,
|
|
6175
6175
|
request_id: request.id,
|
|
6176
6176
|
});
|
|
6177
6177
|
handlerResult = await handler(request.method, params);
|
|
6178
|
-
logger$
|
|
6178
|
+
logger$19.debug('rpc_handler_returned', {
|
|
6179
6179
|
service_name: serviceName,
|
|
6180
6180
|
method: request.method,
|
|
6181
6181
|
request_id: request.id,
|
|
@@ -6184,7 +6184,7 @@ class RPCServerHandler {
|
|
|
6184
6184
|
});
|
|
6185
6185
|
}
|
|
6186
6186
|
catch (error) {
|
|
6187
|
-
logger$
|
|
6187
|
+
logger$19.error('rpc_handler_error', {
|
|
6188
6188
|
service_name: serviceName,
|
|
6189
6189
|
request_id: request.id,
|
|
6190
6190
|
envelope_id: envelope.id,
|
|
@@ -6194,7 +6194,7 @@ class RPCServerHandler {
|
|
|
6194
6194
|
return this.createTraditionalResponse(response, request.id, envelope, replyTo, handlerContext, serviceName);
|
|
6195
6195
|
}
|
|
6196
6196
|
if (core.isFameMessageResponse(handlerResult)) {
|
|
6197
|
-
logger$
|
|
6197
|
+
logger$19.debug('returning_response_message', {
|
|
6198
6198
|
service_name: serviceName,
|
|
6199
6199
|
request_id: request.id,
|
|
6200
6200
|
response_envelope_id: handlerResult.envelope.id,
|
|
@@ -6202,7 +6202,7 @@ class RPCServerHandler {
|
|
|
6202
6202
|
return handlerResult;
|
|
6203
6203
|
}
|
|
6204
6204
|
if (this.streamingResponseHandler.isStreamingResult(handlerResult)) {
|
|
6205
|
-
logger$
|
|
6205
|
+
logger$19.debug('handling_streaming_response', {
|
|
6206
6206
|
service_name: serviceName,
|
|
6207
6207
|
request_id: request.id,
|
|
6208
6208
|
envelope_id: envelope.id,
|
|
@@ -6231,7 +6231,7 @@ class RPCServerHandler {
|
|
|
6231
6231
|
return null;
|
|
6232
6232
|
}
|
|
6233
6233
|
async createTraditionalResponse(payload, requestId, requestEnvelope, replyTo, handlerContext, serviceName) {
|
|
6234
|
-
logger$
|
|
6234
|
+
logger$19.debug('creating_traditional_response_envelope', {
|
|
6235
6235
|
service_name: serviceName,
|
|
6236
6236
|
request_id: requestId,
|
|
6237
6237
|
envelope_id: requestEnvelope.id,
|
|
@@ -6255,7 +6255,7 @@ class RPCServerHandler {
|
|
|
6255
6255
|
if (requestEnvelope.id) {
|
|
6256
6256
|
responseContext.meta['response-to-id'] = requestEnvelope.id;
|
|
6257
6257
|
}
|
|
6258
|
-
logger$
|
|
6258
|
+
logger$19.debug('returning_traditional_response', {
|
|
6259
6259
|
service_name: serviceName,
|
|
6260
6260
|
request_id: requestId,
|
|
6261
6261
|
envelope_id: requestEnvelope.id,
|
|
@@ -6320,7 +6320,7 @@ function normalizeErrorCode(code) {
|
|
|
6320
6320
|
return code;
|
|
6321
6321
|
}
|
|
6322
6322
|
|
|
6323
|
-
const logger$
|
|
6323
|
+
const logger$18 = getLogger('naylence.fame.node.rpc_client_manager');
|
|
6324
6324
|
function isPlainRecord$5(value) {
|
|
6325
6325
|
if (typeof value !== 'object' || value === null) {
|
|
6326
6326
|
return false;
|
|
@@ -6537,7 +6537,7 @@ class RPCClientManager {
|
|
|
6537
6537
|
const metaReason = tracked.meta?.['nack_reason'];
|
|
6538
6538
|
const formattedMessage = formatDeliveryErrorMessage(typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR', reason ??
|
|
6539
6539
|
(typeof metaReason === 'string' ? metaReason : undefined));
|
|
6540
|
-
logger$
|
|
6540
|
+
logger$18.debug('pending_request_rejected_by_delivery_nack', {
|
|
6541
6541
|
envelope_id: envelopeId,
|
|
6542
6542
|
request_id: requestId,
|
|
6543
6543
|
code: typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR',
|
|
@@ -6560,7 +6560,7 @@ class RPCClientManager {
|
|
|
6560
6560
|
this.trackerWithEvents.removeEventHandler?.(this.trackerEventHandler);
|
|
6561
6561
|
}
|
|
6562
6562
|
catch (error) {
|
|
6563
|
-
logger$
|
|
6563
|
+
logger$18.debug('rpc_tracker_handler_remove_failed', {
|
|
6564
6564
|
error: error instanceof Error ? error.message : String(error),
|
|
6565
6565
|
});
|
|
6566
6566
|
}
|
|
@@ -6603,7 +6603,7 @@ class RPCClientManager {
|
|
|
6603
6603
|
this.rpcListenerAddress = await this.listenCallback(recipient, handler);
|
|
6604
6604
|
this.rpcBound = true;
|
|
6605
6605
|
this.boundPhysicalPath = currentPhysicalPath;
|
|
6606
|
-
logger$
|
|
6606
|
+
logger$18.debug('rpc_reply_listener_bound', {
|
|
6607
6607
|
reply_recipient: recipient,
|
|
6608
6608
|
reply_address: this.rpcReplyAddress?.toString(),
|
|
6609
6609
|
listener_address: this.rpcListenerAddress?.toString(),
|
|
@@ -6697,7 +6697,7 @@ class RPCClientManager {
|
|
|
6697
6697
|
const finalizePromise = this.notifyStreamClosed(envelopeId);
|
|
6698
6698
|
if (finalizePromise) {
|
|
6699
6699
|
finalizePromise.catch((notifyError) => {
|
|
6700
|
-
logger$
|
|
6700
|
+
logger$18.debug('stream_tracker_finalize_failed', {
|
|
6701
6701
|
request_id: requestId,
|
|
6702
6702
|
envelope_id: envelopeId,
|
|
6703
6703
|
error: notifyError instanceof Error
|
|
@@ -6758,7 +6758,7 @@ class RPCClientManager {
|
|
|
6758
6758
|
return iterator;
|
|
6759
6759
|
}
|
|
6760
6760
|
async sendRpcRequest(requestId, envelope, expectedResponseType, timeoutMs) {
|
|
6761
|
-
logger$
|
|
6761
|
+
logger$18.debug('sending_rpc_request', {
|
|
6762
6762
|
envp_id: envelope.id,
|
|
6763
6763
|
corr_id: envelope.corrId,
|
|
6764
6764
|
request_id: requestId,
|
|
@@ -6774,7 +6774,7 @@ class RPCClientManager {
|
|
|
6774
6774
|
}
|
|
6775
6775
|
}
|
|
6776
6776
|
catch (error) {
|
|
6777
|
-
logger$
|
|
6777
|
+
logger$18.warning('delivery_tracker_track_failed', {
|
|
6778
6778
|
request_id: requestId,
|
|
6779
6779
|
error: error instanceof Error ? error.message : String(error),
|
|
6780
6780
|
});
|
|
@@ -6787,14 +6787,14 @@ class RPCClientManager {
|
|
|
6787
6787
|
await this.deliverWrapper()(envelope, context);
|
|
6788
6788
|
}
|
|
6789
6789
|
async handleReplyEnvelope(envelope) {
|
|
6790
|
-
logger$
|
|
6790
|
+
logger$18.debug('handle_reply_envelope_received', {
|
|
6791
6791
|
envelope_id: envelope.id,
|
|
6792
6792
|
corr_id: envelope.corrId,
|
|
6793
6793
|
frame_type: envelope.frame?.['type'],
|
|
6794
6794
|
});
|
|
6795
6795
|
let requestId = envelope.corrId ?? envelope.id;
|
|
6796
6796
|
if (!requestId) {
|
|
6797
|
-
logger$
|
|
6797
|
+
logger$18.warning('reply_envelope_missing_corr_id', {
|
|
6798
6798
|
envelope_id: envelope.id,
|
|
6799
6799
|
});
|
|
6800
6800
|
return;
|
|
@@ -6812,12 +6812,12 @@ class RPCClientManager {
|
|
|
6812
6812
|
}
|
|
6813
6813
|
}
|
|
6814
6814
|
if (!entry) {
|
|
6815
|
-
logger$
|
|
6815
|
+
logger$18.debug('no_pending_request_for_reply', {
|
|
6816
6816
|
request_id: requestId,
|
|
6817
6817
|
});
|
|
6818
6818
|
return;
|
|
6819
6819
|
}
|
|
6820
|
-
logger$
|
|
6820
|
+
logger$18.debug('handle_reply_envelope', {
|
|
6821
6821
|
envelope_id: envelope.id,
|
|
6822
6822
|
request_id: requestId,
|
|
6823
6823
|
corr_id: envelope.corrId,
|
|
@@ -6830,7 +6830,7 @@ class RPCClientManager {
|
|
|
6830
6830
|
const ackIndicatesSuccess = frame.ok === true ||
|
|
6831
6831
|
(frame.ok === undefined && !frame.code && !frame.reason);
|
|
6832
6832
|
if (ackIndicatesSuccess) {
|
|
6833
|
-
logger$
|
|
6833
|
+
logger$18.debug('pending_request_delivery_acknowledged', {
|
|
6834
6834
|
request_id: requestId,
|
|
6835
6835
|
envelope_id: envelope.id,
|
|
6836
6836
|
ref_id: frame.refId ?? null,
|
|
@@ -6858,7 +6858,7 @@ class RPCClientManager {
|
|
|
6858
6858
|
entry.timer = null;
|
|
6859
6859
|
}
|
|
6860
6860
|
if (!this.isDataFrame(envelope.frame)) {
|
|
6861
|
-
logger$
|
|
6861
|
+
logger$18.warning('unexpected_reply_frame_type', {
|
|
6862
6862
|
request_id: requestId,
|
|
6863
6863
|
frame_type: envelope.frame?.['type'],
|
|
6864
6864
|
});
|
|
@@ -6924,7 +6924,7 @@ class RPCClientManager {
|
|
|
6924
6924
|
return;
|
|
6925
6925
|
}
|
|
6926
6926
|
Promise.resolve(this.deliveryTracker.onStreamItem(envelopeId, envelope)).catch((error) => {
|
|
6927
|
-
logger$
|
|
6927
|
+
logger$18.debug('stream_tracker_push_failed', {
|
|
6928
6928
|
envelope_id: envelopeId,
|
|
6929
6929
|
error: error instanceof Error ? error.message : String(error),
|
|
6930
6930
|
});
|
|
@@ -7039,7 +7039,7 @@ function normalizeMailbox(mailbox) {
|
|
|
7039
7039
|
return mailbox;
|
|
7040
7040
|
}
|
|
7041
7041
|
|
|
7042
|
-
const logger$
|
|
7042
|
+
const logger$17 = getLogger('naylence.fame.node.envelope_listener_manager');
|
|
7043
7043
|
const SYSTEM_INBOX$2 = '__sys__';
|
|
7044
7044
|
class EnvelopeListener {
|
|
7045
7045
|
constructor(stopFn, task) {
|
|
@@ -7047,7 +7047,7 @@ class EnvelopeListener {
|
|
|
7047
7047
|
this.task = task;
|
|
7048
7048
|
}
|
|
7049
7049
|
stop() {
|
|
7050
|
-
logger$
|
|
7050
|
+
logger$17.debug('stopping_listener', {
|
|
7051
7051
|
task_name: this.task.name,
|
|
7052
7052
|
});
|
|
7053
7053
|
try {
|
|
@@ -7055,7 +7055,7 @@ class EnvelopeListener {
|
|
|
7055
7055
|
if (maybeCleanup &&
|
|
7056
7056
|
typeof maybeCleanup.then === 'function') {
|
|
7057
7057
|
void maybeCleanup.catch((error) => {
|
|
7058
|
-
logger$
|
|
7058
|
+
logger$17.debug('listener_stop_cleanup_failed', {
|
|
7059
7059
|
task_name: this.task.name,
|
|
7060
7060
|
error: error instanceof Error ? error.message : String(error),
|
|
7061
7061
|
});
|
|
@@ -7063,7 +7063,7 @@ class EnvelopeListener {
|
|
|
7063
7063
|
}
|
|
7064
7064
|
}
|
|
7065
7065
|
catch (error) {
|
|
7066
|
-
logger$
|
|
7066
|
+
logger$17.debug('listener_stop_cleanup_failed', {
|
|
7067
7067
|
task_name: this.task.name,
|
|
7068
7068
|
error: error instanceof Error ? error.message : String(error),
|
|
7069
7069
|
});
|
|
@@ -7093,7 +7093,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7093
7093
|
envelope.replyTo = core.formatAddress(SYSTEM_INBOX$2, this.nodeLike.physicalPath);
|
|
7094
7094
|
}
|
|
7095
7095
|
catch (error) {
|
|
7096
|
-
logger$
|
|
7096
|
+
logger$17.warning('default_reply_to_assignment_failed', {
|
|
7097
7097
|
envelope_id: envelope.id,
|
|
7098
7098
|
service_name: envelope.capabilities?.[0] ?? null,
|
|
7099
7099
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -7118,7 +7118,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7118
7118
|
if (serviceName === SYSTEM_INBOX$2) {
|
|
7119
7119
|
continue;
|
|
7120
7120
|
}
|
|
7121
|
-
logger$
|
|
7121
|
+
logger$17.debug('stopping_listener_for_service', {
|
|
7122
7122
|
service_name: serviceName,
|
|
7123
7123
|
});
|
|
7124
7124
|
entry.listener.stop();
|
|
@@ -7128,7 +7128,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7128
7128
|
catch (error) {
|
|
7129
7129
|
if (!(error instanceof Error) ||
|
|
7130
7130
|
error.name !== 'TaskCancelledError') {
|
|
7131
|
-
logger$
|
|
7131
|
+
logger$17.debug('listener_task_stopped', {
|
|
7132
7132
|
service_name: serviceName,
|
|
7133
7133
|
error: error instanceof Error ? error.message : String(error),
|
|
7134
7134
|
});
|
|
@@ -7136,7 +7136,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7136
7136
|
}
|
|
7137
7137
|
}
|
|
7138
7138
|
if (systemEntry) {
|
|
7139
|
-
logger$
|
|
7139
|
+
logger$17.debug('stopping_listener_for_service', {
|
|
7140
7140
|
service_name: SYSTEM_INBOX$2,
|
|
7141
7141
|
});
|
|
7142
7142
|
systemEntry.listener.stop();
|
|
@@ -7146,7 +7146,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7146
7146
|
catch (error) {
|
|
7147
7147
|
if (!(error instanceof Error) ||
|
|
7148
7148
|
error.name !== 'TaskCancelledError') {
|
|
7149
|
-
logger$
|
|
7149
|
+
logger$17.debug('listener_task_stopped', {
|
|
7150
7150
|
service_name: SYSTEM_INBOX$2,
|
|
7151
7151
|
error: error instanceof Error ? error.message : String(error),
|
|
7152
7152
|
});
|
|
@@ -7163,13 +7163,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7163
7163
|
}
|
|
7164
7164
|
async recoverUnhandledInboundEnvelopes() {
|
|
7165
7165
|
if (typeof this.deliveryTracker.listInbound !== 'function') {
|
|
7166
|
-
logger$
|
|
7166
|
+
logger$17.debug('delivery_tracker_missing_inbound_listing');
|
|
7167
7167
|
return;
|
|
7168
7168
|
}
|
|
7169
7169
|
const failedInbound = await this.deliveryTracker.listInbound((env) => env.status === EnvelopeStatus.RECEIVED ||
|
|
7170
7170
|
env.status === EnvelopeStatus.FAILED_TO_HANDLE);
|
|
7171
7171
|
if (!failedInbound.length) {
|
|
7172
|
-
logger$
|
|
7172
|
+
logger$17.debug('no_failed_inbound_envelopes_to_recover');
|
|
7173
7173
|
return;
|
|
7174
7174
|
}
|
|
7175
7175
|
const grouped = new Map();
|
|
@@ -7186,7 +7186,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7186
7186
|
this.pendingRecoveryEnvelopes.set(serviceName, envelopes);
|
|
7187
7187
|
}
|
|
7188
7188
|
});
|
|
7189
|
-
logger$
|
|
7189
|
+
logger$17.debug('discovered_failed_inbound_envelopes', {
|
|
7190
7190
|
total: failedInbound.length,
|
|
7191
7191
|
services: Array.from(grouped.keys()),
|
|
7192
7192
|
});
|
|
@@ -7196,7 +7196,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7196
7196
|
const pollTimeoutMs = options.pollTimeoutMs ??
|
|
7197
7197
|
options.poll_timeout_ms ??
|
|
7198
7198
|
core.DEFAULT_POLLING_TIMEOUT_MS;
|
|
7199
|
-
logger$
|
|
7199
|
+
logger$17.debug('listen_start', {
|
|
7200
7200
|
recipient: serviceName,
|
|
7201
7201
|
poll_timeout_ms: pollTimeoutMs ?? core.DEFAULT_POLLING_TIMEOUT_MS,
|
|
7202
7202
|
});
|
|
@@ -7227,7 +7227,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7227
7227
|
tracked?.mailboxType === MailboxType.OUTBOX ||
|
|
7228
7228
|
envelope.frame?.['type'] === 'DeliveryAck';
|
|
7229
7229
|
if (!shouldInvoke) {
|
|
7230
|
-
logger$
|
|
7230
|
+
logger$17.debug('skipping_listener_handler', {
|
|
7231
7231
|
recipient: serviceName,
|
|
7232
7232
|
envelope_id: envelope.id,
|
|
7233
7233
|
tracked_status: tracked?.status,
|
|
@@ -7241,13 +7241,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7241
7241
|
? undefined
|
|
7242
7242
|
: (tracked ?? undefined);
|
|
7243
7243
|
if (trackedForHandler && trackedForHandler.attempt > 0) {
|
|
7244
|
-
logger$
|
|
7244
|
+
logger$17.info('resuming_handler_retry_after_restart', {
|
|
7245
7245
|
envelope_id: envelope.id,
|
|
7246
7246
|
current_attempts: trackedForHandler.attempt,
|
|
7247
7247
|
service_name: serviceName,
|
|
7248
7248
|
});
|
|
7249
7249
|
}
|
|
7250
|
-
logger$
|
|
7250
|
+
logger$17.debug('forwarding_to_listener_handler', {
|
|
7251
7251
|
recipient: serviceName,
|
|
7252
7252
|
envelope_id: envelope.id,
|
|
7253
7253
|
frame_type: envelope.frame?.['type'],
|
|
@@ -7266,7 +7266,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7266
7266
|
await channel.send(null);
|
|
7267
7267
|
}
|
|
7268
7268
|
catch (error) {
|
|
7269
|
-
logger$
|
|
7269
|
+
logger$17.debug('listener_stop_signal_failed', {
|
|
7270
7270
|
service_name: serviceName,
|
|
7271
7271
|
error: error instanceof Error ? error.message : String(error),
|
|
7272
7272
|
});
|
|
@@ -7275,7 +7275,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7275
7275
|
await this.listenersLock.runExclusive(async () => {
|
|
7276
7276
|
const existing = this.listeners.get(serviceName);
|
|
7277
7277
|
if (existing) {
|
|
7278
|
-
logger$
|
|
7278
|
+
logger$17.debug('replacing_envelope_listener', { recipient: serviceName });
|
|
7279
7279
|
existing.listener.stop();
|
|
7280
7280
|
try {
|
|
7281
7281
|
await existing.listener.task.promise;
|
|
@@ -7293,13 +7293,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7293
7293
|
return binding.address;
|
|
7294
7294
|
}
|
|
7295
7295
|
async listenRpc(serviceName, handler, options = {}) {
|
|
7296
|
-
logger$
|
|
7296
|
+
logger$17.debug('rpc_listen_start', { service_name: serviceName });
|
|
7297
7297
|
const rpcHandler = async (envelope, context) => {
|
|
7298
7298
|
const result = await this.rpcServerHandler.handleRpcRequest(envelope, context, handler, serviceName);
|
|
7299
7299
|
return result ?? null;
|
|
7300
7300
|
};
|
|
7301
7301
|
const address = await this.listen(serviceName, rpcHandler, options);
|
|
7302
|
-
logger$
|
|
7302
|
+
logger$17.debug('rpc_listen_bound', {
|
|
7303
7303
|
service_name: serviceName,
|
|
7304
7304
|
address: address.toString(),
|
|
7305
7305
|
});
|
|
@@ -7368,12 +7368,12 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7368
7368
|
return cached;
|
|
7369
7369
|
});
|
|
7370
7370
|
if (!envelopes.length) {
|
|
7371
|
-
logger$
|
|
7371
|
+
logger$17.debug('no_cached_recovery_for_service', {
|
|
7372
7372
|
service_name: serviceName,
|
|
7373
7373
|
});
|
|
7374
7374
|
return;
|
|
7375
7375
|
}
|
|
7376
|
-
logger$
|
|
7376
|
+
logger$17.debug('recovering_unhandled_envelopes_on_listen', {
|
|
7377
7377
|
service_name: serviceName,
|
|
7378
7378
|
count: envelopes.length,
|
|
7379
7379
|
envelope_ids: envelopes.map((trackedEnvelope) => trackedEnvelope.envelopeId),
|
|
@@ -7384,7 +7384,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7384
7384
|
async recoverServiceEnvelopes(serviceName, envelopes, handler) {
|
|
7385
7385
|
for (const tracked of envelopes) {
|
|
7386
7386
|
try {
|
|
7387
|
-
logger$
|
|
7387
|
+
logger$17.warning('recovering_unhandled_envelope', {
|
|
7388
7388
|
envelope_id: tracked.envelopeId,
|
|
7389
7389
|
service_name: serviceName,
|
|
7390
7390
|
current_attempts: tracked.attempt,
|
|
@@ -7393,13 +7393,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7393
7393
|
const originalEnvelope = tracked.originalEnvelope;
|
|
7394
7394
|
const receiverPolicy = this.nodeLike.deliveryPolicy?.receiverRetryPolicy ?? undefined;
|
|
7395
7395
|
await this.executeHandlerWithRetries(handler, originalEnvelope, undefined, receiverPolicy, tracked, serviceName);
|
|
7396
|
-
logger$
|
|
7396
|
+
logger$17.debug('envelope_recovery_completed', {
|
|
7397
7397
|
envelope_id: tracked.envelopeId,
|
|
7398
7398
|
service_name: serviceName,
|
|
7399
7399
|
});
|
|
7400
7400
|
}
|
|
7401
7401
|
catch (error) {
|
|
7402
|
-
logger$
|
|
7402
|
+
logger$17.error('envelope_recovery_failed', {
|
|
7403
7403
|
envelope_id: tracked.envelopeId,
|
|
7404
7404
|
service_name: serviceName,
|
|
7405
7405
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -7445,7 +7445,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7445
7445
|
await this.deliveryTracker.onEnvelopeHandled(trackedEnvelope);
|
|
7446
7446
|
}
|
|
7447
7447
|
if (currentAttempt > 0) {
|
|
7448
|
-
logger$
|
|
7448
|
+
logger$17.info('handler_retry_succeeded', {
|
|
7449
7449
|
envelope_id: envelope.id,
|
|
7450
7450
|
attempt: currentAttempt + 1,
|
|
7451
7451
|
total_attempts: currentAttempt + 1,
|
|
@@ -7461,7 +7461,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7461
7461
|
await this.deliveryTracker.onEnvelopeHandleFailed(inboxName, trackedEnvelope, context, error instanceof Error ? error : new Error(String(error)), isFinalAttempt);
|
|
7462
7462
|
}
|
|
7463
7463
|
if (isFinalAttempt) {
|
|
7464
|
-
logger$
|
|
7464
|
+
logger$17.error('handler_execution_failed_exhausted_retries', {
|
|
7465
7465
|
envelope_id: envelope.id,
|
|
7466
7466
|
total_attempts: attemptNumber,
|
|
7467
7467
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -7470,7 +7470,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7470
7470
|
break;
|
|
7471
7471
|
}
|
|
7472
7472
|
const delayMs = retryPolicy?.nextDelayMs(attemptNumber) ?? 0;
|
|
7473
|
-
logger$
|
|
7473
|
+
logger$17.warning('handler_execution_failed_will_retry', {
|
|
7474
7474
|
envelope_id: envelope.id,
|
|
7475
7475
|
attempt: attemptNumber,
|
|
7476
7476
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -7500,7 +7500,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7500
7500
|
}
|
|
7501
7501
|
}
|
|
7502
7502
|
|
|
7503
|
-
const logger$
|
|
7503
|
+
const logger$16 = getLogger('naylence.fame.delivery.default_delivery_tracker');
|
|
7504
7504
|
const STREAM_END = Symbol('stream-end');
|
|
7505
7505
|
const SWEEPER_TICK = Symbol('tracker-sweeper-tick');
|
|
7506
7506
|
function createDeferred$2() {
|
|
@@ -7719,7 +7719,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7719
7719
|
const expectedResponseType = options.expectedResponseType;
|
|
7720
7720
|
const tracked = await this.lock.runExclusive(async () => {
|
|
7721
7721
|
if (this.ackFutures.has(envelope.id)) {
|
|
7722
|
-
logger$
|
|
7722
|
+
logger$16.debug('tracker_envelope_already_tracked', {
|
|
7723
7723
|
envp_id: envelope.id,
|
|
7724
7724
|
});
|
|
7725
7725
|
return null;
|
|
@@ -7729,7 +7729,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7729
7729
|
if (expectedResponseType & core.FameResponseType.REPLY ||
|
|
7730
7730
|
expectedResponseType & core.FameResponseType.STREAM) {
|
|
7731
7731
|
if (existingEnvId && existingEnvId !== envelope.id) {
|
|
7732
|
-
logger$
|
|
7732
|
+
logger$16.debug('envelope_already_tracked_for_replies', {
|
|
7733
7733
|
envp_id: envelope.id,
|
|
7734
7734
|
corr_id: corrId,
|
|
7735
7735
|
expected_response_type: expectedResponseType,
|
|
@@ -7778,7 +7778,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7778
7778
|
return null;
|
|
7779
7779
|
}
|
|
7780
7780
|
await this.scheduleTimer(tracked, options.retryPolicy ?? null, options.retryHandler ?? null);
|
|
7781
|
-
logger$
|
|
7781
|
+
logger$16.debug('tracker_registered_envelope', {
|
|
7782
7782
|
envp_id: envelope.id,
|
|
7783
7783
|
corr_id: tracked.originalEnvelope.corrId,
|
|
7784
7784
|
expected_response: tracked.expectedResponseType,
|
|
@@ -7802,21 +7802,21 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7802
7802
|
return this.awaitEnvelopeFuture(envelopeId, core.FameResponseType.REPLY | core.FameResponseType.STREAM, future, timeoutMs);
|
|
7803
7803
|
}
|
|
7804
7804
|
async onEnvelopeDelivered(inboxName, envelope, context) {
|
|
7805
|
-
logger$
|
|
7805
|
+
logger$16.debug('envelope_delivered', {
|
|
7806
7806
|
envp_id: envelope.id,
|
|
7807
7807
|
corr_id: envelope.corrId,
|
|
7808
7808
|
rtype: envelope.rtype ?? core.FameResponseType.NONE,
|
|
7809
7809
|
frame_type: envelope.frame?.type ?? 'unknown',
|
|
7810
7810
|
});
|
|
7811
7811
|
if (!envelope.corrId) {
|
|
7812
|
-
logger$
|
|
7812
|
+
logger$16.debug('envelope_delivered_no_corr_id', {
|
|
7813
7813
|
envelope_id: envelope.id,
|
|
7814
7814
|
});
|
|
7815
7815
|
return null;
|
|
7816
7816
|
}
|
|
7817
7817
|
if (this.isDeliveryAckFrame(envelope.frame)) {
|
|
7818
7818
|
if (!envelope.frame.refId) {
|
|
7819
|
-
logger$
|
|
7819
|
+
logger$16.debug('envelope_delivered_no_ref_id', {
|
|
7820
7820
|
envelope_id: envelope.id,
|
|
7821
7821
|
});
|
|
7822
7822
|
return null;
|
|
@@ -7853,7 +7853,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7853
7853
|
await inbox.set(envelope.id, tracked);
|
|
7854
7854
|
}
|
|
7855
7855
|
else {
|
|
7856
|
-
logger$
|
|
7856
|
+
logger$16.debug('tracker_duplicate_envelope_already_handled', {
|
|
7857
7857
|
envp_id: envelope.id,
|
|
7858
7858
|
status: tracked.status,
|
|
7859
7859
|
});
|
|
@@ -7895,7 +7895,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7895
7895
|
}
|
|
7896
7896
|
if (isFinalFailure) {
|
|
7897
7897
|
envelope.status = EnvelopeStatus.FAILED_TO_HANDLE;
|
|
7898
|
-
logger$
|
|
7898
|
+
logger$16.error('envelope_handle_failed_final', {
|
|
7899
7899
|
inbox_name: inboxName,
|
|
7900
7900
|
envp_id: envelope.originalEnvelope.id,
|
|
7901
7901
|
error: error?.message ?? 'unknown',
|
|
@@ -7906,7 +7906,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7906
7906
|
await inbox.delete(envelope.originalEnvelope.id);
|
|
7907
7907
|
return;
|
|
7908
7908
|
}
|
|
7909
|
-
logger$
|
|
7909
|
+
logger$16.warning('envelope_handle_failed_retry', {
|
|
7910
7910
|
inbox_name: inboxName,
|
|
7911
7911
|
envp_id: envelope.originalEnvelope.id,
|
|
7912
7912
|
error: error?.message ?? 'unknown',
|
|
@@ -7951,14 +7951,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7951
7951
|
if (handledViaFuture) {
|
|
7952
7952
|
await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
|
|
7953
7953
|
await this.clearTimer(refId);
|
|
7954
|
-
logger$
|
|
7954
|
+
logger$16.debug('tracker_ack_resolved_without_tracked_envelope', {
|
|
7955
7955
|
envp_id: envelope.id,
|
|
7956
7956
|
ref_id: refId,
|
|
7957
7957
|
corr_id: envelope.corrId,
|
|
7958
7958
|
});
|
|
7959
7959
|
return;
|
|
7960
7960
|
}
|
|
7961
|
-
logger$
|
|
7961
|
+
logger$16.debug('tracker_ack_for_unknown_envelope', {
|
|
7962
7962
|
envp_id: envelope.id,
|
|
7963
7963
|
ref_id: refId,
|
|
7964
7964
|
corr_id: envelope.corrId,
|
|
@@ -7966,7 +7966,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7966
7966
|
return;
|
|
7967
7967
|
}
|
|
7968
7968
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
7969
|
-
logger$
|
|
7969
|
+
logger$16.debug('tracker_ack_corr_id_mismatch', {
|
|
7970
7970
|
envp_id: envelope.id,
|
|
7971
7971
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
7972
7972
|
actual_corr_id: envelope.corrId,
|
|
@@ -7991,7 +7991,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7991
7991
|
for (const handler of this.eventHandlers) {
|
|
7992
7992
|
await handler.onEnvelopeAcked?.(tracked);
|
|
7993
7993
|
}
|
|
7994
|
-
logger$
|
|
7994
|
+
logger$16.debug('tracker_envelope_acked', {
|
|
7995
7995
|
envp_id: tracked.originalEnvelope.id,
|
|
7996
7996
|
});
|
|
7997
7997
|
}
|
|
@@ -8008,13 +8008,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8008
8008
|
const outbox = this.ensureOutbox();
|
|
8009
8009
|
const tracked = await outbox.get(envelope.frame.refId);
|
|
8010
8010
|
if (!tracked) {
|
|
8011
|
-
logger$
|
|
8011
|
+
logger$16.debug('tracker_nack_for_unknown_envelope', {
|
|
8012
8012
|
envp_id: envelope.id,
|
|
8013
8013
|
});
|
|
8014
8014
|
return;
|
|
8015
8015
|
}
|
|
8016
8016
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
8017
|
-
logger$
|
|
8017
|
+
logger$16.debug('tracker_nack_corr_id_mismatch', {
|
|
8018
8018
|
envp_id: envelope.id,
|
|
8019
8019
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
8020
8020
|
actual_corr_id: envelope.corrId,
|
|
@@ -8056,7 +8056,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8056
8056
|
for (const handler of this.eventHandlers) {
|
|
8057
8057
|
await handler.onEnvelopeNacked?.(tracked, ackFrame.reason ?? null);
|
|
8058
8058
|
}
|
|
8059
|
-
logger$
|
|
8059
|
+
logger$16.debug('tracker_envelope_nacked', {
|
|
8060
8060
|
envp_id: tracked.originalEnvelope.id,
|
|
8061
8061
|
reason: ackFrame.reason,
|
|
8062
8062
|
});
|
|
@@ -8103,7 +8103,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8103
8103
|
for (const handler of this.eventHandlers) {
|
|
8104
8104
|
await handler.onEnvelopeReplied?.(trackedEnvelope, envelope);
|
|
8105
8105
|
}
|
|
8106
|
-
logger$
|
|
8106
|
+
logger$16.debug('tracked_envelope_replied', {
|
|
8107
8107
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
8108
8108
|
corr_id: envelope.corrId,
|
|
8109
8109
|
});
|
|
@@ -8177,7 +8177,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8177
8177
|
async addToInboxDlq(trackedEnvelope, reason = null) {
|
|
8178
8178
|
const dlq = this.inboxDlq;
|
|
8179
8179
|
if (!dlq) {
|
|
8180
|
-
logger$
|
|
8180
|
+
logger$16.error('dlq_not_initialized', {
|
|
8181
8181
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
8182
8182
|
});
|
|
8183
8183
|
return;
|
|
@@ -8192,7 +8192,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8192
8192
|
const deadLetteredAt = Date.now();
|
|
8193
8193
|
setMetaWithLegacy(trackedEnvelope.meta, 'deadLetteredAtMs', 'dead_lettered_at_ms', deadLetteredAt);
|
|
8194
8194
|
await dlq.set(trackedEnvelope.originalEnvelope.id, trackedEnvelope);
|
|
8195
|
-
logger$
|
|
8195
|
+
logger$16.warning('envelope_moved_to_dlq', {
|
|
8196
8196
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
8197
8197
|
service_name: trackedEnvelope.serviceName,
|
|
8198
8198
|
});
|
|
@@ -8221,7 +8221,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8221
8221
|
const toDelete = Object.entries(items).filter(([, value]) => predicate ? predicate(value) : true);
|
|
8222
8222
|
await Promise.all(toDelete.map(([key]) => dlq.delete(key)));
|
|
8223
8223
|
if (toDelete.length) {
|
|
8224
|
-
logger$
|
|
8224
|
+
logger$16.debug('dlq_purged', { count: toDelete.length });
|
|
8225
8225
|
}
|
|
8226
8226
|
return toDelete.length;
|
|
8227
8227
|
}
|
|
@@ -8274,11 +8274,11 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8274
8274
|
}
|
|
8275
8275
|
this.futuresSweeper = null;
|
|
8276
8276
|
}
|
|
8277
|
-
logger$
|
|
8277
|
+
logger$16.debug('tracker_cleanup_completed');
|
|
8278
8278
|
}
|
|
8279
8279
|
async recoverPending() {
|
|
8280
8280
|
const pending = await this.listPending();
|
|
8281
|
-
logger$
|
|
8281
|
+
logger$16.debug('tracker_recovering_pending', { count: pending.length });
|
|
8282
8282
|
await this.lock.runExclusive(async () => {
|
|
8283
8283
|
for (const tracked of pending) {
|
|
8284
8284
|
if (tracked.expectedResponseType & core.FameResponseType.ACK) {
|
|
@@ -8304,7 +8304,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8304
8304
|
for (const tracked of pending) {
|
|
8305
8305
|
await this.scheduleTimer(tracked, null, null);
|
|
8306
8306
|
}
|
|
8307
|
-
logger$
|
|
8307
|
+
logger$16.debug('tracker_recovery_completed', { count: pending.length });
|
|
8308
8308
|
}
|
|
8309
8309
|
ensureOutbox() {
|
|
8310
8310
|
if (!this.outbox) {
|
|
@@ -8319,7 +8319,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8319
8319
|
return this.inbox;
|
|
8320
8320
|
}
|
|
8321
8321
|
async waitForPendingAcks() {
|
|
8322
|
-
logger$
|
|
8322
|
+
logger$16.debug('tracker_node_preparing_to_stop_waiting_for_pending_acks');
|
|
8323
8323
|
const outbox = this.outbox;
|
|
8324
8324
|
if (!outbox) {
|
|
8325
8325
|
return;
|
|
@@ -8331,7 +8331,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8331
8331
|
continue;
|
|
8332
8332
|
}
|
|
8333
8333
|
if (!future.done) {
|
|
8334
|
-
logger$
|
|
8334
|
+
logger$16.debug('tracker_pending_ack_future_detected', {
|
|
8335
8335
|
envelope_id: envelopeId,
|
|
8336
8336
|
});
|
|
8337
8337
|
pending.push({ envelopeId, future });
|
|
@@ -8339,10 +8339,10 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8339
8339
|
}
|
|
8340
8340
|
});
|
|
8341
8341
|
if (!pending.length) {
|
|
8342
|
-
logger$
|
|
8342
|
+
logger$16.debug('tracker_no_pending_acks_to_wait_for');
|
|
8343
8343
|
return;
|
|
8344
8344
|
}
|
|
8345
|
-
logger$
|
|
8345
|
+
logger$16.debug('tracker_waiting_for_pending_acks', { count: pending.length });
|
|
8346
8346
|
for (const entry of pending) {
|
|
8347
8347
|
if (!entry) {
|
|
8348
8348
|
continue;
|
|
@@ -8359,19 +8359,19 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8359
8359
|
}
|
|
8360
8360
|
try {
|
|
8361
8361
|
await this.awaitWithTimeout(entry.future.promise, remainingMs);
|
|
8362
|
-
logger$
|
|
8362
|
+
logger$16.debug('tracker_received_ack', {
|
|
8363
8363
|
envelope_id: entry.envelopeId,
|
|
8364
8364
|
});
|
|
8365
8365
|
await outbox.delete(entry.envelopeId);
|
|
8366
8366
|
}
|
|
8367
8367
|
catch (error) {
|
|
8368
8368
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
8369
|
-
logger$
|
|
8369
|
+
logger$16.debug('tracker_ack_timeout_expired', {
|
|
8370
8370
|
envelope_id: entry.envelopeId,
|
|
8371
8371
|
});
|
|
8372
8372
|
}
|
|
8373
8373
|
else {
|
|
8374
|
-
logger$
|
|
8374
|
+
logger$16.debug('tracker_ack_wait_error', {
|
|
8375
8375
|
envelope_id: entry.envelopeId,
|
|
8376
8376
|
error: error instanceof Error ? error.message : String(error),
|
|
8377
8377
|
});
|
|
@@ -8379,13 +8379,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8379
8379
|
}
|
|
8380
8380
|
}
|
|
8381
8381
|
catch (error) {
|
|
8382
|
-
logger$
|
|
8382
|
+
logger$16.error('tracker_error_waiting_for_ack', {
|
|
8383
8383
|
envelope_id: entry.envelopeId,
|
|
8384
8384
|
error: error instanceof Error ? error.message : String(error),
|
|
8385
8385
|
});
|
|
8386
8386
|
}
|
|
8387
8387
|
}
|
|
8388
|
-
logger$
|
|
8388
|
+
logger$16.debug('tracker_finished_waiting_for_pending_acks');
|
|
8389
8389
|
}
|
|
8390
8390
|
async waitForPendingAckDispatches() {
|
|
8391
8391
|
while (this.pendingAckDispatches.size > 0) {
|
|
@@ -8443,7 +8443,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8443
8443
|
for (const handler of this.eventHandlers) {
|
|
8444
8444
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
8445
8445
|
}
|
|
8446
|
-
logger$
|
|
8446
|
+
logger$16.debug('tracker_envelope_timed_out', {
|
|
8447
8447
|
envp_id: tracked.originalEnvelope.id,
|
|
8448
8448
|
});
|
|
8449
8449
|
return;
|
|
@@ -8456,7 +8456,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8456
8456
|
currentTracked.timeoutAtMs = nextTimeoutAt;
|
|
8457
8457
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
8458
8458
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
8459
|
-
logger$
|
|
8459
|
+
logger$16.debug('tracker_retry_deferred_during_shutdown', {
|
|
8460
8460
|
envp_id: tracked.originalEnvelope.id,
|
|
8461
8461
|
defer_ms: shutdownDeferMs,
|
|
8462
8462
|
});
|
|
@@ -8479,7 +8479,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8479
8479
|
});
|
|
8480
8480
|
}
|
|
8481
8481
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
8482
|
-
logger$
|
|
8482
|
+
logger$16.debug('envelope_delivery_retry_scheduled', {
|
|
8483
8483
|
envp_id: tracked.originalEnvelope.id,
|
|
8484
8484
|
attempt: currentTracked.attempt,
|
|
8485
8485
|
max_retries: retryPolicy.maxRetries,
|
|
@@ -8491,7 +8491,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8491
8491
|
currentTracked.timeoutAtMs = currentTracked.overallTimeoutAtMs;
|
|
8492
8492
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
8493
8493
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
8494
|
-
logger$
|
|
8494
|
+
logger$16.debug('envelope_retries_exhausted_waiting_until_overall_timeout', {
|
|
8495
8495
|
envp_id: tracked.originalEnvelope.id,
|
|
8496
8496
|
attempt: currentTracked.attempt,
|
|
8497
8497
|
overall_timeout_at_ms: currentTracked.overallTimeoutAtMs,
|
|
@@ -8511,7 +8511,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8511
8511
|
for (const handler of this.eventHandlers) {
|
|
8512
8512
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
8513
8513
|
}
|
|
8514
|
-
logger$
|
|
8514
|
+
logger$16.debug('tracker_envelope_timed_out', {
|
|
8515
8515
|
envp_id: tracked.originalEnvelope.id,
|
|
8516
8516
|
});
|
|
8517
8517
|
}
|
|
@@ -8519,7 +8519,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8519
8519
|
if (error instanceof TaskCancelledError) {
|
|
8520
8520
|
return;
|
|
8521
8521
|
}
|
|
8522
|
-
logger$
|
|
8522
|
+
logger$16.error('tracker_timer_error', {
|
|
8523
8523
|
envp_id: tracked.originalEnvelope.id,
|
|
8524
8524
|
error: error instanceof Error ? error.message : String(error),
|
|
8525
8525
|
});
|
|
@@ -8574,7 +8574,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8574
8574
|
if (timeoutSeconds !== null) {
|
|
8575
8575
|
return await this.awaitWithTimeout(future.promise, timeoutSeconds);
|
|
8576
8576
|
}
|
|
8577
|
-
logger$
|
|
8577
|
+
logger$16.debug('await_envelope_no_timeout_wait', {
|
|
8578
8578
|
envelope_id: envelopeId,
|
|
8579
8579
|
});
|
|
8580
8580
|
return await future.promise;
|
|
@@ -8583,7 +8583,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8583
8583
|
if (error instanceof Error && error.name !== 'TimeoutError') {
|
|
8584
8584
|
throw error;
|
|
8585
8585
|
}
|
|
8586
|
-
logger$
|
|
8586
|
+
logger$16.error('await_envelope_timeout_error', {
|
|
8587
8587
|
envelope_id: envelopeId,
|
|
8588
8588
|
timeout_ms: timeoutSeconds,
|
|
8589
8589
|
future_done: false,
|
|
@@ -8744,7 +8744,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8744
8744
|
this.replyDoneSince.delete(envId);
|
|
8745
8745
|
}
|
|
8746
8746
|
});
|
|
8747
|
-
logger$
|
|
8747
|
+
logger$16.debug('tracker_swept_completed_futures', {
|
|
8748
8748
|
ack_removed: toRemoveAck.length,
|
|
8749
8749
|
reply_removed: toRemoveReply.length,
|
|
8750
8750
|
grace_secs: this.futGcGraceSecs,
|
|
@@ -8758,7 +8758,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8758
8758
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
8759
8759
|
continue;
|
|
8760
8760
|
}
|
|
8761
|
-
logger$
|
|
8761
|
+
logger$16.error('tracker_sweeper_error', {
|
|
8762
8762
|
error: error instanceof Error ? error.message : String(error),
|
|
8763
8763
|
});
|
|
8764
8764
|
}
|
|
@@ -8789,14 +8789,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8789
8789
|
}
|
|
8790
8790
|
const node = this.node;
|
|
8791
8791
|
if (!envelope.replyTo) {
|
|
8792
|
-
logger$
|
|
8792
|
+
logger$16.error('cannot_send_ack_no_reply_to', { envp_id: envelope.id });
|
|
8793
8793
|
return;
|
|
8794
8794
|
}
|
|
8795
8795
|
if (!envelope.corrId) {
|
|
8796
|
-
logger$
|
|
8796
|
+
logger$16.error('cannot_send_ack_no_corr_id', { envp_id: envelope.id });
|
|
8797
8797
|
return;
|
|
8798
8798
|
}
|
|
8799
|
-
logger$
|
|
8799
|
+
logger$16.debug('tracker_sending_ack', {
|
|
8800
8800
|
envp_id: envelope.id,
|
|
8801
8801
|
ref_id: envelope.id,
|
|
8802
8802
|
to: envelope.replyTo,
|
|
@@ -8816,7 +8816,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8816
8816
|
.send(ackEnvelope)
|
|
8817
8817
|
.then(() => undefined)
|
|
8818
8818
|
.catch((error) => {
|
|
8819
|
-
logger$
|
|
8819
|
+
logger$16.error('tracker_ack_dispatch_failed', {
|
|
8820
8820
|
envp_id: envelope.id,
|
|
8821
8821
|
error: error instanceof Error ? error.message : String(error),
|
|
8822
8822
|
});
|
|
@@ -8902,7 +8902,7 @@ class AsyncEvent {
|
|
|
8902
8902
|
}
|
|
8903
8903
|
}
|
|
8904
8904
|
|
|
8905
|
-
const logger$
|
|
8905
|
+
const logger$15 = getLogger('naylence.fame.node.root_session_manager');
|
|
8906
8906
|
function resolveOption$1(options, primary, ...aliases) {
|
|
8907
8907
|
const record = options;
|
|
8908
8908
|
const primaryKey = primary;
|
|
@@ -8983,7 +8983,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
8983
8983
|
this.onAdmissionFailed =
|
|
8984
8984
|
typeof onAdmissionFailed === 'function' ? onAdmissionFailed : undefined;
|
|
8985
8985
|
this.enableContinuousRefresh = enableContinuousRefresh ?? true;
|
|
8986
|
-
logger$
|
|
8986
|
+
logger$15.debug('created_root_session_manager');
|
|
8987
8987
|
}
|
|
8988
8988
|
get isReady() {
|
|
8989
8989
|
return this.readyEvent.isSet();
|
|
@@ -9008,7 +9008,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9008
9008
|
if (this.admissionTask) {
|
|
9009
9009
|
return;
|
|
9010
9010
|
}
|
|
9011
|
-
logger$
|
|
9011
|
+
logger$15.debug('root_session_manager_starting');
|
|
9012
9012
|
this.stopEvent.clear();
|
|
9013
9013
|
this.readyEvent.clear();
|
|
9014
9014
|
const taskName = `root-admission-${this.admissionEpoch}`;
|
|
@@ -9028,10 +9028,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9028
9028
|
await this.admissionTask.promise;
|
|
9029
9029
|
throw new FameConnectError('Root session manager failed to become ready');
|
|
9030
9030
|
}
|
|
9031
|
-
logger$
|
|
9031
|
+
logger$15.debug('root_session_manager_started');
|
|
9032
9032
|
}
|
|
9033
9033
|
async stop() {
|
|
9034
|
-
logger$
|
|
9034
|
+
logger$15.debug('root_session_manager_stopping');
|
|
9035
9035
|
this.stopEvent.set();
|
|
9036
9036
|
if (this.admissionTask) {
|
|
9037
9037
|
this.admissionTask.cancel();
|
|
@@ -9043,7 +9043,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9043
9043
|
await this.consumeTask(this.expiryGuardTask);
|
|
9044
9044
|
this.expiryGuardTask = null;
|
|
9045
9045
|
}
|
|
9046
|
-
logger$
|
|
9046
|
+
logger$15.debug('root_session_manager_stopped');
|
|
9047
9047
|
}
|
|
9048
9048
|
async awaitReady(timeoutMs) {
|
|
9049
9049
|
if (this.isReady) {
|
|
@@ -9084,12 +9084,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9084
9084
|
await this.onEpochChange(epoch);
|
|
9085
9085
|
}
|
|
9086
9086
|
else {
|
|
9087
|
-
logger$
|
|
9087
|
+
logger$15.debug('epoch_change_ignored_no_handler', { epoch });
|
|
9088
9088
|
}
|
|
9089
9089
|
}
|
|
9090
9090
|
static createForRootSentinel(node, admissionClient, requestedLogicals = [], enableContinuousRefresh = true, onEpochChange) {
|
|
9091
9091
|
const handleWelcome = async (frame) => {
|
|
9092
|
-
logger$
|
|
9092
|
+
logger$15.info('root_admission_successful', {
|
|
9093
9093
|
system_id: frame.systemId,
|
|
9094
9094
|
assigned_path: frame.assignedPath ?? null,
|
|
9095
9095
|
accepted_logicals: frame.acceptedLogicals ?? [],
|
|
@@ -9100,12 +9100,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9100
9100
|
? grant.purpose
|
|
9101
9101
|
: undefined;
|
|
9102
9102
|
if (purpose) {
|
|
9103
|
-
logger$
|
|
9103
|
+
logger$15.debug('received_admission_grant', { purpose });
|
|
9104
9104
|
}
|
|
9105
9105
|
}
|
|
9106
9106
|
};
|
|
9107
9107
|
const handleFailure = async (error) => {
|
|
9108
|
-
logger$
|
|
9108
|
+
logger$15.error('root_admission_failed_permanently', {
|
|
9109
9109
|
error: error.message,
|
|
9110
9110
|
});
|
|
9111
9111
|
};
|
|
@@ -9134,10 +9134,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9134
9134
|
this.readyEvent.set();
|
|
9135
9135
|
}
|
|
9136
9136
|
if (this.hadSuccessfulAdmission) {
|
|
9137
|
-
logger$
|
|
9137
|
+
logger$15.debug('root_admission_refreshed');
|
|
9138
9138
|
}
|
|
9139
9139
|
else {
|
|
9140
|
-
logger$
|
|
9140
|
+
logger$15.debug('root_admission_completed');
|
|
9141
9141
|
}
|
|
9142
9142
|
this.hadSuccessfulAdmission = true;
|
|
9143
9143
|
delay = RootSessionManager.BACKOFF_INITIAL;
|
|
@@ -9146,7 +9146,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9146
9146
|
await this.startExpiryGuard(welcomeFrame);
|
|
9147
9147
|
const expiryTriggered = await this.waitForExpiryOrStop();
|
|
9148
9148
|
if (expiryTriggered && !this.stopEvent.isSet()) {
|
|
9149
|
-
logger$
|
|
9149
|
+
logger$15.debug('performing_scheduled_re_admission');
|
|
9150
9150
|
continue;
|
|
9151
9151
|
}
|
|
9152
9152
|
}
|
|
@@ -9158,7 +9158,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9158
9158
|
}
|
|
9159
9159
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
9160
9160
|
const willRetry = attempts < RootSessionManager.RETRY_MAX_ATTEMPTS;
|
|
9161
|
-
logger$
|
|
9161
|
+
logger$15.warning('root_admission_failed', {
|
|
9162
9162
|
error: errorObject.message,
|
|
9163
9163
|
attempt: attempts,
|
|
9164
9164
|
will_retry: willRetry,
|
|
@@ -9176,7 +9176,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9176
9176
|
}
|
|
9177
9177
|
}
|
|
9178
9178
|
if (attempts >= RootSessionManager.RETRY_MAX_ATTEMPTS) {
|
|
9179
|
-
logger$
|
|
9179
|
+
logger$15.error('root_admission_max_attempts_exceeded', {
|
|
9180
9180
|
max_attempts: RootSessionManager.RETRY_MAX_ATTEMPTS,
|
|
9181
9181
|
});
|
|
9182
9182
|
}
|
|
@@ -9253,7 +9253,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9253
9253
|
}
|
|
9254
9254
|
async expiryGuard(welcomeFrame, signal) {
|
|
9255
9255
|
if (!welcomeFrame.expiresAt) {
|
|
9256
|
-
logger$
|
|
9256
|
+
logger$15.debug('no_admission_expiry_configured');
|
|
9257
9257
|
await Promise.race([this.stopEvent.wait(), this.waitForAbort(signal)]);
|
|
9258
9258
|
return;
|
|
9259
9259
|
}
|
|
@@ -9262,7 +9262,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9262
9262
|
let delaySeconds = (expiresAt.getTime() - now.getTime()) / 1000 -
|
|
9263
9263
|
RootSessionManager.JWT_REFRESH_SAFETY;
|
|
9264
9264
|
delaySeconds = Math.max(delaySeconds, 0);
|
|
9265
|
-
logger$
|
|
9265
|
+
logger$15.debug('admission_expiry_guard_started', {
|
|
9266
9266
|
welcome_expires_at: expiresAt.toISOString(),
|
|
9267
9267
|
delay_seconds: delaySeconds,
|
|
9268
9268
|
refresh_safety_seconds: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -9271,7 +9271,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9271
9271
|
if (this.stopEvent.isSet() || signal?.aborted) {
|
|
9272
9272
|
return;
|
|
9273
9273
|
}
|
|
9274
|
-
logger$
|
|
9274
|
+
logger$15.debug('admission_expiry_triggered_refresh', {
|
|
9275
9275
|
expires_at: expiresAt.toISOString(),
|
|
9276
9276
|
current_time: new Date().toISOString(),
|
|
9277
9277
|
seconds_before_expiry: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -9286,7 +9286,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9286
9286
|
return;
|
|
9287
9287
|
}
|
|
9288
9288
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
9289
|
-
logger$
|
|
9289
|
+
logger$15.debug('background_task_error', {
|
|
9290
9290
|
task_name: task.name,
|
|
9291
9291
|
error: errorObject.message,
|
|
9292
9292
|
});
|
|
@@ -9327,7 +9327,7 @@ RootSessionManager.JWT_REFRESH_SAFETY = 60.0;
|
|
|
9327
9327
|
* Concrete implementations must define supported grant types and provide grant-to-connector
|
|
9328
9328
|
* conversion logic.
|
|
9329
9329
|
*/
|
|
9330
|
-
const logger$
|
|
9330
|
+
const logger$14 = getLogger('naylence.fame.connector.connector_factory');
|
|
9331
9331
|
const CONNECTOR_FACTORY_BASE_TYPE = 'ConnectorFactory';
|
|
9332
9332
|
/**
|
|
9333
9333
|
* Abstract base class for connector factories
|
|
@@ -9363,7 +9363,7 @@ class ConnectorFactory {
|
|
|
9363
9363
|
}
|
|
9364
9364
|
}
|
|
9365
9365
|
catch (error) {
|
|
9366
|
-
logger$
|
|
9366
|
+
logger$14.warning(`Failed to evaluate grant with factory ${factoryInfo.constructor.name}: ${error}`);
|
|
9367
9367
|
continue;
|
|
9368
9368
|
}
|
|
9369
9369
|
}
|
|
@@ -9406,7 +9406,7 @@ class ConnectorFactory {
|
|
|
9406
9406
|
}
|
|
9407
9407
|
}
|
|
9408
9408
|
catch (error) {
|
|
9409
|
-
logger$
|
|
9409
|
+
logger$14.warning(`Failed to create connector config from grant: ${error}`);
|
|
9410
9410
|
continue;
|
|
9411
9411
|
}
|
|
9412
9412
|
}
|
|
@@ -9473,20 +9473,20 @@ class ConnectorFactory {
|
|
|
9473
9473
|
return existing;
|
|
9474
9474
|
}
|
|
9475
9475
|
if (existing && !this.isGrantAware(existing)) {
|
|
9476
|
-
logger$
|
|
9476
|
+
logger$14.warning(`Factory ${factoryInfo.constructor.name} is registered under ${CONNECTOR_FACTORY_BASE_TYPE} but is missing grant conversion APIs; skipping.`);
|
|
9477
9477
|
return null;
|
|
9478
9478
|
}
|
|
9479
9479
|
try {
|
|
9480
9480
|
const instance = new factoryInfo.constructor();
|
|
9481
9481
|
if (!this.isGrantAware(instance)) {
|
|
9482
|
-
logger$
|
|
9482
|
+
logger$14.warning(`Factory ${factoryInfo.constructor.name} does not implement grant conversion APIs required by ${CONNECTOR_FACTORY_BASE_TYPE}; skipping.`);
|
|
9483
9483
|
return null;
|
|
9484
9484
|
}
|
|
9485
9485
|
factoryInfo.instance = instance;
|
|
9486
9486
|
return instance;
|
|
9487
9487
|
}
|
|
9488
9488
|
catch (error) {
|
|
9489
|
-
logger$
|
|
9489
|
+
logger$14.warning(`Failed to instantiate factory ${factoryInfo.constructor.name} while resolving grant conversion APIs: ${error}`);
|
|
9490
9490
|
return null;
|
|
9491
9491
|
}
|
|
9492
9492
|
}
|
|
@@ -9589,7 +9589,7 @@ class TaskCancellationError extends Error {
|
|
|
9589
9589
|
this.name = 'TaskCancellationError';
|
|
9590
9590
|
}
|
|
9591
9591
|
}
|
|
9592
|
-
const logger$
|
|
9592
|
+
const logger$13 = getLogger('naylence.fame.connector.base_async_connector');
|
|
9593
9593
|
// Environment variables
|
|
9594
9594
|
const ENV_VAR_FAME_FLOW_CONTROL = 'FAME_FLOW_CONTROL';
|
|
9595
9595
|
const FLOW_CONTROL_ENABLED = typeof process !== 'undefined' && process?.env
|
|
@@ -9672,7 +9672,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9672
9672
|
if (this._state !== newState) {
|
|
9673
9673
|
const oldState = this._state;
|
|
9674
9674
|
this._state = newState;
|
|
9675
|
-
logger$
|
|
9675
|
+
logger$13.debug('connector_state_transition', {
|
|
9676
9676
|
connector_id: this._connectorFlowId,
|
|
9677
9677
|
old_state: oldState,
|
|
9678
9678
|
new_state: newState,
|
|
@@ -9711,12 +9711,12 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9711
9711
|
* Stop the connector gracefully
|
|
9712
9712
|
*/
|
|
9713
9713
|
async stop() {
|
|
9714
|
-
logger$
|
|
9714
|
+
logger$13.debug('stopping_connector', {
|
|
9715
9715
|
current_state: this._state,
|
|
9716
9716
|
connector_id: this._connectorFlowId,
|
|
9717
9717
|
});
|
|
9718
9718
|
if (!core.ConnectorStateUtils.canStop(this._state)) {
|
|
9719
|
-
logger$
|
|
9719
|
+
logger$13.debug('connector_stop_already_stopped', {
|
|
9720
9720
|
current_state: this._state,
|
|
9721
9721
|
connector_id: this._connectorFlowId,
|
|
9722
9722
|
});
|
|
@@ -9727,7 +9727,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9727
9727
|
if (this._lastError) {
|
|
9728
9728
|
throw this._lastError;
|
|
9729
9729
|
}
|
|
9730
|
-
logger$
|
|
9730
|
+
logger$13.debug('connector_stopped', {
|
|
9731
9731
|
current_state: this._state,
|
|
9732
9732
|
connector_id: this._connectorFlowId,
|
|
9733
9733
|
});
|
|
@@ -9736,19 +9736,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9736
9736
|
* Pause the connector (suspends heartbeat and housekeeping, but keeps connection alive)
|
|
9737
9737
|
*/
|
|
9738
9738
|
async pause() {
|
|
9739
|
-
logger$
|
|
9739
|
+
logger$13.debug('pausing_connector', {
|
|
9740
9740
|
current_state: this._state,
|
|
9741
9741
|
connector_id: this._connectorFlowId,
|
|
9742
9742
|
});
|
|
9743
9743
|
if (this._state !== core.ConnectorState.STARTED) {
|
|
9744
|
-
logger$
|
|
9744
|
+
logger$13.debug('connector_pause_invalid_state', {
|
|
9745
9745
|
current_state: this._state,
|
|
9746
9746
|
connector_id: this._connectorFlowId,
|
|
9747
9747
|
});
|
|
9748
9748
|
return;
|
|
9749
9749
|
}
|
|
9750
9750
|
this._setState(core.ConnectorState.PAUSED);
|
|
9751
|
-
logger$
|
|
9751
|
+
logger$13.debug('connector_paused', {
|
|
9752
9752
|
current_state: this._state,
|
|
9753
9753
|
connector_id: this._connectorFlowId,
|
|
9754
9754
|
});
|
|
@@ -9757,19 +9757,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9757
9757
|
* Resume the connector from paused state
|
|
9758
9758
|
*/
|
|
9759
9759
|
async resume() {
|
|
9760
|
-
logger$
|
|
9760
|
+
logger$13.debug('resuming_connector', {
|
|
9761
9761
|
current_state: this._state,
|
|
9762
9762
|
connector_id: this._connectorFlowId,
|
|
9763
9763
|
});
|
|
9764
9764
|
if (this._state !== core.ConnectorState.PAUSED) {
|
|
9765
|
-
logger$
|
|
9765
|
+
logger$13.debug('connector_resume_invalid_state', {
|
|
9766
9766
|
current_state: this._state,
|
|
9767
9767
|
connector_id: this._connectorFlowId,
|
|
9768
9768
|
});
|
|
9769
9769
|
return;
|
|
9770
9770
|
}
|
|
9771
9771
|
this._setState(core.ConnectorState.STARTED);
|
|
9772
|
-
logger$
|
|
9772
|
+
logger$13.debug('connector_resumed', {
|
|
9773
9773
|
current_state: this._state,
|
|
9774
9774
|
connector_id: this._connectorFlowId,
|
|
9775
9775
|
});
|
|
@@ -9779,7 +9779,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9779
9779
|
*/
|
|
9780
9780
|
async close(code = 1000, reason = 'normal closure') {
|
|
9781
9781
|
if (!core.ConnectorStateUtils.canClose(this._state)) {
|
|
9782
|
-
logger$
|
|
9782
|
+
logger$13.warning('connector_close_invalid_state', {
|
|
9783
9783
|
current_state: this._state,
|
|
9784
9784
|
connector_id: this._connectorFlowId,
|
|
9785
9785
|
});
|
|
@@ -9860,7 +9860,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9860
9860
|
// Add to queue and notify send loop
|
|
9861
9861
|
this._sendQueue.push(raw);
|
|
9862
9862
|
// Log for debugging
|
|
9863
|
-
logger$
|
|
9863
|
+
logger$13.debug('send_envelope_queued', {
|
|
9864
9864
|
queue_length: this._sendQueue.length,
|
|
9865
9865
|
max_queue_size: this._maxQueueSize,
|
|
9866
9866
|
});
|
|
@@ -9909,14 +9909,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9909
9909
|
const item = this._sendQueue[0];
|
|
9910
9910
|
if (!item)
|
|
9911
9911
|
continue;
|
|
9912
|
-
logger$
|
|
9912
|
+
logger$13.debug('send_loop_processing_item', {
|
|
9913
9913
|
queue_length_before_send: this._sendQueue.length,
|
|
9914
9914
|
});
|
|
9915
9915
|
// Send through transport (this may block)
|
|
9916
9916
|
await this._transportSendBytes(item);
|
|
9917
9917
|
// Only remove from queue after successful send
|
|
9918
9918
|
this._sendQueue.shift();
|
|
9919
|
-
logger$
|
|
9919
|
+
logger$13.debug('send_loop_item_sent', {
|
|
9920
9920
|
queue_length_after_send: this._sendQueue.length,
|
|
9921
9921
|
});
|
|
9922
9922
|
}
|
|
@@ -9929,14 +9929,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9929
9929
|
}
|
|
9930
9930
|
else if (error instanceof TaskCancellationError) {
|
|
9931
9931
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
9932
|
-
logger$
|
|
9932
|
+
logger$13.debug('send loop cancelled', {
|
|
9933
9933
|
connector: this.constructor.name,
|
|
9934
9934
|
reason: error.message,
|
|
9935
9935
|
});
|
|
9936
9936
|
// Don't re-throw - this is normal during shutdown
|
|
9937
9937
|
}
|
|
9938
9938
|
else {
|
|
9939
|
-
logger$
|
|
9939
|
+
logger$13.critical('unexpected exception in send loop', {
|
|
9940
9940
|
connector: this.constructor.name,
|
|
9941
9941
|
error: error instanceof Error ? error.message : String(error),
|
|
9942
9942
|
});
|
|
@@ -9977,7 +9977,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9977
9977
|
env = JSON.parse(jsonStr);
|
|
9978
9978
|
}
|
|
9979
9979
|
catch (error) {
|
|
9980
|
-
logger$
|
|
9980
|
+
logger$13.error('Invalid envelope', {
|
|
9981
9981
|
message: message.toString(),
|
|
9982
9982
|
error: error instanceof Error ? error.message : String(error),
|
|
9983
9983
|
});
|
|
@@ -10001,7 +10001,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10001
10001
|
};
|
|
10002
10002
|
await withEnvelopeContextAsync(envelopeContext, async () => {
|
|
10003
10003
|
const prettyEnvelope = prettyModel$1(env);
|
|
10004
|
-
logger$
|
|
10004
|
+
logger$13.trace('connector_received_envelope', {
|
|
10005
10005
|
envelope: env,
|
|
10006
10006
|
pretty: prettyEnvelope,
|
|
10007
10007
|
});
|
|
@@ -10030,7 +10030,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10030
10030
|
if (error instanceof TaskCancellationError) {
|
|
10031
10031
|
throw error;
|
|
10032
10032
|
}
|
|
10033
|
-
logger$
|
|
10033
|
+
logger$13.error('handler_failed', {
|
|
10034
10034
|
error: error instanceof Error ? error.message : String(error),
|
|
10035
10035
|
envelope_id: env.id ?? null,
|
|
10036
10036
|
trace_id: env.traceId ?? null,
|
|
@@ -10051,14 +10051,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10051
10051
|
}
|
|
10052
10052
|
else if (error instanceof TaskCancellationError) {
|
|
10053
10053
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
10054
|
-
logger$
|
|
10054
|
+
logger$13.debug('receive loop cancelled', {
|
|
10055
10055
|
connector: this.constructor.name,
|
|
10056
10056
|
reason: error.message,
|
|
10057
10057
|
});
|
|
10058
10058
|
// Don't re-throw - this is normal during shutdown
|
|
10059
10059
|
}
|
|
10060
10060
|
else {
|
|
10061
|
-
logger$
|
|
10061
|
+
logger$13.critical('unexpected_error_in recv_loop', {
|
|
10062
10062
|
error: error instanceof Error ? error.message : String(error),
|
|
10063
10063
|
});
|
|
10064
10064
|
throw error;
|
|
@@ -10074,7 +10074,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10074
10074
|
async _maybeEmitCredit(flowId, traceId) {
|
|
10075
10075
|
const remainingCredits = this._flowCtrl.getCredits(flowId);
|
|
10076
10076
|
const needsRefill = this._flowCtrl.needsRefill(flowId);
|
|
10077
|
-
logger$
|
|
10077
|
+
logger$13.debug('maybe_emit_credit_check', {
|
|
10078
10078
|
connector_id: this._connectorFlowId,
|
|
10079
10079
|
flow_id: flowId,
|
|
10080
10080
|
trace_id: traceId ?? null,
|
|
@@ -10090,7 +10090,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10090
10090
|
}
|
|
10091
10091
|
const delta = this._initialWindow;
|
|
10092
10092
|
this._flowCtrl.addCredits(flowId, delta);
|
|
10093
|
-
logger$
|
|
10093
|
+
logger$13.debug('maybe_emit_credit_emit', {
|
|
10094
10094
|
connector_id: this._connectorFlowId,
|
|
10095
10095
|
flow_id: flowId,
|
|
10096
10096
|
trace_id: traceId ?? null,
|
|
@@ -10110,7 +10110,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10110
10110
|
});
|
|
10111
10111
|
try {
|
|
10112
10112
|
await this.send(ackEnv);
|
|
10113
|
-
logger$
|
|
10113
|
+
logger$13.debug('maybe_emit_credit_sent', {
|
|
10114
10114
|
connector_id: this._connectorFlowId,
|
|
10115
10115
|
flow_id: flowId,
|
|
10116
10116
|
trace_id: traceId ?? null,
|
|
@@ -10118,7 +10118,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10118
10118
|
});
|
|
10119
10119
|
}
|
|
10120
10120
|
catch (error) {
|
|
10121
|
-
logger$
|
|
10121
|
+
logger$13.error('maybe_emit_credit_send_failed', {
|
|
10122
10122
|
connector_id: this._connectorFlowId,
|
|
10123
10123
|
flow_id: flowId,
|
|
10124
10124
|
trace_id: traceId ?? null,
|
|
@@ -10143,13 +10143,13 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10143
10143
|
*/
|
|
10144
10144
|
async _shutdown(code, reason, gracePeriod, exc) {
|
|
10145
10145
|
if (this._closed) {
|
|
10146
|
-
logger$
|
|
10146
|
+
logger$13.debug('shutdown_already_closed', {
|
|
10147
10147
|
connector_id: this._connectorFlowId,
|
|
10148
10148
|
current_state: this._state,
|
|
10149
10149
|
});
|
|
10150
10150
|
return;
|
|
10151
10151
|
}
|
|
10152
|
-
logger$
|
|
10152
|
+
logger$13.debug('connector_shutdown_starting', {
|
|
10153
10153
|
connector_id: this._connectorFlowId,
|
|
10154
10154
|
connector_type: this.constructor.name,
|
|
10155
10155
|
code,
|
|
@@ -10179,19 +10179,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10179
10179
|
this._sendPromiseResolve = undefined;
|
|
10180
10180
|
}
|
|
10181
10181
|
// Close transport
|
|
10182
|
-
logger$
|
|
10182
|
+
logger$13.debug('connector_closing_transport', {
|
|
10183
10183
|
connector_id: this._connectorFlowId,
|
|
10184
10184
|
connector_type: this.constructor.name,
|
|
10185
10185
|
timestamp: new Date().toISOString(),
|
|
10186
10186
|
});
|
|
10187
10187
|
await this._transportClose(code, reason);
|
|
10188
|
-
logger$
|
|
10188
|
+
logger$13.debug('connector_transport_closed', {
|
|
10189
10189
|
connector_id: this._connectorFlowId,
|
|
10190
10190
|
connector_type: this.constructor.name,
|
|
10191
10191
|
timestamp: new Date().toISOString(),
|
|
10192
10192
|
});
|
|
10193
10193
|
// Shutdown spawned tasks
|
|
10194
|
-
logger$
|
|
10194
|
+
logger$13.debug('connector_shutting_down_tasks', {
|
|
10195
10195
|
connector_id: this._connectorFlowId,
|
|
10196
10196
|
connector_type: this.constructor.name,
|
|
10197
10197
|
grace_period_ms: effectiveGracePeriod * 1000,
|
|
@@ -10203,14 +10203,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10203
10203
|
gracePeriod: effectiveGracePeriod * 1000, // Convert to milliseconds
|
|
10204
10204
|
joinTimeout: this._shutdownJoinTimeout,
|
|
10205
10205
|
});
|
|
10206
|
-
logger$
|
|
10206
|
+
logger$13.debug('connector_tasks_shutdown_complete', {
|
|
10207
10207
|
connector_id: this._connectorFlowId,
|
|
10208
10208
|
connector_type: this.constructor.name,
|
|
10209
10209
|
timestamp: new Date().toISOString(),
|
|
10210
10210
|
});
|
|
10211
10211
|
}
|
|
10212
10212
|
catch (error) {
|
|
10213
|
-
logger$
|
|
10213
|
+
logger$13.warning('task_shutdown_error', {
|
|
10214
10214
|
connector_id: this._connectorFlowId,
|
|
10215
10215
|
error: error instanceof Error ? error.message : String(error),
|
|
10216
10216
|
});
|
|
@@ -10223,7 +10223,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10223
10223
|
if (this._closeResolver) {
|
|
10224
10224
|
this._closeResolver();
|
|
10225
10225
|
}
|
|
10226
|
-
logger$
|
|
10226
|
+
logger$13.debug('connector_shutdown_complete', {
|
|
10227
10227
|
connector_id: this._connectorFlowId,
|
|
10228
10228
|
connector_type: this.constructor.name,
|
|
10229
10229
|
final_state: this._state,
|
|
@@ -10299,7 +10299,7 @@ class BoundedAsyncQueue {
|
|
|
10299
10299
|
}
|
|
10300
10300
|
}
|
|
10301
10301
|
|
|
10302
|
-
const logger$
|
|
10302
|
+
const logger$12 = getLogger('naylence.fame.connector.broadcast_channel_connector');
|
|
10303
10303
|
const BROADCAST_CHANNEL_CONNECTOR_TYPE = 'broadcast-channel-connector';
|
|
10304
10304
|
const DEFAULT_CHANNEL$7 = 'naylence-fabric';
|
|
10305
10305
|
const DEFAULT_INBOX_CAPACITY$7 = 2048;
|
|
@@ -10388,7 +10388,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10388
10388
|
this.localNodeId = normalizedLocalNodeId;
|
|
10389
10389
|
this.targetNodeId = BroadcastChannelConnector.normalizeTargetNodeId(config.initialTargetNodeId);
|
|
10390
10390
|
this.channel = new BroadcastChannel(this.channelName);
|
|
10391
|
-
logger$
|
|
10391
|
+
logger$12.debug('broadcast_channel_connector_created', {
|
|
10392
10392
|
channel: this.channelName,
|
|
10393
10393
|
connector_id: this.connectorId,
|
|
10394
10394
|
local_node_id: this.localNodeId,
|
|
@@ -10400,7 +10400,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10400
10400
|
this.onMsg = (event) => {
|
|
10401
10401
|
// Guard: Don't process if listener was unregistered
|
|
10402
10402
|
if (!this.listenerRegistered) {
|
|
10403
|
-
logger$
|
|
10403
|
+
logger$12.warning('broadcast_channel_message_after_unregister', {
|
|
10404
10404
|
channel: this.channelName,
|
|
10405
10405
|
connector_id: this.connectorId,
|
|
10406
10406
|
timestamp: new Date().toISOString(),
|
|
@@ -10408,7 +10408,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10408
10408
|
return;
|
|
10409
10409
|
}
|
|
10410
10410
|
const message = event.data;
|
|
10411
|
-
logger$
|
|
10411
|
+
logger$12.debug('broadcast_channel_raw_event', {
|
|
10412
10412
|
channel: this.channelName,
|
|
10413
10413
|
connector_id: this.connectorId,
|
|
10414
10414
|
message_type: message && typeof message === 'object'
|
|
@@ -10424,7 +10424,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10424
10424
|
const busMessage = message;
|
|
10425
10425
|
const senderNodeId = BroadcastChannelConnector.normalizeNodeId(busMessage.senderNodeId);
|
|
10426
10426
|
if (!senderNodeId) {
|
|
10427
|
-
logger$
|
|
10427
|
+
logger$12.debug('broadcast_channel_message_rejected', {
|
|
10428
10428
|
channel: this.channelName,
|
|
10429
10429
|
connector_id: this.connectorId,
|
|
10430
10430
|
reason: 'missing_sender_node_id',
|
|
@@ -10432,7 +10432,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10432
10432
|
return;
|
|
10433
10433
|
}
|
|
10434
10434
|
if (senderNodeId === this.localNodeId) {
|
|
10435
|
-
logger$
|
|
10435
|
+
logger$12.debug('broadcast_channel_message_rejected', {
|
|
10436
10436
|
channel: this.channelName,
|
|
10437
10437
|
connector_id: this.connectorId,
|
|
10438
10438
|
reason: 'self_echo',
|
|
@@ -10446,14 +10446,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10446
10446
|
}
|
|
10447
10447
|
const payload = BroadcastChannelConnector.coercePayload(busMessage.payload);
|
|
10448
10448
|
if (!payload) {
|
|
10449
|
-
logger$
|
|
10449
|
+
logger$12.debug('broadcast_channel_payload_rejected', {
|
|
10450
10450
|
channel: this.channelName,
|
|
10451
10451
|
connector_id: this.connectorId,
|
|
10452
10452
|
reason: 'unrecognized_payload_type',
|
|
10453
10453
|
});
|
|
10454
10454
|
return;
|
|
10455
10455
|
}
|
|
10456
|
-
logger$
|
|
10456
|
+
logger$12.debug('broadcast_channel_message_received', {
|
|
10457
10457
|
channel: this.channelName,
|
|
10458
10458
|
sender_id: message?.senderId,
|
|
10459
10459
|
sender_node_id: senderNodeId,
|
|
@@ -10482,14 +10482,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10482
10482
|
}
|
|
10483
10483
|
catch (error) {
|
|
10484
10484
|
if (error instanceof QueueFullError) {
|
|
10485
|
-
logger$
|
|
10485
|
+
logger$12.warning('broadcast_channel_receive_queue_full', {
|
|
10486
10486
|
channel: this.channelName,
|
|
10487
10487
|
inbox_capacity: this.inboxCapacity,
|
|
10488
10488
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
10489
10489
|
});
|
|
10490
10490
|
}
|
|
10491
10491
|
else {
|
|
10492
|
-
logger$
|
|
10492
|
+
logger$12.error('broadcast_channel_receive_error', {
|
|
10493
10493
|
channel: this.channelName,
|
|
10494
10494
|
error: error instanceof Error ? error.message : String(error),
|
|
10495
10495
|
});
|
|
@@ -10503,7 +10503,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10503
10503
|
// Setup visibility change monitoring
|
|
10504
10504
|
this.visibilityChangeHandler = () => {
|
|
10505
10505
|
const isHidden = document.hidden;
|
|
10506
|
-
logger$
|
|
10506
|
+
logger$12.debug('broadcast_channel_visibility_changed', {
|
|
10507
10507
|
channel: this.channelName,
|
|
10508
10508
|
connector_id: this.connectorId,
|
|
10509
10509
|
visibility: isHidden ? 'hidden' : 'visible',
|
|
@@ -10512,7 +10512,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10512
10512
|
// Pause/resume connector based on visibility
|
|
10513
10513
|
if (isHidden && this.state === core.ConnectorState.STARTED) {
|
|
10514
10514
|
this.pause().catch((err) => {
|
|
10515
|
-
logger$
|
|
10515
|
+
logger$12.warning('broadcast_channel_pause_failed', {
|
|
10516
10516
|
channel: this.channelName,
|
|
10517
10517
|
connector_id: this.connectorId,
|
|
10518
10518
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -10521,7 +10521,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10521
10521
|
}
|
|
10522
10522
|
else if (!isHidden && this.state === core.ConnectorState.PAUSED) {
|
|
10523
10523
|
this.resume().catch((err) => {
|
|
10524
|
-
logger$
|
|
10524
|
+
logger$12.warning('broadcast_channel_resume_failed', {
|
|
10525
10525
|
channel: this.channelName,
|
|
10526
10526
|
connector_id: this.connectorId,
|
|
10527
10527
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -10535,7 +10535,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10535
10535
|
// Track page lifecycle events to detect browser unload/discard
|
|
10536
10536
|
if (typeof window !== 'undefined') {
|
|
10537
10537
|
const lifecycleLogger = (event) => {
|
|
10538
|
-
logger$
|
|
10538
|
+
logger$12.debug('broadcast_channel_page_lifecycle', {
|
|
10539
10539
|
channel: this.channelName,
|
|
10540
10540
|
connector_id: this.connectorId,
|
|
10541
10541
|
event_type: event.type,
|
|
@@ -10551,7 +10551,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10551
10551
|
document.addEventListener('resume', lifecycleLogger);
|
|
10552
10552
|
}
|
|
10553
10553
|
// Log initial state with detailed visibility info
|
|
10554
|
-
logger$
|
|
10554
|
+
logger$12.debug('broadcast_channel_initial_visibility', {
|
|
10555
10555
|
channel: this.channelName,
|
|
10556
10556
|
connector_id: this.connectorId,
|
|
10557
10557
|
visibility: document.hidden ? 'hidden' : 'visible',
|
|
@@ -10583,14 +10583,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10583
10583
|
}
|
|
10584
10584
|
catch (error) {
|
|
10585
10585
|
if (error instanceof QueueFullError) {
|
|
10586
|
-
logger$
|
|
10586
|
+
logger$12.warning('broadcast_channel_push_queue_full', {
|
|
10587
10587
|
channel: this.channelName,
|
|
10588
10588
|
inbox_capacity: this.inboxCapacity,
|
|
10589
10589
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
10590
10590
|
});
|
|
10591
10591
|
throw error;
|
|
10592
10592
|
}
|
|
10593
|
-
logger$
|
|
10593
|
+
logger$12.error('broadcast_channel_push_failed', {
|
|
10594
10594
|
channel: this.channelName,
|
|
10595
10595
|
error: error instanceof Error ? error.message : String(error),
|
|
10596
10596
|
});
|
|
@@ -10600,7 +10600,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10600
10600
|
async _transportSendBytes(data) {
|
|
10601
10601
|
ensureBroadcastEnvironment();
|
|
10602
10602
|
const targetNodeId = this.targetNodeId ?? '*';
|
|
10603
|
-
logger$
|
|
10603
|
+
logger$12.debug('broadcast_channel_message_sending', {
|
|
10604
10604
|
channel: this.channelName,
|
|
10605
10605
|
sender_id: this.connectorId,
|
|
10606
10606
|
sender_node_id: this.localNodeId,
|
|
@@ -10621,7 +10621,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10621
10621
|
return item;
|
|
10622
10622
|
}
|
|
10623
10623
|
async _transportClose(code, reason) {
|
|
10624
|
-
logger$
|
|
10624
|
+
logger$12.debug('broadcast_channel_transport_closing', {
|
|
10625
10625
|
channel: this.channelName,
|
|
10626
10626
|
connector_id: this.connectorId,
|
|
10627
10627
|
code,
|
|
@@ -10630,14 +10630,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10630
10630
|
timestamp: new Date().toISOString(),
|
|
10631
10631
|
});
|
|
10632
10632
|
if (this.listenerRegistered) {
|
|
10633
|
-
logger$
|
|
10633
|
+
logger$12.debug('broadcast_channel_removing_listener', {
|
|
10634
10634
|
channel: this.channelName,
|
|
10635
10635
|
connector_id: this.connectorId,
|
|
10636
10636
|
timestamp: new Date().toISOString(),
|
|
10637
10637
|
});
|
|
10638
10638
|
this.channel.removeEventListener('message', this.onMsg);
|
|
10639
10639
|
this.listenerRegistered = false;
|
|
10640
|
-
logger$
|
|
10640
|
+
logger$12.debug('broadcast_channel_listener_removed', {
|
|
10641
10641
|
channel: this.channelName,
|
|
10642
10642
|
connector_id: this.connectorId,
|
|
10643
10643
|
timestamp: new Date().toISOString(),
|
|
@@ -10650,13 +10650,13 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10650
10650
|
this.visibilityChangeListenerRegistered = false;
|
|
10651
10651
|
this.visibilityChangeHandler = undefined;
|
|
10652
10652
|
}
|
|
10653
|
-
logger$
|
|
10653
|
+
logger$12.debug('broadcast_channel_closing', {
|
|
10654
10654
|
channel: this.channelName,
|
|
10655
10655
|
connector_id: this.connectorId,
|
|
10656
10656
|
timestamp: new Date().toISOString(),
|
|
10657
10657
|
});
|
|
10658
10658
|
this.channel.close();
|
|
10659
|
-
logger$
|
|
10659
|
+
logger$12.debug('broadcast_channel_closed', {
|
|
10660
10660
|
channel: this.channelName,
|
|
10661
10661
|
connector_id: this.connectorId,
|
|
10662
10662
|
timestamp: new Date().toISOString(),
|
|
@@ -10680,7 +10680,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10680
10680
|
if (targetNodeId &&
|
|
10681
10681
|
targetNodeId !== '*' &&
|
|
10682
10682
|
targetNodeId !== this.localNodeId) {
|
|
10683
|
-
logger$
|
|
10683
|
+
logger$12.debug('broadcast_channel_message_rejected', {
|
|
10684
10684
|
channel: this.channelName,
|
|
10685
10685
|
connector_id: this.connectorId,
|
|
10686
10686
|
reason: 'wildcard_target_mismatch',
|
|
@@ -10696,7 +10696,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10696
10696
|
if (expectedSender &&
|
|
10697
10697
|
expectedSender !== '*' &&
|
|
10698
10698
|
senderNodeId !== expectedSender) {
|
|
10699
|
-
logger$
|
|
10699
|
+
logger$12.debug('broadcast_channel_message_rejected', {
|
|
10700
10700
|
channel: this.channelName,
|
|
10701
10701
|
connector_id: this.connectorId,
|
|
10702
10702
|
reason: 'unexpected_sender',
|
|
@@ -10709,7 +10709,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10709
10709
|
if (targetNodeId &&
|
|
10710
10710
|
targetNodeId !== '*' &&
|
|
10711
10711
|
targetNodeId !== this.localNodeId) {
|
|
10712
|
-
logger$
|
|
10712
|
+
logger$12.debug('broadcast_channel_message_rejected', {
|
|
10713
10713
|
channel: this.channelName,
|
|
10714
10714
|
connector_id: this.connectorId,
|
|
10715
10715
|
reason: 'unexpected_target',
|
|
@@ -10734,7 +10734,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10734
10734
|
return 'unknown';
|
|
10735
10735
|
}
|
|
10736
10736
|
logInboxSnapshot(event, extra = {}) {
|
|
10737
|
-
logger$
|
|
10737
|
+
logger$12.debug(event, {
|
|
10738
10738
|
channel: this.channelName,
|
|
10739
10739
|
connector_id: this.connectorId,
|
|
10740
10740
|
connector_state: this.state,
|
|
@@ -10750,7 +10750,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10750
10750
|
await super.start(inboundHandler);
|
|
10751
10751
|
// After transitioning to STARTED, check if tab is already hidden
|
|
10752
10752
|
if (typeof document !== 'undefined' && document.hidden) {
|
|
10753
|
-
logger$
|
|
10753
|
+
logger$12.debug('broadcast_channel_start_in_hidden_tab', {
|
|
10754
10754
|
channel: this.channelName,
|
|
10755
10755
|
connector_id: this.connectorId,
|
|
10756
10756
|
document_hidden: document.hidden,
|
|
@@ -10760,7 +10760,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10760
10760
|
});
|
|
10761
10761
|
// Immediately pause if tab is hidden at start time
|
|
10762
10762
|
await this.pause().catch((err) => {
|
|
10763
|
-
logger$
|
|
10763
|
+
logger$12.warning('broadcast_channel_initial_pause_failed', {
|
|
10764
10764
|
channel: this.channelName,
|
|
10765
10765
|
connector_id: this.connectorId,
|
|
10766
10766
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -10778,7 +10778,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10778
10778
|
return;
|
|
10779
10779
|
}
|
|
10780
10780
|
this.targetNodeId = normalized;
|
|
10781
|
-
logger$
|
|
10781
|
+
logger$12.debug('broadcast_channel_target_updated', {
|
|
10782
10782
|
channel: this.channelName,
|
|
10783
10783
|
connector_id: this.connectorId,
|
|
10784
10784
|
local_node_id: this.localNodeId,
|
|
@@ -10788,7 +10788,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10788
10788
|
}
|
|
10789
10789
|
setWildcardTarget() {
|
|
10790
10790
|
this.targetNodeId = '*';
|
|
10791
|
-
logger$
|
|
10791
|
+
logger$12.debug('broadcast_channel_target_updated', {
|
|
10792
10792
|
channel: this.channelName,
|
|
10793
10793
|
connector_id: this.connectorId,
|
|
10794
10794
|
local_node_id: this.localNodeId,
|
|
@@ -10961,7 +10961,7 @@ function broadcastChannelGrantToConnectorConfig(grant) {
|
|
|
10961
10961
|
return config;
|
|
10962
10962
|
}
|
|
10963
10963
|
|
|
10964
|
-
const logger$
|
|
10964
|
+
const logger$11 = getLogger('naylence.fame.node.upstream_session_manager');
|
|
10965
10965
|
function isPlainRecord$4(value) {
|
|
10966
10966
|
if (typeof value !== 'object' || value === null) {
|
|
10967
10967
|
return false;
|
|
@@ -11082,7 +11082,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11082
11082
|
this.wrappedHandler = this.makeHeartbeatEnabledHandler(options.inboundHandler);
|
|
11083
11083
|
// Store the connection retry policy (can be null, in which case default behavior applies)
|
|
11084
11084
|
this.connectionRetryPolicy = options.retryPolicy ?? null;
|
|
11085
|
-
logger$
|
|
11085
|
+
logger$11.debug('created_upstream_session_manager', {
|
|
11086
11086
|
target_system_id: this.targetSystemId,
|
|
11087
11087
|
has_retry_policy: this.connectionRetryPolicy !== null,
|
|
11088
11088
|
});
|
|
@@ -11091,23 +11091,23 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11091
11091
|
return this.targetSystemId;
|
|
11092
11092
|
}
|
|
11093
11093
|
setupVisibilityListener() {
|
|
11094
|
-
logger$
|
|
11094
|
+
logger$11.debug('setup_visibility_listener_called', {
|
|
11095
11095
|
has_document: typeof document !== 'undefined',
|
|
11096
11096
|
});
|
|
11097
11097
|
if (typeof document !== 'undefined' && document.addEventListener) {
|
|
11098
11098
|
this._visibilityHandler = () => {
|
|
11099
|
-
logger$
|
|
11099
|
+
logger$11.debug('visibility_change_event_fired', {
|
|
11100
11100
|
state: document.visibilityState,
|
|
11101
11101
|
});
|
|
11102
11102
|
if (document.visibilityState === 'visible') {
|
|
11103
|
-
logger$
|
|
11103
|
+
logger$11.debug('visibility_change_detected_waking_up');
|
|
11104
11104
|
this.wakeEvent.set();
|
|
11105
11105
|
}
|
|
11106
11106
|
};
|
|
11107
11107
|
document.addEventListener('visibilitychange', this._visibilityHandler);
|
|
11108
11108
|
}
|
|
11109
11109
|
else {
|
|
11110
|
-
logger$
|
|
11110
|
+
logger$11.debug('setup_visibility_listener_skipped_no_document');
|
|
11111
11111
|
}
|
|
11112
11112
|
}
|
|
11113
11113
|
teardownVisibilityListener() {
|
|
@@ -11140,13 +11140,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11140
11140
|
}
|
|
11141
11141
|
throw new FameConnectError('Upstream session manager failed to attach');
|
|
11142
11142
|
}
|
|
11143
|
-
logger$
|
|
11143
|
+
logger$11.debug('upstream_session_manager_started');
|
|
11144
11144
|
}
|
|
11145
11145
|
getActiveConnector() {
|
|
11146
11146
|
return this.connector;
|
|
11147
11147
|
}
|
|
11148
11148
|
async stop() {
|
|
11149
|
-
logger$
|
|
11149
|
+
logger$11.debug('upstream_session_manager_stopping');
|
|
11150
11150
|
this.teardownVisibilityListener();
|
|
11151
11151
|
this.stopEvent.set();
|
|
11152
11152
|
this.currentStopSubtasks?.set();
|
|
@@ -11157,7 +11157,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11157
11157
|
}
|
|
11158
11158
|
catch (error) {
|
|
11159
11159
|
if (!(error instanceof TaskCancelledError)) {
|
|
11160
|
-
logger$
|
|
11160
|
+
logger$11.debug('fsm_task_stopped_with_error', {
|
|
11161
11161
|
error: error.message,
|
|
11162
11162
|
});
|
|
11163
11163
|
}
|
|
@@ -11166,13 +11166,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11166
11166
|
}
|
|
11167
11167
|
if (this.connector) {
|
|
11168
11168
|
await this.connector.stop().catch((error) => {
|
|
11169
|
-
logger$
|
|
11169
|
+
logger$11.debug('connector_stop_error', {
|
|
11170
11170
|
error: error.message,
|
|
11171
11171
|
});
|
|
11172
11172
|
});
|
|
11173
11173
|
this.connector = null;
|
|
11174
11174
|
}
|
|
11175
|
-
logger$
|
|
11175
|
+
logger$11.debug('upstream_session_manager_stopped');
|
|
11176
11176
|
}
|
|
11177
11177
|
async send(envelope) {
|
|
11178
11178
|
if (this.messageQueue.length >= UpstreamSessionManager.TX_QUEUE_MAX) {
|
|
@@ -11221,7 +11221,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11221
11221
|
const shouldFailFast = this.shouldFailFastOnError(error);
|
|
11222
11222
|
if (error instanceof FameTransportClose ||
|
|
11223
11223
|
error instanceof FameConnectError) {
|
|
11224
|
-
logger$
|
|
11224
|
+
logger$11.warning('upstream_link_closed', {
|
|
11225
11225
|
error: error.message,
|
|
11226
11226
|
will_retry: !shouldFailFast,
|
|
11227
11227
|
attempt: this.initialAttempts,
|
|
@@ -11234,13 +11234,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11234
11234
|
else {
|
|
11235
11235
|
const err = error;
|
|
11236
11236
|
if (err.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
11237
|
-
logger$
|
|
11237
|
+
logger$11.info('upstream_link_redirecting', {
|
|
11238
11238
|
error: err.message,
|
|
11239
11239
|
will_retry: true,
|
|
11240
11240
|
});
|
|
11241
11241
|
}
|
|
11242
11242
|
else {
|
|
11243
|
-
logger$
|
|
11243
|
+
logger$11.warning('upstream_link_closed', {
|
|
11244
11244
|
error: err.message,
|
|
11245
11245
|
will_retry: !shouldFailFast,
|
|
11246
11246
|
attempt: this.initialAttempts,
|
|
@@ -11284,7 +11284,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11284
11284
|
// If sleep was interrupted by visibility change (user returned to tab),
|
|
11285
11285
|
// reset backoff to initial delay for immediate retry with fresh backoff
|
|
11286
11286
|
if (wasWoken) {
|
|
11287
|
-
logger$
|
|
11287
|
+
logger$11.debug('backoff_reset_on_visibility_change', {
|
|
11288
11288
|
previous_delay: delay,
|
|
11289
11289
|
new_delay: UpstreamSessionManager.BACKOFF_INITIAL,
|
|
11290
11290
|
});
|
|
@@ -11303,7 +11303,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11303
11303
|
// Check if wake event is already set (e.g., visibility just changed)
|
|
11304
11304
|
if (this.wakeEvent.isSet()) {
|
|
11305
11305
|
this.wakeEvent.clear();
|
|
11306
|
-
logger$
|
|
11306
|
+
logger$11.debug('sleep_skipped_wake_event_pending');
|
|
11307
11307
|
return true;
|
|
11308
11308
|
}
|
|
11309
11309
|
let timeout;
|
|
@@ -11320,7 +11320,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11320
11320
|
]);
|
|
11321
11321
|
const wasWoken = this.wakeEvent.isSet();
|
|
11322
11322
|
if (wasWoken) {
|
|
11323
|
-
logger$
|
|
11323
|
+
logger$11.debug('sleep_interrupted_by_wake_event');
|
|
11324
11324
|
this.wakeEvent.clear();
|
|
11325
11325
|
}
|
|
11326
11326
|
if (timeout !== undefined) {
|
|
@@ -11383,7 +11383,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11383
11383
|
await connector.start(this.wrappedHandler);
|
|
11384
11384
|
this.connector = connector;
|
|
11385
11385
|
const callbackGrants = this.node.gatherSupportedCallbackGrants();
|
|
11386
|
-
logger$
|
|
11386
|
+
logger$11.debug('callback_grants_before_augmentation', {
|
|
11387
11387
|
count: callbackGrants.length,
|
|
11388
11388
|
types: callbackGrants.map((g) => g.type),
|
|
11389
11389
|
});
|
|
@@ -11393,7 +11393,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11393
11393
|
const broadcastCallbackGrant = shouldAddBroadcastGrant
|
|
11394
11394
|
? this.createBroadcastCallbackGrant(grant)
|
|
11395
11395
|
: null;
|
|
11396
|
-
logger$
|
|
11396
|
+
logger$11.debug('broadcast_callback_grant_check', {
|
|
11397
11397
|
should_add: shouldAddBroadcastGrant,
|
|
11398
11398
|
grant_created: !!broadcastCallbackGrant,
|
|
11399
11399
|
});
|
|
@@ -11412,12 +11412,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11412
11412
|
const isDuplicate = callbackGrants.some((existing) => JSON.stringify(existing) === JSON.stringify(grant));
|
|
11413
11413
|
if (!isDuplicate) {
|
|
11414
11414
|
callbackGrants.push(grant);
|
|
11415
|
-
logger$
|
|
11415
|
+
logger$11.debug('added_connection_grant_as_callback', {
|
|
11416
11416
|
type: grant.type,
|
|
11417
11417
|
});
|
|
11418
11418
|
}
|
|
11419
11419
|
else {
|
|
11420
|
-
logger$
|
|
11420
|
+
logger$11.debug('skipped_duplicate_connection_grant', {
|
|
11421
11421
|
type: grant.type,
|
|
11422
11422
|
});
|
|
11423
11423
|
}
|
|
@@ -11429,12 +11429,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11429
11429
|
if (broadcastCallbackGrant &&
|
|
11430
11430
|
this.shouldAdvertiseBroadcastGrant(grant, callbackGrants)) {
|
|
11431
11431
|
callbackGrants.push(broadcastCallbackGrant);
|
|
11432
|
-
logger$
|
|
11432
|
+
logger$11.debug('added_broadcast_callback_grant');
|
|
11433
11433
|
}
|
|
11434
11434
|
else if (broadcastCallbackGrant) {
|
|
11435
|
-
logger$
|
|
11435
|
+
logger$11.debug('skipped_duplicate_broadcast_callback_grant');
|
|
11436
11436
|
}
|
|
11437
|
-
logger$
|
|
11437
|
+
logger$11.debug('callback_grants_after_augmentation', {
|
|
11438
11438
|
count: callbackGrants.length,
|
|
11439
11439
|
types: callbackGrants.map((g) => g.type),
|
|
11440
11440
|
});
|
|
@@ -11447,7 +11447,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11447
11447
|
targetAware.setTargetNodeId(this.targetSystemId);
|
|
11448
11448
|
}
|
|
11449
11449
|
catch (error) {
|
|
11450
|
-
logger$
|
|
11450
|
+
logger$11.warning('broadcast_channel_target_apply_failed', {
|
|
11451
11451
|
error: error instanceof Error ? error.message : String(error),
|
|
11452
11452
|
target_node_id: this.targetSystemId,
|
|
11453
11453
|
});
|
|
@@ -11469,14 +11469,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11469
11469
|
});
|
|
11470
11470
|
}
|
|
11471
11471
|
else {
|
|
11472
|
-
logger$
|
|
11472
|
+
logger$11.warning('parent_epoch_changed', { epoch });
|
|
11473
11473
|
}
|
|
11474
11474
|
}
|
|
11475
11475
|
if (!this.readyEvent.isSet()) {
|
|
11476
11476
|
this.readyEvent.set();
|
|
11477
11477
|
}
|
|
11478
11478
|
if (this.messageQueue.length > 0) {
|
|
11479
|
-
logger$
|
|
11479
|
+
logger$11.debug('flushing_buffered_frames', {
|
|
11480
11480
|
queue_size: this.messageQueue.length,
|
|
11481
11481
|
});
|
|
11482
11482
|
this.queueEvent.set();
|
|
@@ -11493,12 +11493,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11493
11493
|
name: `expiry-guard-${this.connectEpoch}`,
|
|
11494
11494
|
});
|
|
11495
11495
|
if (this.hadSuccessfulAttach) {
|
|
11496
|
-
logger$
|
|
11496
|
+
logger$11.debug('reconnected_to_upstream', {
|
|
11497
11497
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
11498
11498
|
});
|
|
11499
11499
|
}
|
|
11500
11500
|
else {
|
|
11501
|
-
logger$
|
|
11501
|
+
logger$11.debug('connected_to_upstream', {
|
|
11502
11502
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
11503
11503
|
});
|
|
11504
11504
|
}
|
|
@@ -11516,18 +11516,18 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11516
11516
|
this.currentStopSubtasks = null;
|
|
11517
11517
|
await Promise.allSettled(tasks.map((task) => task.promise));
|
|
11518
11518
|
if (this.connector) {
|
|
11519
|
-
logger$
|
|
11519
|
+
logger$11.debug('upstream_stopping_old_connector', {
|
|
11520
11520
|
connect_epoch: this.connectEpoch,
|
|
11521
11521
|
target_system_id: this.targetSystemId,
|
|
11522
11522
|
timestamp: new Date().toISOString(),
|
|
11523
11523
|
});
|
|
11524
11524
|
await this.connector.stop().catch((err) => {
|
|
11525
|
-
logger$
|
|
11525
|
+
logger$11.warning('upstream_connector_stop_error', {
|
|
11526
11526
|
connect_epoch: this.connectEpoch,
|
|
11527
11527
|
error: err instanceof Error ? err.message : String(err),
|
|
11528
11528
|
});
|
|
11529
11529
|
});
|
|
11530
|
-
logger$
|
|
11530
|
+
logger$11.debug('upstream_old_connector_stopped', {
|
|
11531
11531
|
connect_epoch: this.connectEpoch,
|
|
11532
11532
|
target_system_id: this.targetSystemId,
|
|
11533
11533
|
timestamp: new Date().toISOString(),
|
|
@@ -11580,7 +11580,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11580
11580
|
});
|
|
11581
11581
|
}
|
|
11582
11582
|
catch (error) {
|
|
11583
|
-
logger$
|
|
11583
|
+
logger$11.debug('broadcast_callback_grant_generation_failed', {
|
|
11584
11584
|
error: error instanceof Error ? error.message : String(error),
|
|
11585
11585
|
});
|
|
11586
11586
|
return null;
|
|
@@ -11635,7 +11635,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11635
11635
|
}
|
|
11636
11636
|
}
|
|
11637
11637
|
async heartbeatLoop(connector, stopEvt, signal) {
|
|
11638
|
-
logger$
|
|
11638
|
+
logger$11.debug('starting_heartbeat_loop');
|
|
11639
11639
|
const intervalMs = UpstreamSessionManager.HEARTBEAT_INTERVAL * 1000;
|
|
11640
11640
|
const graceMs = intervalMs * UpstreamSessionManager.HEARTBEAT_GRACE;
|
|
11641
11641
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -11671,7 +11671,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11671
11671
|
// Skip heartbeat if connector is paused (e.g., tab is hidden)
|
|
11672
11672
|
// Keep ack time current so we don't timeout immediately after resuming
|
|
11673
11673
|
if (currentState === core.ConnectorState.PAUSED) {
|
|
11674
|
-
logger$
|
|
11674
|
+
logger$11.debug('skipping_heartbeat_connector_paused', {
|
|
11675
11675
|
connector_state: currentState,
|
|
11676
11676
|
});
|
|
11677
11677
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -11680,14 +11680,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11680
11680
|
// Reset ack time if just resumed from pause (prevents immediate timeout)
|
|
11681
11681
|
if (previousState === core.ConnectorState.PAUSED &&
|
|
11682
11682
|
currentState === core.ConnectorState.STARTED) {
|
|
11683
|
-
logger$
|
|
11683
|
+
logger$11.debug('connector_just_resumed_resetting_ack_time', {
|
|
11684
11684
|
previous_state: previousState,
|
|
11685
11685
|
current_state: currentState,
|
|
11686
11686
|
});
|
|
11687
11687
|
this.lastHeartbeatAckTime = Date.now();
|
|
11688
11688
|
}
|
|
11689
11689
|
const envelope = await this.makeHeartbeatEnvelope();
|
|
11690
|
-
logger$
|
|
11690
|
+
logger$11.debug('sending_heartbeat', {
|
|
11691
11691
|
hb_corr_id: envelope.corrId,
|
|
11692
11692
|
hb_env_id: envelope.id,
|
|
11693
11693
|
});
|
|
@@ -11713,7 +11713,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11713
11713
|
throw new FameConnectError('missed heartbeat acknowledgement');
|
|
11714
11714
|
}
|
|
11715
11715
|
}
|
|
11716
|
-
logger$
|
|
11716
|
+
logger$11.debug('completed_heartbeat_loop');
|
|
11717
11717
|
}
|
|
11718
11718
|
async messagePumpLoop(connector, stopEvt, signal) {
|
|
11719
11719
|
while (!stopEvt.isSet() && !signal?.aborted) {
|
|
@@ -11730,19 +11730,19 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11730
11730
|
if (!envelope) {
|
|
11731
11731
|
continue;
|
|
11732
11732
|
}
|
|
11733
|
-
logger$
|
|
11733
|
+
logger$11.debug('upstream_pump_sending_envelope', {
|
|
11734
11734
|
envelopeId: envelope.id,
|
|
11735
11735
|
type: envelope.frame?.type,
|
|
11736
11736
|
});
|
|
11737
11737
|
try {
|
|
11738
11738
|
await connector.send(envelope);
|
|
11739
|
-
logger$
|
|
11739
|
+
logger$11.debug('upstream_pump_sent_envelope', {
|
|
11740
11740
|
envelopeId: envelope.id,
|
|
11741
11741
|
});
|
|
11742
11742
|
}
|
|
11743
11743
|
catch (error) {
|
|
11744
11744
|
if (error instanceof FameMessageTooLarge) {
|
|
11745
|
-
logger$
|
|
11745
|
+
logger$11.error('failed_to_send_message', { error: error.message });
|
|
11746
11746
|
await this.handleMessageTooLarge(envelope, error.message);
|
|
11747
11747
|
}
|
|
11748
11748
|
else if (error instanceof FameTransportClose) {
|
|
@@ -11804,7 +11804,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11804
11804
|
await fabric.send(ackEnvelope);
|
|
11805
11805
|
}
|
|
11806
11806
|
catch (error) {
|
|
11807
|
-
logger$
|
|
11807
|
+
logger$11.warning('failed_to_send_nack', {
|
|
11808
11808
|
error: error.message,
|
|
11809
11809
|
});
|
|
11810
11810
|
}
|
|
@@ -11818,7 +11818,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11818
11818
|
timestamps.push(info.attachExpiresAt);
|
|
11819
11819
|
}
|
|
11820
11820
|
if (!timestamps.length) {
|
|
11821
|
-
logger$
|
|
11821
|
+
logger$11.debug('no_ttl_expiry_configured');
|
|
11822
11822
|
await this.waitEvent(stopEvt, signal);
|
|
11823
11823
|
return;
|
|
11824
11824
|
}
|
|
@@ -11827,7 +11827,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11827
11827
|
let delaySeconds = (earliest.getTime() - now.getTime()) / 1000 -
|
|
11828
11828
|
UpstreamSessionManager.JWT_REFRESH_SAFETY;
|
|
11829
11829
|
delaySeconds = Math.max(delaySeconds, UpstreamSessionManager.JWT_REFRESH_SAFETY);
|
|
11830
|
-
logger$
|
|
11830
|
+
logger$11.debug('ttl_expiry_guard_started', {
|
|
11831
11831
|
welcome_expires_at: welcome.frame.expiresAt ?? null,
|
|
11832
11832
|
attach_expires_at: info.attachExpiresAt?.toISOString?.() ?? null,
|
|
11833
11833
|
earliest_expiry: earliest.toISOString(),
|
|
@@ -11855,7 +11855,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11855
11855
|
}
|
|
11856
11856
|
}
|
|
11857
11857
|
if (!stopEvt.isSet()) {
|
|
11858
|
-
logger$
|
|
11858
|
+
logger$11.debug('ttl_expiry_triggered_reconnect', {
|
|
11859
11859
|
expires_at: earliest.toISOString(),
|
|
11860
11860
|
current_time: new Date().toISOString(),
|
|
11861
11861
|
seconds_before_expiry: UpstreamSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11900,7 +11900,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11900
11900
|
}
|
|
11901
11901
|
await this.node.dispatchEnvelopeEvent('onEnvelopeReceived', this.node, env, context);
|
|
11902
11902
|
if (env.frame.type === 'NodeHeartbeatAck') {
|
|
11903
|
-
logger$
|
|
11903
|
+
logger$11.debug('received_heartbeat_ack', {
|
|
11904
11904
|
hb_ack_env_id: env.id,
|
|
11905
11905
|
hb_ack_corr_id: env.corrId,
|
|
11906
11906
|
hb_routing_epoch: env.frame.routingEpoch,
|
|
@@ -11914,7 +11914,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11914
11914
|
await this.onEpochChange(epoch);
|
|
11915
11915
|
}
|
|
11916
11916
|
else {
|
|
11917
|
-
logger$
|
|
11917
|
+
logger$11.warning('parent_epoch_changed', { epoch });
|
|
11918
11918
|
}
|
|
11919
11919
|
}
|
|
11920
11920
|
return;
|
|
@@ -11933,7 +11933,7 @@ UpstreamSessionManager.TX_QUEUE_MAX = 512;
|
|
|
11933
11933
|
UpstreamSessionManager.BACKOFF_INITIAL = 1; // seconds
|
|
11934
11934
|
UpstreamSessionManager.BACKOFF_CAP = 30; // seconds
|
|
11935
11935
|
|
|
11936
|
-
const logger$
|
|
11936
|
+
const logger$10 = getLogger('naylence.fame.node.admission.noop_admission_client');
|
|
11937
11937
|
class NoopAdmissionClient {
|
|
11938
11938
|
constructor(options = {}) {
|
|
11939
11939
|
this.hasUpstream = false;
|
|
@@ -11947,7 +11947,7 @@ class NoopAdmissionClient {
|
|
|
11947
11947
|
const acceptedLogicals = this.autoAcceptLogicals
|
|
11948
11948
|
? [...(requestedLogicals ?? [])]
|
|
11949
11949
|
: [];
|
|
11950
|
-
logger$
|
|
11950
|
+
logger$10.debug('noop_admission_hello', {
|
|
11951
11951
|
systemId: effectiveSystemId,
|
|
11952
11952
|
instanceId,
|
|
11953
11953
|
requestedLogicals,
|
|
@@ -11965,7 +11965,7 @@ class NoopAdmissionClient {
|
|
|
11965
11965
|
});
|
|
11966
11966
|
}
|
|
11967
11967
|
async close() {
|
|
11968
|
-
logger$
|
|
11968
|
+
logger$10.debug('noop_admission_close');
|
|
11969
11969
|
}
|
|
11970
11970
|
}
|
|
11971
11971
|
|
|
@@ -12171,7 +12171,7 @@ class DefaultServiceManager {
|
|
|
12171
12171
|
}
|
|
12172
12172
|
|
|
12173
12173
|
const SYSTEM_INBOX$1 = '__sys__';
|
|
12174
|
-
const logger
|
|
12174
|
+
const logger$$ = getLogger('naylence.fame.node.node');
|
|
12175
12175
|
function isSnakeCase(name) {
|
|
12176
12176
|
return name.includes('_');
|
|
12177
12177
|
}
|
|
@@ -12441,7 +12441,7 @@ class FameNode extends TaskSpawner {
|
|
|
12441
12441
|
confirmIdentity(systemId, source) {
|
|
12442
12442
|
if (this._confirmedId) {
|
|
12443
12443
|
if (this._confirmedId !== systemId) {
|
|
12444
|
-
logger
|
|
12444
|
+
logger$$.error('node_identity_mismatch', {
|
|
12445
12445
|
current_id: this._confirmedId,
|
|
12446
12446
|
new_id: systemId,
|
|
12447
12447
|
source,
|
|
@@ -12453,14 +12453,14 @@ class FameNode extends TaskSpawner {
|
|
|
12453
12453
|
const isReassignment = this._provisionalId !== systemId;
|
|
12454
12454
|
this._confirmedId = systemId;
|
|
12455
12455
|
if (isReassignment) {
|
|
12456
|
-
logger
|
|
12456
|
+
logger$$.debug('node_identity_reassigned', {
|
|
12457
12457
|
system_id: systemId,
|
|
12458
12458
|
previous_id: this._provisionalId,
|
|
12459
12459
|
source,
|
|
12460
12460
|
});
|
|
12461
12461
|
}
|
|
12462
12462
|
else {
|
|
12463
|
-
logger
|
|
12463
|
+
logger$$.debug('node_identity_confirmed', {
|
|
12464
12464
|
system_id: systemId,
|
|
12465
12465
|
source,
|
|
12466
12466
|
});
|
|
@@ -12528,7 +12528,7 @@ class FameNode extends TaskSpawner {
|
|
|
12528
12528
|
return;
|
|
12529
12529
|
}
|
|
12530
12530
|
if (frameType === 'NodeHeartbeat') {
|
|
12531
|
-
logger
|
|
12531
|
+
logger$$.debug('received_heartbeat_frame', {
|
|
12532
12532
|
envelopeId: envelope.id,
|
|
12533
12533
|
corrId: envelope.corrId ?? null,
|
|
12534
12534
|
});
|
|
@@ -12540,7 +12540,7 @@ class FameNode extends TaskSpawner {
|
|
|
12540
12540
|
await this.handleDeliveryAck(envelope, context);
|
|
12541
12541
|
return;
|
|
12542
12542
|
}
|
|
12543
|
-
logger
|
|
12543
|
+
logger$$.debug('unhandled_system_frame', {
|
|
12544
12544
|
envelopeId: envelope.id,
|
|
12545
12545
|
frameType,
|
|
12546
12546
|
});
|
|
@@ -12552,13 +12552,13 @@ class FameNode extends TaskSpawner {
|
|
|
12552
12552
|
}
|
|
12553
12553
|
await this._deliveryTracker.onEnvelopeDelivered(SYSTEM_INBOX$1, envelope, context);
|
|
12554
12554
|
if (frame.ok !== false) {
|
|
12555
|
-
logger
|
|
12555
|
+
logger$$.debug('delivery_ack_received', {
|
|
12556
12556
|
envelopeId: envelope.id,
|
|
12557
12557
|
corrId: envelope.corrId ?? null,
|
|
12558
12558
|
});
|
|
12559
12559
|
return;
|
|
12560
12560
|
}
|
|
12561
|
-
logger
|
|
12561
|
+
logger$$.warning('delivery_nack_received', {
|
|
12562
12562
|
envelopeId: envelope.id,
|
|
12563
12563
|
corrId: envelope.corrId ?? null,
|
|
12564
12564
|
code: frame.code ?? null,
|
|
@@ -12568,7 +12568,7 @@ class FameNode extends TaskSpawner {
|
|
|
12568
12568
|
await this.onDeliveryNack(frame, envelope, context);
|
|
12569
12569
|
}
|
|
12570
12570
|
async onDeliveryNack(frame, envelope, _context) {
|
|
12571
|
-
logger
|
|
12571
|
+
logger$$.debug('delivery_nack_processed', {
|
|
12572
12572
|
envelopeId: envelope.id,
|
|
12573
12573
|
code: frame.code ?? null,
|
|
12574
12574
|
reason: frame.reason ?? null,
|
|
@@ -12683,7 +12683,7 @@ class FameNode extends TaskSpawner {
|
|
|
12683
12683
|
await this._bindingManager.restore();
|
|
12684
12684
|
await this._envelopeListenerManager.start();
|
|
12685
12685
|
this._isStarted = true;
|
|
12686
|
-
logger
|
|
12686
|
+
logger$$.debug('node_started', {
|
|
12687
12687
|
node_id: this.id,
|
|
12688
12688
|
sid: this.sid,
|
|
12689
12689
|
path: this.physicalPath,
|
|
@@ -12715,7 +12715,7 @@ class FameNode extends TaskSpawner {
|
|
|
12715
12715
|
await this._serviceManager.stop();
|
|
12716
12716
|
await this.dispatchEvent('onNodeStopped', this);
|
|
12717
12717
|
this._isStarted = false;
|
|
12718
|
-
logger
|
|
12718
|
+
logger$$.debug('node_stopped', {
|
|
12719
12719
|
node_id: this.id,
|
|
12720
12720
|
});
|
|
12721
12721
|
}
|
|
@@ -12905,20 +12905,20 @@ class FameNode extends TaskSpawner {
|
|
|
12905
12905
|
await this.forwardUpstream(processedEnvelope, context);
|
|
12906
12906
|
}
|
|
12907
12907
|
else {
|
|
12908
|
-
logger
|
|
12908
|
+
logger$$.error('attempted_upstream_loop', {
|
|
12909
12909
|
envelopeId: processedEnvelope.id,
|
|
12910
12910
|
});
|
|
12911
12911
|
}
|
|
12912
12912
|
return;
|
|
12913
12913
|
}
|
|
12914
12914
|
if (!processedEnvelope.to) {
|
|
12915
|
-
logger
|
|
12915
|
+
logger$$.error('dropping_envelope_without_destination', {
|
|
12916
12916
|
envelopeId: processedEnvelope.id,
|
|
12917
12917
|
capabilities: processedEnvelope.capabilities ?? [],
|
|
12918
12918
|
});
|
|
12919
12919
|
return;
|
|
12920
12920
|
}
|
|
12921
|
-
logger
|
|
12921
|
+
logger$$.warning('no_local_handler_for_address', {
|
|
12922
12922
|
address: processedEnvelope.to.toString?.() ?? String(processedEnvelope.to),
|
|
12923
12923
|
originType: context?.originType ?? null,
|
|
12924
12924
|
});
|
|
@@ -13042,7 +13042,7 @@ class FameNode extends TaskSpawner {
|
|
|
13042
13042
|
}
|
|
13043
13043
|
}
|
|
13044
13044
|
catch (error) {
|
|
13045
|
-
logger
|
|
13045
|
+
logger$$.warning('callback_grant_collection_failed', {
|
|
13046
13046
|
error: error instanceof Error ? error.message : String(error),
|
|
13047
13047
|
});
|
|
13048
13048
|
}
|
|
@@ -13105,7 +13105,7 @@ class FameNode extends TaskSpawner {
|
|
|
13105
13105
|
await store.set('self', record);
|
|
13106
13106
|
}
|
|
13107
13107
|
catch (error) {
|
|
13108
|
-
logger
|
|
13108
|
+
logger$$.warning('node_meta_persist_failed', {
|
|
13109
13109
|
error: error instanceof Error ? error.message : String(error),
|
|
13110
13110
|
});
|
|
13111
13111
|
}
|
|
@@ -13243,44 +13243,12 @@ class ConnectionRetryPolicyFactory extends factory.AbstractResourceFactory {
|
|
|
13243
13243
|
}
|
|
13244
13244
|
}
|
|
13245
13245
|
|
|
13246
|
-
|
|
13247
|
-
|
|
13248
|
-
|
|
13249
|
-
|
|
13250
|
-
|
|
13251
|
-
|
|
13252
|
-
throw new Error('Failed to create token provider from configuration');
|
|
13253
|
-
}
|
|
13254
|
-
return provider;
|
|
13255
|
-
}
|
|
13256
|
-
let provider = null;
|
|
13257
|
-
try {
|
|
13258
|
-
provider = await factory.createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
13259
|
-
}
|
|
13260
|
-
catch (error) {
|
|
13261
|
-
const message = 'Failed to create default token provider' +
|
|
13262
|
-
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
13263
|
-
throw new Error(message);
|
|
13264
|
-
}
|
|
13265
|
-
if (!provider) {
|
|
13266
|
-
throw new Error('Failed to create default token provider');
|
|
13267
|
-
}
|
|
13268
|
-
return provider;
|
|
13269
|
-
}
|
|
13270
|
-
}
|
|
13271
|
-
|
|
13272
|
-
function isTokenProvider(candidate) {
|
|
13273
|
-
return (typeof candidate === 'object' &&
|
|
13274
|
-
candidate !== null &&
|
|
13275
|
-
typeof candidate.getToken === 'function');
|
|
13276
|
-
}
|
|
13277
|
-
function isIdentityExposingTokenProvider(candidate) {
|
|
13278
|
-
return (isTokenProvider(candidate) &&
|
|
13279
|
-
typeof candidate.getIdentity ===
|
|
13280
|
-
'function');
|
|
13281
|
-
}
|
|
13282
|
-
|
|
13283
|
-
const logger$$ = getLogger('naylence.fame.node.default_node_identity_policy');
|
|
13246
|
+
/**
|
|
13247
|
+
* Default node identity policy that preserves the current node ID.
|
|
13248
|
+
*
|
|
13249
|
+
* This policy does NOT derive identity from tokens or grants.
|
|
13250
|
+
* For token-subject-based identity, use TokenSubjectNodeIdentityPolicy.
|
|
13251
|
+
*/
|
|
13284
13252
|
class DefaultNodeIdentityPolicy {
|
|
13285
13253
|
async resolveInitialNodeId(context) {
|
|
13286
13254
|
if (context.configuredId) {
|
|
@@ -13292,44 +13260,10 @@ class DefaultNodeIdentityPolicy {
|
|
|
13292
13260
|
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
13293
13261
|
}
|
|
13294
13262
|
async resolveAdmissionNodeId(context) {
|
|
13295
|
-
|
|
13296
|
-
|
|
13297
|
-
for (const grant of context.grants) {
|
|
13298
|
-
try {
|
|
13299
|
-
const auth = grant.auth;
|
|
13300
|
-
if (!auth) {
|
|
13301
|
-
continue;
|
|
13302
|
-
}
|
|
13303
|
-
const tokenProviderConfig = (auth.tokenProvider ??
|
|
13304
|
-
auth.token_provider);
|
|
13305
|
-
if (!tokenProviderConfig ||
|
|
13306
|
-
typeof tokenProviderConfig.type !== 'string') {
|
|
13307
|
-
continue;
|
|
13308
|
-
}
|
|
13309
|
-
const provider = await TokenProviderFactory.createTokenProvider(tokenProviderConfig);
|
|
13310
|
-
if (isIdentityExposingTokenProvider(provider)) {
|
|
13311
|
-
const identity = await provider.getIdentity();
|
|
13312
|
-
if (identity && identity.subject) {
|
|
13313
|
-
logger$$.debug('identity_extracted_from_grant', {
|
|
13314
|
-
identity_id: identity.subject,
|
|
13315
|
-
grant_type: grant.type,
|
|
13316
|
-
});
|
|
13317
|
-
return identity.subject;
|
|
13318
|
-
}
|
|
13319
|
-
}
|
|
13320
|
-
}
|
|
13321
|
-
catch (error) {
|
|
13322
|
-
logger$$.warning('identity_extraction_failed', {
|
|
13323
|
-
error: error instanceof Error ? error.message : String(error),
|
|
13324
|
-
grant_type: grant.type,
|
|
13325
|
-
});
|
|
13326
|
-
}
|
|
13327
|
-
}
|
|
13328
|
-
}
|
|
13329
|
-
if (!context.currentNodeId) {
|
|
13330
|
-
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
13263
|
+
if (context.currentNodeId) {
|
|
13264
|
+
return context.currentNodeId;
|
|
13331
13265
|
}
|
|
13332
|
-
return
|
|
13266
|
+
return await core.generateIdAsync({ mode: 'fingerprint' });
|
|
13333
13267
|
}
|
|
13334
13268
|
}
|
|
13335
13269
|
|
|
@@ -16092,6 +16026,43 @@ var defaultNodeIdentityPolicyFactory = /*#__PURE__*/Object.freeze({
|
|
|
16092
16026
|
default: DefaultNodeIdentityPolicyFactory
|
|
16093
16027
|
});
|
|
16094
16028
|
|
|
16029
|
+
const TOKEN_PROVIDER_FACTORY_BASE_TYPE = 'TokenProviderFactory';
|
|
16030
|
+
class TokenProviderFactory extends factory.AbstractResourceFactory {
|
|
16031
|
+
static async createTokenProvider(config, options = {}) {
|
|
16032
|
+
if (config) {
|
|
16033
|
+
const provider = await factory.createResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, config, options);
|
|
16034
|
+
if (!provider) {
|
|
16035
|
+
throw new Error('Failed to create token provider from configuration');
|
|
16036
|
+
}
|
|
16037
|
+
return provider;
|
|
16038
|
+
}
|
|
16039
|
+
let provider = null;
|
|
16040
|
+
try {
|
|
16041
|
+
provider = await factory.createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
16042
|
+
}
|
|
16043
|
+
catch (error) {
|
|
16044
|
+
const message = 'Failed to create default token provider' +
|
|
16045
|
+
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
16046
|
+
throw new Error(message);
|
|
16047
|
+
}
|
|
16048
|
+
if (!provider) {
|
|
16049
|
+
throw new Error('Failed to create default token provider');
|
|
16050
|
+
}
|
|
16051
|
+
return provider;
|
|
16052
|
+
}
|
|
16053
|
+
}
|
|
16054
|
+
|
|
16055
|
+
function isTokenProvider(candidate) {
|
|
16056
|
+
return (typeof candidate === 'object' &&
|
|
16057
|
+
candidate !== null &&
|
|
16058
|
+
typeof candidate.getToken === 'function');
|
|
16059
|
+
}
|
|
16060
|
+
function isIdentityExposingTokenProvider(candidate) {
|
|
16061
|
+
return (isTokenProvider(candidate) &&
|
|
16062
|
+
typeof candidate.getIdentity ===
|
|
16063
|
+
'function');
|
|
16064
|
+
}
|
|
16065
|
+
|
|
16095
16066
|
const logger$W = getLogger('naylence.fame.node.token_subject_node_identity_policy');
|
|
16096
16067
|
class TokenSubjectNodeIdentityPolicy {
|
|
16097
16068
|
async resolveInitialNodeId(context) {
|