@naylence/runtime 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +367 -396
- package/dist/browser/index.mjs +367 -396
- package/dist/cjs/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/cjs/version.js +2 -2
- package/dist/esm/naylence/fame/node/default-node-identity-policy.js +9 -41
- package/dist/esm/version.js +2 -2
- package/dist/node/index.cjs +367 -396
- package/dist/node/index.mjs +367 -396
- package/dist/node/node.cjs +389 -418
- package/dist/node/node.mjs +389 -418
- package/dist/types/naylence/fame/node/default-node-identity-policy.d.ts +6 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/browser/index.mjs
CHANGED
|
@@ -523,12 +523,12 @@ async function ensureRuntimeFactoriesRegistered(registry = Registry) {
|
|
|
523
523
|
}
|
|
524
524
|
|
|
525
525
|
// This file is auto-generated during build - do not edit manually
|
|
526
|
-
// Generated from package.json version: 0.4.
|
|
526
|
+
// Generated from package.json version: 0.4.2
|
|
527
527
|
/**
|
|
528
528
|
* The package version, injected at build time.
|
|
529
529
|
* @internal
|
|
530
530
|
*/
|
|
531
|
-
const VERSION = '0.4.
|
|
531
|
+
const VERSION = '0.4.2';
|
|
532
532
|
|
|
533
533
|
let initialized = false;
|
|
534
534
|
const runtimePlugin = {
|
|
@@ -1373,7 +1373,7 @@ class TaskCancelledError extends Error {
|
|
|
1373
1373
|
* Provides functionality similar to Python's asyncio TaskSpawner with proper
|
|
1374
1374
|
* error handling, cancellation, and graceful shutdown capabilities.
|
|
1375
1375
|
*/
|
|
1376
|
-
const logger$
|
|
1376
|
+
const logger$1k = getLogger('naylence.fame.util.task_spawner');
|
|
1377
1377
|
function firstDefined(source, keys) {
|
|
1378
1378
|
for (const key of keys) {
|
|
1379
1379
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
@@ -1534,7 +1534,7 @@ class TaskSpawner {
|
|
|
1534
1534
|
const taskId = `task-${++this._taskCounter}`;
|
|
1535
1535
|
const taskName = normalizedOptions.name || `unnamed-${taskId}`;
|
|
1536
1536
|
const timeout = normalizedOptions.timeout ?? this._config.defaultTimeout;
|
|
1537
|
-
logger$
|
|
1537
|
+
logger$1k.debug('starting_background_task', {
|
|
1538
1538
|
task_name: taskName,
|
|
1539
1539
|
task_id: taskId,
|
|
1540
1540
|
});
|
|
@@ -1551,7 +1551,7 @@ class TaskSpawner {
|
|
|
1551
1551
|
task.promise
|
|
1552
1552
|
.then(() => {
|
|
1553
1553
|
if (!this._suppressCompletionLogging) {
|
|
1554
|
-
logger$
|
|
1554
|
+
logger$1k.debug('task_completed_successfully', {
|
|
1555
1555
|
task_name: taskName,
|
|
1556
1556
|
task_id: taskId,
|
|
1557
1557
|
duration_ms: Date.now() - task.startTime,
|
|
@@ -1605,7 +1605,7 @@ class TaskSpawner {
|
|
|
1605
1605
|
error.name === 'AbortError' ||
|
|
1606
1606
|
error.message === 'Task cancelled' ||
|
|
1607
1607
|
error.message === 'Aborted') {
|
|
1608
|
-
logger$
|
|
1608
|
+
logger$1k.debug('task_cancelled', {
|
|
1609
1609
|
task_name: taskName,
|
|
1610
1610
|
note: 'Task cancelled as requested',
|
|
1611
1611
|
});
|
|
@@ -1613,7 +1613,7 @@ class TaskSpawner {
|
|
|
1613
1613
|
}
|
|
1614
1614
|
// Handle timeout
|
|
1615
1615
|
if (error instanceof TaskTimeoutError) {
|
|
1616
|
-
logger$
|
|
1616
|
+
logger$1k.warning('task_timed_out', {
|
|
1617
1617
|
task_name: taskName,
|
|
1618
1618
|
error: error.message,
|
|
1619
1619
|
});
|
|
@@ -1625,7 +1625,7 @@ class TaskSpawner {
|
|
|
1625
1625
|
// Handle known WebSocket shutdown race condition (similar to Python version)
|
|
1626
1626
|
if (error.message.includes("await wasn't used with future") ||
|
|
1627
1627
|
error.message.includes('WebSocket closed during receive')) {
|
|
1628
|
-
logger$
|
|
1628
|
+
logger$1k.debug('task_shutdown_race_condition_handled', {
|
|
1629
1629
|
task_name: taskName,
|
|
1630
1630
|
note: 'Normal WebSocket close timing during shutdown - not an error',
|
|
1631
1631
|
});
|
|
@@ -1635,7 +1635,7 @@ class TaskSpawner {
|
|
|
1635
1635
|
if (error.name === 'FameTransportClose' ||
|
|
1636
1636
|
error.message.includes('normal closure') ||
|
|
1637
1637
|
error.message.includes('Connection closed')) {
|
|
1638
|
-
logger$
|
|
1638
|
+
logger$1k.debug('task_shutdown_completed_normally', {
|
|
1639
1639
|
task_name: taskName,
|
|
1640
1640
|
note: 'Task closed normally during shutdown',
|
|
1641
1641
|
});
|
|
@@ -1643,7 +1643,7 @@ class TaskSpawner {
|
|
|
1643
1643
|
}
|
|
1644
1644
|
// Handle PKCE redirect "errors" as info
|
|
1645
1645
|
if (error.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
1646
|
-
logger$
|
|
1646
|
+
logger$1k.debug('background_task_redirecting', {
|
|
1647
1647
|
task_name: taskName,
|
|
1648
1648
|
note: 'Task interrupted for PKCE redirect',
|
|
1649
1649
|
});
|
|
@@ -1656,14 +1656,14 @@ class TaskSpawner {
|
|
|
1656
1656
|
// Log retriable errors as warnings (they'll be retried by upstream logic)
|
|
1657
1657
|
// Log non-retriable errors as errors (fatal failures)
|
|
1658
1658
|
if (isRetriableError) {
|
|
1659
|
-
logger$
|
|
1659
|
+
logger$1k.warning('background_task_failed', {
|
|
1660
1660
|
task_name: taskName,
|
|
1661
1661
|
error: error.message,
|
|
1662
1662
|
retriable: true,
|
|
1663
1663
|
});
|
|
1664
1664
|
}
|
|
1665
1665
|
else {
|
|
1666
|
-
logger$
|
|
1666
|
+
logger$1k.error('background_task_failed', {
|
|
1667
1667
|
task_name: taskName,
|
|
1668
1668
|
error: error.message,
|
|
1669
1669
|
stack: error.stack,
|
|
@@ -1682,11 +1682,11 @@ class TaskSpawner {
|
|
|
1682
1682
|
async shutdownTasks(options = {}) {
|
|
1683
1683
|
const { gracePeriod, cancelHanging, joinTimeout } = normalizeShutdownOptions(options);
|
|
1684
1684
|
if (this._tasks.size === 0) {
|
|
1685
|
-
logger$
|
|
1685
|
+
logger$1k.debug('shutdown_tasks_no_tasks_to_shutdown');
|
|
1686
1686
|
return;
|
|
1687
1687
|
}
|
|
1688
1688
|
this._suppressCompletionLogging = true;
|
|
1689
|
-
logger$
|
|
1689
|
+
logger$1k.debug('shutting_down_tasks', {
|
|
1690
1690
|
task_count: this._tasks.size,
|
|
1691
1691
|
task_names: Array.from(this._tasks.values()).map((t) => t.name),
|
|
1692
1692
|
grace_period_ms: gracePeriod,
|
|
@@ -1701,7 +1701,7 @@ class TaskSpawner {
|
|
|
1701
1701
|
if (cancelHanging) {
|
|
1702
1702
|
const stillRunning = tasks.filter((task) => task.getState() === TaskState.RUNNING && !completed.has(task));
|
|
1703
1703
|
if (stillRunning.length > 0) {
|
|
1704
|
-
logger$
|
|
1704
|
+
logger$1k.debug('tasks_did_not_complete_within_grace_period', {
|
|
1705
1705
|
hanging_count: stillRunning.length,
|
|
1706
1706
|
});
|
|
1707
1707
|
// Wait for them to finish with individual timeouts
|
|
@@ -1711,7 +1711,7 @@ class TaskSpawner {
|
|
|
1711
1711
|
}
|
|
1712
1712
|
catch (error) {
|
|
1713
1713
|
if (error instanceof TaskTimeoutError) {
|
|
1714
|
-
logger$
|
|
1714
|
+
logger$1k.warning('task_did_not_shutdown', {
|
|
1715
1715
|
task_name: task.name || task.id,
|
|
1716
1716
|
join_timeout_ms: joinTimeout,
|
|
1717
1717
|
});
|
|
@@ -1722,7 +1722,7 @@ class TaskSpawner {
|
|
|
1722
1722
|
}
|
|
1723
1723
|
else if (!(error instanceof TaskCancelledError)) {
|
|
1724
1724
|
/* istanbul ignore next - unreachable defensive branch */
|
|
1725
|
-
logger$
|
|
1725
|
+
logger$1k.error('task_raised_during_cancellation', {
|
|
1726
1726
|
task_name: task.name || task.id,
|
|
1727
1727
|
error: error instanceof Error ? error.message : String(error),
|
|
1728
1728
|
});
|
|
@@ -2859,7 +2859,7 @@ async function safeImport(loader, dependencyNameOrOptions, maybeOptions) {
|
|
|
2859
2859
|
* condition/promise and ensure at most one notifier coroutine exists for a
|
|
2860
2860
|
* flow at any time.
|
|
2861
2861
|
*/
|
|
2862
|
-
const logger$
|
|
2862
|
+
const logger$1j = getLogger('naylence.fame.flow.flow_controller');
|
|
2863
2863
|
/**
|
|
2864
2864
|
* Simple condition variable implementation for TypeScript/Node.js
|
|
2865
2865
|
* Similar to Python's asyncio.Condition
|
|
@@ -2993,7 +2993,7 @@ class FlowController {
|
|
|
2993
2993
|
const newBalance = Math.max(0, Math.min(this.initialWindow, prev + delta));
|
|
2994
2994
|
this.credits.set(flowId, newBalance);
|
|
2995
2995
|
const crossedZero = prev <= 0 && newBalance > 0;
|
|
2996
|
-
logger$
|
|
2996
|
+
logger$1j.debug('flow_controller_add_credits', {
|
|
2997
2997
|
flow_id: flowId,
|
|
2998
2998
|
delta,
|
|
2999
2999
|
prev_balance: prev,
|
|
@@ -3013,12 +3013,12 @@ class FlowController {
|
|
|
3013
3013
|
async acquire(flowId) {
|
|
3014
3014
|
this.ensureFlow(flowId);
|
|
3015
3015
|
const condition = this.conditions.get(flowId);
|
|
3016
|
-
logger$
|
|
3016
|
+
logger$1j.debug('flow_controller_acquire_attempt', {
|
|
3017
3017
|
flow_id: flowId,
|
|
3018
3018
|
current_balance: this.credits.get(flowId),
|
|
3019
3019
|
});
|
|
3020
3020
|
while (this.credits.get(flowId) <= 0) {
|
|
3021
|
-
logger$
|
|
3021
|
+
logger$1j.debug('flow_controller_waiting_for_credits', {
|
|
3022
3022
|
flow_id: flowId,
|
|
3023
3023
|
current_balance: this.credits.get(flowId),
|
|
3024
3024
|
});
|
|
@@ -3026,12 +3026,12 @@ class FlowController {
|
|
|
3026
3026
|
}
|
|
3027
3027
|
const newBalance = this.credits.get(flowId) - 1;
|
|
3028
3028
|
this.credits.set(flowId, newBalance);
|
|
3029
|
-
logger$
|
|
3029
|
+
logger$1j.debug('flow_controller_acquire_success', {
|
|
3030
3030
|
flow_id: flowId,
|
|
3031
3031
|
new_balance: newBalance,
|
|
3032
3032
|
});
|
|
3033
3033
|
if (newBalance <= this.lowWatermark) {
|
|
3034
|
-
logger$
|
|
3034
|
+
logger$1j.debug('flow_controller_acquire_below_low_watermark', {
|
|
3035
3035
|
flow_id: flowId,
|
|
3036
3036
|
low_watermark: this.lowWatermark,
|
|
3037
3037
|
});
|
|
@@ -3055,7 +3055,7 @@ class FlowController {
|
|
|
3055
3055
|
const current = this.credits.get(flowId);
|
|
3056
3056
|
const remaining = Math.max(current - credits, 0);
|
|
3057
3057
|
this.credits.set(flowId, remaining);
|
|
3058
|
-
logger$
|
|
3058
|
+
logger$1j.debug('flow_controller_consume', {
|
|
3059
3059
|
flow_id: flowId,
|
|
3060
3060
|
requested: credits,
|
|
3061
3061
|
prev_balance: current,
|
|
@@ -3081,7 +3081,7 @@ class FlowController {
|
|
|
3081
3081
|
this.windowIds.delete(flowId);
|
|
3082
3082
|
this.credits.set(flowId, this.initialWindow);
|
|
3083
3083
|
this.wakeWaiters(flowId);
|
|
3084
|
-
logger$
|
|
3084
|
+
logger$1j.debug('flow_controller_flow_reset', {
|
|
3085
3085
|
flow_id: flowId,
|
|
3086
3086
|
reset_balance: this.initialWindow,
|
|
3087
3087
|
});
|
|
@@ -3369,7 +3369,7 @@ class InMemoryBinding {
|
|
|
3369
3369
|
* TypeScript port of Python's InMemoryFanoutBroker that extends TaskSpawner
|
|
3370
3370
|
* to manage multiple WriteChannel subscribers with concurrent message distribution.
|
|
3371
3371
|
*/
|
|
3372
|
-
const logger$
|
|
3372
|
+
const logger$1i = getLogger('naylence.fame.channel.in_memory.in_memory_fanout_broker');
|
|
3373
3373
|
// Sentinel object for shutdown signaling
|
|
3374
3374
|
const SENTINEL = Symbol('fanout-broker-sentinel');
|
|
3375
3375
|
function isCloseable(obj) {
|
|
@@ -3422,7 +3422,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3422
3422
|
}
|
|
3423
3423
|
catch (error) {
|
|
3424
3424
|
// Ignore errors when sending sentinel (sink might be closed)
|
|
3425
|
-
logger$
|
|
3425
|
+
logger$1i.debug('error_sending_sentinel', {
|
|
3426
3426
|
error: error.message,
|
|
3427
3427
|
});
|
|
3428
3428
|
}
|
|
@@ -3436,7 +3436,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3436
3436
|
await sub.close();
|
|
3437
3437
|
}
|
|
3438
3438
|
catch (error) {
|
|
3439
|
-
logger$
|
|
3439
|
+
logger$1i.error('error_closing_subscriber', {
|
|
3440
3440
|
subscriber: sub.toString(),
|
|
3441
3441
|
error: error.message,
|
|
3442
3442
|
});
|
|
@@ -3476,7 +3476,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3476
3476
|
[envelope, context] = extractEnvelopeAndContext(msg);
|
|
3477
3477
|
}
|
|
3478
3478
|
catch (error) {
|
|
3479
|
-
logger$
|
|
3479
|
+
logger$1i.debug('failed_to_extract_envelope', {
|
|
3480
3480
|
error: error.message,
|
|
3481
3481
|
});
|
|
3482
3482
|
continue;
|
|
@@ -3498,7 +3498,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3498
3498
|
await sub.send(messageToSend);
|
|
3499
3499
|
}
|
|
3500
3500
|
catch (error) {
|
|
3501
|
-
logger$
|
|
3501
|
+
logger$1i.error('error_sending_to_subscriber', {
|
|
3502
3502
|
subscriber: sub.toString(),
|
|
3503
3503
|
error: error.message,
|
|
3504
3504
|
action: 'unsubscribing',
|
|
@@ -3514,7 +3514,7 @@ class InMemoryFanoutBroker extends TaskSpawner {
|
|
|
3514
3514
|
}
|
|
3515
3515
|
catch (error) {
|
|
3516
3516
|
// Critical broker-level error: log and back off, but keep the loop running
|
|
3517
|
-
logger$
|
|
3517
|
+
logger$1i.critical('receive_loop_failed_unexpectedly', {
|
|
3518
3518
|
error: error.message,
|
|
3519
3519
|
stack: error.stack,
|
|
3520
3520
|
});
|
|
@@ -5190,7 +5190,7 @@ function normalizeResponseType(value) {
|
|
|
5190
5190
|
return value;
|
|
5191
5191
|
}
|
|
5192
5192
|
|
|
5193
|
-
const logger$
|
|
5193
|
+
const logger$1h = getLogger('naylence.fame.node.binding_manager');
|
|
5194
5194
|
const SYSTEM_INBOX$3 = '__sys__';
|
|
5195
5195
|
const DEFAULT_ACK_TIMEOUT_MS = 20000;
|
|
5196
5196
|
class BindingStoreEntryRecord {
|
|
@@ -5276,7 +5276,7 @@ class BindingManager {
|
|
|
5276
5276
|
if (!this.bindings.has(key)) {
|
|
5277
5277
|
const binding = this.bindingFactory(new FameAddress(key));
|
|
5278
5278
|
this.bindings.set(key, binding);
|
|
5279
|
-
logger$
|
|
5279
|
+
logger$1h.debug('restored_binding', { address: key });
|
|
5280
5280
|
}
|
|
5281
5281
|
}
|
|
5282
5282
|
if (!this.hasUpstream) {
|
|
@@ -5286,13 +5286,13 @@ class BindingManager {
|
|
|
5286
5286
|
await this.readvertiseCapabilitiesUpstream();
|
|
5287
5287
|
}
|
|
5288
5288
|
async bind(participant, capabilities) {
|
|
5289
|
-
logger$
|
|
5289
|
+
logger$1h.debug('binding_participant', { participant });
|
|
5290
5290
|
const { prefixAddress, addresses, propagateAddress, capabilityAddress } = this.computeBindingAddresses(participant);
|
|
5291
5291
|
for (const address of addresses) {
|
|
5292
5292
|
if (!this.bindings.has(address)) {
|
|
5293
5293
|
const binding = this.bindingFactory(new FameAddress(address));
|
|
5294
5294
|
this.bindings.set(address, binding);
|
|
5295
|
-
logger$
|
|
5295
|
+
logger$1h.debug('bound_address', { address, participant });
|
|
5296
5296
|
}
|
|
5297
5297
|
}
|
|
5298
5298
|
let propagatedAddress = null;
|
|
@@ -5321,7 +5321,7 @@ class BindingManager {
|
|
|
5321
5321
|
await this.unbindAddressUpstream(propagatedAddress);
|
|
5322
5322
|
}
|
|
5323
5323
|
catch (rollbackError) {
|
|
5324
|
-
logger$
|
|
5324
|
+
logger$1h.error('bind_rollback_failed', {
|
|
5325
5325
|
address: propagatedAddress.toString(),
|
|
5326
5326
|
error: rollbackError.message,
|
|
5327
5327
|
});
|
|
@@ -5340,7 +5340,7 @@ class BindingManager {
|
|
|
5340
5340
|
physicalPath: null,
|
|
5341
5341
|
});
|
|
5342
5342
|
}
|
|
5343
|
-
logger$
|
|
5343
|
+
logger$1h.debug('bind_success', {
|
|
5344
5344
|
participant,
|
|
5345
5345
|
address: prefixAddress.toString(),
|
|
5346
5346
|
capabilities,
|
|
@@ -5376,7 +5376,7 @@ class BindingManager {
|
|
|
5376
5376
|
await this.bindingStore.delete(address);
|
|
5377
5377
|
}
|
|
5378
5378
|
}
|
|
5379
|
-
logger$
|
|
5379
|
+
logger$1h.debug('unbind_success', {
|
|
5380
5380
|
participant,
|
|
5381
5381
|
address: prefixAddress.toString(),
|
|
5382
5382
|
totalBindings: this.bindings.size,
|
|
@@ -5406,7 +5406,7 @@ class BindingManager {
|
|
|
5406
5406
|
await this.bindAddressUpstream(new FameAddress(address));
|
|
5407
5407
|
}
|
|
5408
5408
|
catch (error) {
|
|
5409
|
-
logger$
|
|
5409
|
+
logger$1h.error('rebind_failed', {
|
|
5410
5410
|
address,
|
|
5411
5411
|
error: error.message,
|
|
5412
5412
|
});
|
|
@@ -5425,7 +5425,7 @@ class BindingManager {
|
|
|
5425
5425
|
await this.advertiseCapabilities(new FameAddress(address), Array.from(capabilities));
|
|
5426
5426
|
}
|
|
5427
5427
|
catch (error) {
|
|
5428
|
-
logger$
|
|
5428
|
+
logger$1h.error('capability_replay_failed', {
|
|
5429
5429
|
address,
|
|
5430
5430
|
error: error.message,
|
|
5431
5431
|
});
|
|
@@ -5692,7 +5692,7 @@ class BindingManager {
|
|
|
5692
5692
|
}
|
|
5693
5693
|
}
|
|
5694
5694
|
|
|
5695
|
-
const logger$
|
|
5695
|
+
const logger$1g = getLogger('naylence.fame.node.response_context_manager');
|
|
5696
5696
|
function cloneSecurityContext(source) {
|
|
5697
5697
|
if (!source) {
|
|
5698
5698
|
return undefined;
|
|
@@ -5720,7 +5720,7 @@ class ResponseContextManager {
|
|
|
5720
5720
|
security: responseSecurity,
|
|
5721
5721
|
expectedResponseType: FameResponseType.NONE,
|
|
5722
5722
|
};
|
|
5723
|
-
logger$
|
|
5723
|
+
logger$1g.debug('created_response_context', {
|
|
5724
5724
|
request_id: requestEnvelope.id,
|
|
5725
5725
|
inherited_crypto_level: responseSecurity?.inboundCryptoLevel ?? null,
|
|
5726
5726
|
channel_id: responseSecurity?.cryptoChannelId ?? null,
|
|
@@ -5740,14 +5740,14 @@ class ResponseContextManager {
|
|
|
5740
5740
|
responseContext.fromSystemId = this.getId();
|
|
5741
5741
|
}
|
|
5742
5742
|
// Envelope-level metadata is intentionally omitted to defer to context usage.
|
|
5743
|
-
logger$
|
|
5743
|
+
logger$1g.debug('ensured_response_metadata', {
|
|
5744
5744
|
response_id: responseEnvelope.id,
|
|
5745
5745
|
request_id: requestEnvelope.id,
|
|
5746
5746
|
});
|
|
5747
5747
|
}
|
|
5748
5748
|
}
|
|
5749
5749
|
|
|
5750
|
-
const logger$
|
|
5750
|
+
const logger$1f = getLogger('naylence.fame.node.streaming_response_handler');
|
|
5751
5751
|
function isObject(value) {
|
|
5752
5752
|
return typeof value === 'object' && value !== null;
|
|
5753
5753
|
}
|
|
@@ -5866,12 +5866,12 @@ class StreamingResponseHandler {
|
|
|
5866
5866
|
}
|
|
5867
5867
|
async handleStreamingFameMessageResponses(responses, requestEnvelope, requestContext) {
|
|
5868
5868
|
const asyncResponses = toAsyncIterable(responses);
|
|
5869
|
-
logger$
|
|
5869
|
+
logger$1f.debug('handling_streaming_fame_message_responses', {
|
|
5870
5870
|
request_id: requestEnvelope.id,
|
|
5871
5871
|
});
|
|
5872
5872
|
for await (const response of asyncResponses) {
|
|
5873
5873
|
if (!response?.envelope) {
|
|
5874
|
-
logger$
|
|
5874
|
+
logger$1f.warning('invalid_streaming_response_type', {
|
|
5875
5875
|
request_id: requestEnvelope.id,
|
|
5876
5876
|
actual_type: typeof response,
|
|
5877
5877
|
});
|
|
@@ -5885,7 +5885,7 @@ class StreamingResponseHandler {
|
|
|
5885
5885
|
}
|
|
5886
5886
|
async handleStreamingResponse(result, requestEnvelope, requestContext, replyTo, requestId) {
|
|
5887
5887
|
const iterable = toAsyncIterable(result);
|
|
5888
|
-
logger$
|
|
5888
|
+
logger$1f.debug('handling_streaming_response', {
|
|
5889
5889
|
request_id: requestId,
|
|
5890
5890
|
reply_to: replyTo,
|
|
5891
5891
|
});
|
|
@@ -5896,7 +5896,7 @@ class StreamingResponseHandler {
|
|
|
5896
5896
|
await this.sendRpcResponse(null, requestEnvelope, requestContext, replyTo, requestId);
|
|
5897
5897
|
}
|
|
5898
5898
|
catch (error) {
|
|
5899
|
-
logger$
|
|
5899
|
+
logger$1f.error('streaming_response_handler_error', {
|
|
5900
5900
|
request_id: requestId,
|
|
5901
5901
|
error: error instanceof Error ? error.message : String(error),
|
|
5902
5902
|
});
|
|
@@ -5923,7 +5923,7 @@ class StreamingResponseHandler {
|
|
|
5923
5923
|
});
|
|
5924
5924
|
const responseContext = this.responseContextManager.createResponseContext(requestEnvelope, requestContext);
|
|
5925
5925
|
this.responseContextManager.ensureResponseMetadata(responseEnvelope, requestEnvelope, responseContext);
|
|
5926
|
-
logger$
|
|
5926
|
+
logger$1f.debug('sending_streaming_rpc_response', {
|
|
5927
5927
|
request_id: requestId,
|
|
5928
5928
|
response_envelope_id: responseEnvelope.id,
|
|
5929
5929
|
reply_to: replyTo,
|
|
@@ -5936,7 +5936,7 @@ class StreamingResponseHandler {
|
|
|
5936
5936
|
}
|
|
5937
5937
|
}
|
|
5938
5938
|
|
|
5939
|
-
const logger$
|
|
5939
|
+
const logger$1e = getLogger('naylence.fame.node.channel_polling_manager');
|
|
5940
5940
|
class ChannelPollingManager {
|
|
5941
5941
|
constructor(deliverWrapper, responseContextManager, streamingResponseHandler) {
|
|
5942
5942
|
this.deliverWrapper = deliverWrapper;
|
|
@@ -5944,7 +5944,7 @@ class ChannelPollingManager {
|
|
|
5944
5944
|
this.streamingResponseHandler = streamingResponseHandler;
|
|
5945
5945
|
}
|
|
5946
5946
|
async startPollingLoop(serviceName, channel, handler, stopState, pollTimeoutMs = DEFAULT_POLLING_TIMEOUT_MS) {
|
|
5947
|
-
logger$
|
|
5947
|
+
logger$1e.debug('poll_loop_started', {
|
|
5948
5948
|
recipient: serviceName,
|
|
5949
5949
|
});
|
|
5950
5950
|
try {
|
|
@@ -5952,7 +5952,7 @@ class ChannelPollingManager {
|
|
|
5952
5952
|
while (true) {
|
|
5953
5953
|
if (this.isStopRequested(stopState) && !draining) {
|
|
5954
5954
|
draining = true;
|
|
5955
|
-
logger$
|
|
5955
|
+
logger$1e.debug('poll_loop_draining_pending_messages', {
|
|
5956
5956
|
recipient: serviceName,
|
|
5957
5957
|
});
|
|
5958
5958
|
}
|
|
@@ -5962,7 +5962,7 @@ class ChannelPollingManager {
|
|
|
5962
5962
|
}
|
|
5963
5963
|
catch (error) {
|
|
5964
5964
|
if (error instanceof FameTransportClose) {
|
|
5965
|
-
logger$
|
|
5965
|
+
logger$1e.debug('channel_closed', {
|
|
5966
5966
|
recipient: serviceName,
|
|
5967
5967
|
message: error.message,
|
|
5968
5968
|
});
|
|
@@ -5975,7 +5975,7 @@ class ChannelPollingManager {
|
|
|
5975
5975
|
continue;
|
|
5976
5976
|
}
|
|
5977
5977
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
5978
|
-
logger$
|
|
5978
|
+
logger$1e.debug('listener_cancelled', {
|
|
5979
5979
|
recipient: serviceName,
|
|
5980
5980
|
});
|
|
5981
5981
|
throw error;
|
|
@@ -5987,13 +5987,13 @@ class ChannelPollingManager {
|
|
|
5987
5987
|
continue;
|
|
5988
5988
|
}
|
|
5989
5989
|
if (error instanceof Error && error.message === 'Channel is closed') {
|
|
5990
|
-
logger$
|
|
5990
|
+
logger$1e.debug('channel_closed', {
|
|
5991
5991
|
recipient: serviceName,
|
|
5992
5992
|
});
|
|
5993
5993
|
break;
|
|
5994
5994
|
}
|
|
5995
5995
|
if (error instanceof Error && error.name === 'TaskCancelledError') {
|
|
5996
|
-
logger$
|
|
5996
|
+
logger$1e.debug('listener_cancelled', {
|
|
5997
5997
|
recipient: serviceName,
|
|
5998
5998
|
});
|
|
5999
5999
|
throw error;
|
|
@@ -6005,12 +6005,12 @@ class ChannelPollingManager {
|
|
|
6005
6005
|
continue;
|
|
6006
6006
|
}
|
|
6007
6007
|
if (error instanceof Error && error.message.includes('closed')) {
|
|
6008
|
-
logger$
|
|
6008
|
+
logger$1e.debug('channel_closed', {
|
|
6009
6009
|
recipient: serviceName,
|
|
6010
6010
|
});
|
|
6011
6011
|
break;
|
|
6012
6012
|
}
|
|
6013
|
-
logger$
|
|
6013
|
+
logger$1e.error('transport_error', {
|
|
6014
6014
|
recipient: serviceName,
|
|
6015
6015
|
error: error instanceof Error ? error.message : String(error),
|
|
6016
6016
|
});
|
|
@@ -6026,7 +6026,7 @@ class ChannelPollingManager {
|
|
|
6026
6026
|
}
|
|
6027
6027
|
}
|
|
6028
6028
|
finally {
|
|
6029
|
-
logger$
|
|
6029
|
+
logger$1e.debug('poll_loop_exiting', {
|
|
6030
6030
|
recipient: serviceName,
|
|
6031
6031
|
});
|
|
6032
6032
|
}
|
|
@@ -6039,7 +6039,7 @@ class ChannelPollingManager {
|
|
|
6039
6039
|
await this.processHandlerResult(result, envelope, deliveryContext, serviceName);
|
|
6040
6040
|
}
|
|
6041
6041
|
catch (error) {
|
|
6042
|
-
logger$
|
|
6042
|
+
logger$1e.error('handler_crashed', {
|
|
6043
6043
|
recipient: serviceName,
|
|
6044
6044
|
error: error instanceof Error ? error.message : String(error),
|
|
6045
6045
|
});
|
|
@@ -6053,7 +6053,7 @@ class ChannelPollingManager {
|
|
|
6053
6053
|
return;
|
|
6054
6054
|
}
|
|
6055
6055
|
if (this.streamingResponseHandler.isStreamingFameMessageResponse(result)) {
|
|
6056
|
-
logger$
|
|
6056
|
+
logger$1e.debug('handling_streaming_fame_message_responses', {
|
|
6057
6057
|
service_name: serviceName,
|
|
6058
6058
|
envelope_id: envelope.id,
|
|
6059
6059
|
});
|
|
@@ -6061,7 +6061,7 @@ class ChannelPollingManager {
|
|
|
6061
6061
|
}
|
|
6062
6062
|
}
|
|
6063
6063
|
async handleMessageResponse(response, requestEnvelope, requestContext, serviceName) {
|
|
6064
|
-
logger$
|
|
6064
|
+
logger$1e.debug('delivering_envelope_response_message', {
|
|
6065
6065
|
service_name: serviceName,
|
|
6066
6066
|
response_envelope_id: response.envelope.id,
|
|
6067
6067
|
});
|
|
@@ -6081,7 +6081,7 @@ class ChannelPollingManager {
|
|
|
6081
6081
|
}
|
|
6082
6082
|
}
|
|
6083
6083
|
|
|
6084
|
-
const logger$
|
|
6084
|
+
const logger$1d = getLogger('naylence.fame.node.rpc_server_handler');
|
|
6085
6085
|
function isPlainRecord$6(value) {
|
|
6086
6086
|
if (typeof value !== 'object' || value === null) {
|
|
6087
6087
|
return false;
|
|
@@ -6125,13 +6125,13 @@ class RPCServerHandler {
|
|
|
6125
6125
|
}
|
|
6126
6126
|
async handleRpcRequest(envelope, handlerContext, handler, serviceName) {
|
|
6127
6127
|
if (!this.isDataFrame(envelope.frame)) {
|
|
6128
|
-
logger$
|
|
6128
|
+
logger$1d.warning('rpc_request_missing_data_frame', {
|
|
6129
6129
|
service_name: serviceName,
|
|
6130
6130
|
envelope_id: envelope.id,
|
|
6131
6131
|
});
|
|
6132
6132
|
return;
|
|
6133
6133
|
}
|
|
6134
|
-
logger$
|
|
6134
|
+
logger$1d.debug('rpc_request_received', {
|
|
6135
6135
|
service_name: serviceName,
|
|
6136
6136
|
envelope_id: envelope.id,
|
|
6137
6137
|
trace_id: envelope.traceId,
|
|
@@ -6143,7 +6143,7 @@ class RPCServerHandler {
|
|
|
6143
6143
|
request = parseRequest(envelope.frame.payload);
|
|
6144
6144
|
params = cloneParams(request.params);
|
|
6145
6145
|
const paramKeys = Object.keys(params);
|
|
6146
|
-
logger$
|
|
6146
|
+
logger$1d.debug('parsed_rpc_request', {
|
|
6147
6147
|
service_name: serviceName,
|
|
6148
6148
|
method: request.method,
|
|
6149
6149
|
request_id: request.id,
|
|
@@ -6152,7 +6152,7 @@ class RPCServerHandler {
|
|
|
6152
6152
|
});
|
|
6153
6153
|
}
|
|
6154
6154
|
catch (error) {
|
|
6155
|
-
logger$
|
|
6155
|
+
logger$1d.warning('request_decode_error', {
|
|
6156
6156
|
service_name: serviceName,
|
|
6157
6157
|
envelope_id: envelope.id,
|
|
6158
6158
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -6160,7 +6160,7 @@ class RPCServerHandler {
|
|
|
6160
6160
|
return;
|
|
6161
6161
|
}
|
|
6162
6162
|
if (request.id == null) {
|
|
6163
|
-
logger$
|
|
6163
|
+
logger$1d.warning('request_missing_id', {
|
|
6164
6164
|
service_name: serviceName,
|
|
6165
6165
|
envelope_id: envelope.id,
|
|
6166
6166
|
});
|
|
@@ -6168,7 +6168,7 @@ class RPCServerHandler {
|
|
|
6168
6168
|
}
|
|
6169
6169
|
const replyTo = this.resolveReplyTo(envelope, params);
|
|
6170
6170
|
if (!replyTo) {
|
|
6171
|
-
logger$
|
|
6171
|
+
logger$1d.warning('missing_reply_to', {
|
|
6172
6172
|
service_name: serviceName,
|
|
6173
6173
|
envelope_id: envelope.id,
|
|
6174
6174
|
request_id: request.id,
|
|
@@ -6177,13 +6177,13 @@ class RPCServerHandler {
|
|
|
6177
6177
|
}
|
|
6178
6178
|
let handlerResult;
|
|
6179
6179
|
try {
|
|
6180
|
-
logger$
|
|
6180
|
+
logger$1d.debug('calling_rpc_handler', {
|
|
6181
6181
|
service_name: serviceName,
|
|
6182
6182
|
method: request.method,
|
|
6183
6183
|
request_id: request.id,
|
|
6184
6184
|
});
|
|
6185
6185
|
handlerResult = await handler(request.method, params);
|
|
6186
|
-
logger$
|
|
6186
|
+
logger$1d.debug('rpc_handler_returned', {
|
|
6187
6187
|
service_name: serviceName,
|
|
6188
6188
|
method: request.method,
|
|
6189
6189
|
request_id: request.id,
|
|
@@ -6192,7 +6192,7 @@ class RPCServerHandler {
|
|
|
6192
6192
|
});
|
|
6193
6193
|
}
|
|
6194
6194
|
catch (error) {
|
|
6195
|
-
logger$
|
|
6195
|
+
logger$1d.error('rpc_handler_error', {
|
|
6196
6196
|
service_name: serviceName,
|
|
6197
6197
|
request_id: request.id,
|
|
6198
6198
|
envelope_id: envelope.id,
|
|
@@ -6202,7 +6202,7 @@ class RPCServerHandler {
|
|
|
6202
6202
|
return this.createTraditionalResponse(response, request.id, envelope, replyTo, handlerContext, serviceName);
|
|
6203
6203
|
}
|
|
6204
6204
|
if (isFameMessageResponse(handlerResult)) {
|
|
6205
|
-
logger$
|
|
6205
|
+
logger$1d.debug('returning_response_message', {
|
|
6206
6206
|
service_name: serviceName,
|
|
6207
6207
|
request_id: request.id,
|
|
6208
6208
|
response_envelope_id: handlerResult.envelope.id,
|
|
@@ -6210,7 +6210,7 @@ class RPCServerHandler {
|
|
|
6210
6210
|
return handlerResult;
|
|
6211
6211
|
}
|
|
6212
6212
|
if (this.streamingResponseHandler.isStreamingResult(handlerResult)) {
|
|
6213
|
-
logger$
|
|
6213
|
+
logger$1d.debug('handling_streaming_response', {
|
|
6214
6214
|
service_name: serviceName,
|
|
6215
6215
|
request_id: request.id,
|
|
6216
6216
|
envelope_id: envelope.id,
|
|
@@ -6239,7 +6239,7 @@ class RPCServerHandler {
|
|
|
6239
6239
|
return null;
|
|
6240
6240
|
}
|
|
6241
6241
|
async createTraditionalResponse(payload, requestId, requestEnvelope, replyTo, handlerContext, serviceName) {
|
|
6242
|
-
logger$
|
|
6242
|
+
logger$1d.debug('creating_traditional_response_envelope', {
|
|
6243
6243
|
service_name: serviceName,
|
|
6244
6244
|
request_id: requestId,
|
|
6245
6245
|
envelope_id: requestEnvelope.id,
|
|
@@ -6263,7 +6263,7 @@ class RPCServerHandler {
|
|
|
6263
6263
|
if (requestEnvelope.id) {
|
|
6264
6264
|
responseContext.meta['response-to-id'] = requestEnvelope.id;
|
|
6265
6265
|
}
|
|
6266
|
-
logger$
|
|
6266
|
+
logger$1d.debug('returning_traditional_response', {
|
|
6267
6267
|
service_name: serviceName,
|
|
6268
6268
|
request_id: requestId,
|
|
6269
6269
|
envelope_id: requestEnvelope.id,
|
|
@@ -6328,7 +6328,7 @@ function normalizeErrorCode(code) {
|
|
|
6328
6328
|
return code;
|
|
6329
6329
|
}
|
|
6330
6330
|
|
|
6331
|
-
const logger$
|
|
6331
|
+
const logger$1c = getLogger('naylence.fame.node.rpc_client_manager');
|
|
6332
6332
|
function isPlainRecord$5(value) {
|
|
6333
6333
|
if (typeof value !== 'object' || value === null) {
|
|
6334
6334
|
return false;
|
|
@@ -6545,7 +6545,7 @@ class RPCClientManager {
|
|
|
6545
6545
|
const metaReason = tracked.meta?.['nack_reason'];
|
|
6546
6546
|
const formattedMessage = formatDeliveryErrorMessage(typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR', reason ??
|
|
6547
6547
|
(typeof metaReason === 'string' ? metaReason : undefined));
|
|
6548
|
-
logger$
|
|
6548
|
+
logger$1c.debug('pending_request_rejected_by_delivery_nack', {
|
|
6549
6549
|
envelope_id: envelopeId,
|
|
6550
6550
|
request_id: requestId,
|
|
6551
6551
|
code: typeof metaCode === 'string' ? metaCode : 'DELIVERY_ERROR',
|
|
@@ -6568,7 +6568,7 @@ class RPCClientManager {
|
|
|
6568
6568
|
this.trackerWithEvents.removeEventHandler?.(this.trackerEventHandler);
|
|
6569
6569
|
}
|
|
6570
6570
|
catch (error) {
|
|
6571
|
-
logger$
|
|
6571
|
+
logger$1c.debug('rpc_tracker_handler_remove_failed', {
|
|
6572
6572
|
error: error instanceof Error ? error.message : String(error),
|
|
6573
6573
|
});
|
|
6574
6574
|
}
|
|
@@ -6611,7 +6611,7 @@ class RPCClientManager {
|
|
|
6611
6611
|
this.rpcListenerAddress = await this.listenCallback(recipient, handler);
|
|
6612
6612
|
this.rpcBound = true;
|
|
6613
6613
|
this.boundPhysicalPath = currentPhysicalPath;
|
|
6614
|
-
logger$
|
|
6614
|
+
logger$1c.debug('rpc_reply_listener_bound', {
|
|
6615
6615
|
reply_recipient: recipient,
|
|
6616
6616
|
reply_address: this.rpcReplyAddress?.toString(),
|
|
6617
6617
|
listener_address: this.rpcListenerAddress?.toString(),
|
|
@@ -6705,7 +6705,7 @@ class RPCClientManager {
|
|
|
6705
6705
|
const finalizePromise = this.notifyStreamClosed(envelopeId);
|
|
6706
6706
|
if (finalizePromise) {
|
|
6707
6707
|
finalizePromise.catch((notifyError) => {
|
|
6708
|
-
logger$
|
|
6708
|
+
logger$1c.debug('stream_tracker_finalize_failed', {
|
|
6709
6709
|
request_id: requestId,
|
|
6710
6710
|
envelope_id: envelopeId,
|
|
6711
6711
|
error: notifyError instanceof Error
|
|
@@ -6766,7 +6766,7 @@ class RPCClientManager {
|
|
|
6766
6766
|
return iterator;
|
|
6767
6767
|
}
|
|
6768
6768
|
async sendRpcRequest(requestId, envelope, expectedResponseType, timeoutMs) {
|
|
6769
|
-
logger$
|
|
6769
|
+
logger$1c.debug('sending_rpc_request', {
|
|
6770
6770
|
envp_id: envelope.id,
|
|
6771
6771
|
corr_id: envelope.corrId,
|
|
6772
6772
|
request_id: requestId,
|
|
@@ -6782,7 +6782,7 @@ class RPCClientManager {
|
|
|
6782
6782
|
}
|
|
6783
6783
|
}
|
|
6784
6784
|
catch (error) {
|
|
6785
|
-
logger$
|
|
6785
|
+
logger$1c.warning('delivery_tracker_track_failed', {
|
|
6786
6786
|
request_id: requestId,
|
|
6787
6787
|
error: error instanceof Error ? error.message : String(error),
|
|
6788
6788
|
});
|
|
@@ -6795,14 +6795,14 @@ class RPCClientManager {
|
|
|
6795
6795
|
await this.deliverWrapper()(envelope, context);
|
|
6796
6796
|
}
|
|
6797
6797
|
async handleReplyEnvelope(envelope) {
|
|
6798
|
-
logger$
|
|
6798
|
+
logger$1c.debug('handle_reply_envelope_received', {
|
|
6799
6799
|
envelope_id: envelope.id,
|
|
6800
6800
|
corr_id: envelope.corrId,
|
|
6801
6801
|
frame_type: envelope.frame?.['type'],
|
|
6802
6802
|
});
|
|
6803
6803
|
let requestId = envelope.corrId ?? envelope.id;
|
|
6804
6804
|
if (!requestId) {
|
|
6805
|
-
logger$
|
|
6805
|
+
logger$1c.warning('reply_envelope_missing_corr_id', {
|
|
6806
6806
|
envelope_id: envelope.id,
|
|
6807
6807
|
});
|
|
6808
6808
|
return;
|
|
@@ -6820,12 +6820,12 @@ class RPCClientManager {
|
|
|
6820
6820
|
}
|
|
6821
6821
|
}
|
|
6822
6822
|
if (!entry) {
|
|
6823
|
-
logger$
|
|
6823
|
+
logger$1c.debug('no_pending_request_for_reply', {
|
|
6824
6824
|
request_id: requestId,
|
|
6825
6825
|
});
|
|
6826
6826
|
return;
|
|
6827
6827
|
}
|
|
6828
|
-
logger$
|
|
6828
|
+
logger$1c.debug('handle_reply_envelope', {
|
|
6829
6829
|
envelope_id: envelope.id,
|
|
6830
6830
|
request_id: requestId,
|
|
6831
6831
|
corr_id: envelope.corrId,
|
|
@@ -6838,7 +6838,7 @@ class RPCClientManager {
|
|
|
6838
6838
|
const ackIndicatesSuccess = frame.ok === true ||
|
|
6839
6839
|
(frame.ok === undefined && !frame.code && !frame.reason);
|
|
6840
6840
|
if (ackIndicatesSuccess) {
|
|
6841
|
-
logger$
|
|
6841
|
+
logger$1c.debug('pending_request_delivery_acknowledged', {
|
|
6842
6842
|
request_id: requestId,
|
|
6843
6843
|
envelope_id: envelope.id,
|
|
6844
6844
|
ref_id: frame.refId ?? null,
|
|
@@ -6866,7 +6866,7 @@ class RPCClientManager {
|
|
|
6866
6866
|
entry.timer = null;
|
|
6867
6867
|
}
|
|
6868
6868
|
if (!this.isDataFrame(envelope.frame)) {
|
|
6869
|
-
logger$
|
|
6869
|
+
logger$1c.warning('unexpected_reply_frame_type', {
|
|
6870
6870
|
request_id: requestId,
|
|
6871
6871
|
frame_type: envelope.frame?.['type'],
|
|
6872
6872
|
});
|
|
@@ -6932,7 +6932,7 @@ class RPCClientManager {
|
|
|
6932
6932
|
return;
|
|
6933
6933
|
}
|
|
6934
6934
|
Promise.resolve(this.deliveryTracker.onStreamItem(envelopeId, envelope)).catch((error) => {
|
|
6935
|
-
logger$
|
|
6935
|
+
logger$1c.debug('stream_tracker_push_failed', {
|
|
6936
6936
|
envelope_id: envelopeId,
|
|
6937
6937
|
error: error instanceof Error ? error.message : String(error),
|
|
6938
6938
|
});
|
|
@@ -7047,7 +7047,7 @@ function normalizeMailbox(mailbox) {
|
|
|
7047
7047
|
return mailbox;
|
|
7048
7048
|
}
|
|
7049
7049
|
|
|
7050
|
-
const logger$
|
|
7050
|
+
const logger$1b = getLogger('naylence.fame.node.envelope_listener_manager');
|
|
7051
7051
|
const SYSTEM_INBOX$2 = '__sys__';
|
|
7052
7052
|
class EnvelopeListener {
|
|
7053
7053
|
constructor(stopFn, task) {
|
|
@@ -7055,7 +7055,7 @@ class EnvelopeListener {
|
|
|
7055
7055
|
this.task = task;
|
|
7056
7056
|
}
|
|
7057
7057
|
stop() {
|
|
7058
|
-
logger$
|
|
7058
|
+
logger$1b.debug('stopping_listener', {
|
|
7059
7059
|
task_name: this.task.name,
|
|
7060
7060
|
});
|
|
7061
7061
|
try {
|
|
@@ -7063,7 +7063,7 @@ class EnvelopeListener {
|
|
|
7063
7063
|
if (maybeCleanup &&
|
|
7064
7064
|
typeof maybeCleanup.then === 'function') {
|
|
7065
7065
|
void maybeCleanup.catch((error) => {
|
|
7066
|
-
logger$
|
|
7066
|
+
logger$1b.debug('listener_stop_cleanup_failed', {
|
|
7067
7067
|
task_name: this.task.name,
|
|
7068
7068
|
error: error instanceof Error ? error.message : String(error),
|
|
7069
7069
|
});
|
|
@@ -7071,7 +7071,7 @@ class EnvelopeListener {
|
|
|
7071
7071
|
}
|
|
7072
7072
|
}
|
|
7073
7073
|
catch (error) {
|
|
7074
|
-
logger$
|
|
7074
|
+
logger$1b.debug('listener_stop_cleanup_failed', {
|
|
7075
7075
|
task_name: this.task.name,
|
|
7076
7076
|
error: error instanceof Error ? error.message : String(error),
|
|
7077
7077
|
});
|
|
@@ -7101,7 +7101,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7101
7101
|
envelope.replyTo = formatAddress(SYSTEM_INBOX$2, this.nodeLike.physicalPath);
|
|
7102
7102
|
}
|
|
7103
7103
|
catch (error) {
|
|
7104
|
-
logger$
|
|
7104
|
+
logger$1b.warning('default_reply_to_assignment_failed', {
|
|
7105
7105
|
envelope_id: envelope.id,
|
|
7106
7106
|
service_name: envelope.capabilities?.[0] ?? null,
|
|
7107
7107
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -7126,7 +7126,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7126
7126
|
if (serviceName === SYSTEM_INBOX$2) {
|
|
7127
7127
|
continue;
|
|
7128
7128
|
}
|
|
7129
|
-
logger$
|
|
7129
|
+
logger$1b.debug('stopping_listener_for_service', {
|
|
7130
7130
|
service_name: serviceName,
|
|
7131
7131
|
});
|
|
7132
7132
|
entry.listener.stop();
|
|
@@ -7136,7 +7136,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7136
7136
|
catch (error) {
|
|
7137
7137
|
if (!(error instanceof Error) ||
|
|
7138
7138
|
error.name !== 'TaskCancelledError') {
|
|
7139
|
-
logger$
|
|
7139
|
+
logger$1b.debug('listener_task_stopped', {
|
|
7140
7140
|
service_name: serviceName,
|
|
7141
7141
|
error: error instanceof Error ? error.message : String(error),
|
|
7142
7142
|
});
|
|
@@ -7144,7 +7144,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7144
7144
|
}
|
|
7145
7145
|
}
|
|
7146
7146
|
if (systemEntry) {
|
|
7147
|
-
logger$
|
|
7147
|
+
logger$1b.debug('stopping_listener_for_service', {
|
|
7148
7148
|
service_name: SYSTEM_INBOX$2,
|
|
7149
7149
|
});
|
|
7150
7150
|
systemEntry.listener.stop();
|
|
@@ -7154,7 +7154,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7154
7154
|
catch (error) {
|
|
7155
7155
|
if (!(error instanceof Error) ||
|
|
7156
7156
|
error.name !== 'TaskCancelledError') {
|
|
7157
|
-
logger$
|
|
7157
|
+
logger$1b.debug('listener_task_stopped', {
|
|
7158
7158
|
service_name: SYSTEM_INBOX$2,
|
|
7159
7159
|
error: error instanceof Error ? error.message : String(error),
|
|
7160
7160
|
});
|
|
@@ -7171,13 +7171,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7171
7171
|
}
|
|
7172
7172
|
async recoverUnhandledInboundEnvelopes() {
|
|
7173
7173
|
if (typeof this.deliveryTracker.listInbound !== 'function') {
|
|
7174
|
-
logger$
|
|
7174
|
+
logger$1b.debug('delivery_tracker_missing_inbound_listing');
|
|
7175
7175
|
return;
|
|
7176
7176
|
}
|
|
7177
7177
|
const failedInbound = await this.deliveryTracker.listInbound((env) => env.status === EnvelopeStatus.RECEIVED ||
|
|
7178
7178
|
env.status === EnvelopeStatus.FAILED_TO_HANDLE);
|
|
7179
7179
|
if (!failedInbound.length) {
|
|
7180
|
-
logger$
|
|
7180
|
+
logger$1b.debug('no_failed_inbound_envelopes_to_recover');
|
|
7181
7181
|
return;
|
|
7182
7182
|
}
|
|
7183
7183
|
const grouped = new Map();
|
|
@@ -7194,7 +7194,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7194
7194
|
this.pendingRecoveryEnvelopes.set(serviceName, envelopes);
|
|
7195
7195
|
}
|
|
7196
7196
|
});
|
|
7197
|
-
logger$
|
|
7197
|
+
logger$1b.debug('discovered_failed_inbound_envelopes', {
|
|
7198
7198
|
total: failedInbound.length,
|
|
7199
7199
|
services: Array.from(grouped.keys()),
|
|
7200
7200
|
});
|
|
@@ -7204,7 +7204,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7204
7204
|
const pollTimeoutMs = options.pollTimeoutMs ??
|
|
7205
7205
|
options.poll_timeout_ms ??
|
|
7206
7206
|
DEFAULT_POLLING_TIMEOUT_MS;
|
|
7207
|
-
logger$
|
|
7207
|
+
logger$1b.debug('listen_start', {
|
|
7208
7208
|
recipient: serviceName,
|
|
7209
7209
|
poll_timeout_ms: pollTimeoutMs ?? DEFAULT_POLLING_TIMEOUT_MS,
|
|
7210
7210
|
});
|
|
@@ -7235,7 +7235,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7235
7235
|
tracked?.mailboxType === MailboxType.OUTBOX ||
|
|
7236
7236
|
envelope.frame?.['type'] === 'DeliveryAck';
|
|
7237
7237
|
if (!shouldInvoke) {
|
|
7238
|
-
logger$
|
|
7238
|
+
logger$1b.debug('skipping_listener_handler', {
|
|
7239
7239
|
recipient: serviceName,
|
|
7240
7240
|
envelope_id: envelope.id,
|
|
7241
7241
|
tracked_status: tracked?.status,
|
|
@@ -7249,13 +7249,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7249
7249
|
? undefined
|
|
7250
7250
|
: (tracked ?? undefined);
|
|
7251
7251
|
if (trackedForHandler && trackedForHandler.attempt > 0) {
|
|
7252
|
-
logger$
|
|
7252
|
+
logger$1b.info('resuming_handler_retry_after_restart', {
|
|
7253
7253
|
envelope_id: envelope.id,
|
|
7254
7254
|
current_attempts: trackedForHandler.attempt,
|
|
7255
7255
|
service_name: serviceName,
|
|
7256
7256
|
});
|
|
7257
7257
|
}
|
|
7258
|
-
logger$
|
|
7258
|
+
logger$1b.debug('forwarding_to_listener_handler', {
|
|
7259
7259
|
recipient: serviceName,
|
|
7260
7260
|
envelope_id: envelope.id,
|
|
7261
7261
|
frame_type: envelope.frame?.['type'],
|
|
@@ -7274,7 +7274,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7274
7274
|
await channel.send(null);
|
|
7275
7275
|
}
|
|
7276
7276
|
catch (error) {
|
|
7277
|
-
logger$
|
|
7277
|
+
logger$1b.debug('listener_stop_signal_failed', {
|
|
7278
7278
|
service_name: serviceName,
|
|
7279
7279
|
error: error instanceof Error ? error.message : String(error),
|
|
7280
7280
|
});
|
|
@@ -7283,7 +7283,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7283
7283
|
await this.listenersLock.runExclusive(async () => {
|
|
7284
7284
|
const existing = this.listeners.get(serviceName);
|
|
7285
7285
|
if (existing) {
|
|
7286
|
-
logger$
|
|
7286
|
+
logger$1b.debug('replacing_envelope_listener', { recipient: serviceName });
|
|
7287
7287
|
existing.listener.stop();
|
|
7288
7288
|
try {
|
|
7289
7289
|
await existing.listener.task.promise;
|
|
@@ -7301,13 +7301,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7301
7301
|
return binding.address;
|
|
7302
7302
|
}
|
|
7303
7303
|
async listenRpc(serviceName, handler, options = {}) {
|
|
7304
|
-
logger$
|
|
7304
|
+
logger$1b.debug('rpc_listen_start', { service_name: serviceName });
|
|
7305
7305
|
const rpcHandler = async (envelope, context) => {
|
|
7306
7306
|
const result = await this.rpcServerHandler.handleRpcRequest(envelope, context, handler, serviceName);
|
|
7307
7307
|
return result ?? null;
|
|
7308
7308
|
};
|
|
7309
7309
|
const address = await this.listen(serviceName, rpcHandler, options);
|
|
7310
|
-
logger$
|
|
7310
|
+
logger$1b.debug('rpc_listen_bound', {
|
|
7311
7311
|
service_name: serviceName,
|
|
7312
7312
|
address: address.toString(),
|
|
7313
7313
|
});
|
|
@@ -7376,12 +7376,12 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7376
7376
|
return cached;
|
|
7377
7377
|
});
|
|
7378
7378
|
if (!envelopes.length) {
|
|
7379
|
-
logger$
|
|
7379
|
+
logger$1b.debug('no_cached_recovery_for_service', {
|
|
7380
7380
|
service_name: serviceName,
|
|
7381
7381
|
});
|
|
7382
7382
|
return;
|
|
7383
7383
|
}
|
|
7384
|
-
logger$
|
|
7384
|
+
logger$1b.debug('recovering_unhandled_envelopes_on_listen', {
|
|
7385
7385
|
service_name: serviceName,
|
|
7386
7386
|
count: envelopes.length,
|
|
7387
7387
|
envelope_ids: envelopes.map((trackedEnvelope) => trackedEnvelope.envelopeId),
|
|
@@ -7392,7 +7392,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7392
7392
|
async recoverServiceEnvelopes(serviceName, envelopes, handler) {
|
|
7393
7393
|
for (const tracked of envelopes) {
|
|
7394
7394
|
try {
|
|
7395
|
-
logger$
|
|
7395
|
+
logger$1b.warning('recovering_unhandled_envelope', {
|
|
7396
7396
|
envelope_id: tracked.envelopeId,
|
|
7397
7397
|
service_name: serviceName,
|
|
7398
7398
|
current_attempts: tracked.attempt,
|
|
@@ -7401,13 +7401,13 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7401
7401
|
const originalEnvelope = tracked.originalEnvelope;
|
|
7402
7402
|
const receiverPolicy = this.nodeLike.deliveryPolicy?.receiverRetryPolicy ?? undefined;
|
|
7403
7403
|
await this.executeHandlerWithRetries(handler, originalEnvelope, undefined, receiverPolicy, tracked, serviceName);
|
|
7404
|
-
logger$
|
|
7404
|
+
logger$1b.debug('envelope_recovery_completed', {
|
|
7405
7405
|
envelope_id: tracked.envelopeId,
|
|
7406
7406
|
service_name: serviceName,
|
|
7407
7407
|
});
|
|
7408
7408
|
}
|
|
7409
7409
|
catch (error) {
|
|
7410
|
-
logger$
|
|
7410
|
+
logger$1b.error('envelope_recovery_failed', {
|
|
7411
7411
|
envelope_id: tracked.envelopeId,
|
|
7412
7412
|
service_name: serviceName,
|
|
7413
7413
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -7453,7 +7453,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7453
7453
|
await this.deliveryTracker.onEnvelopeHandled(trackedEnvelope);
|
|
7454
7454
|
}
|
|
7455
7455
|
if (currentAttempt > 0) {
|
|
7456
|
-
logger$
|
|
7456
|
+
logger$1b.info('handler_retry_succeeded', {
|
|
7457
7457
|
envelope_id: envelope.id,
|
|
7458
7458
|
attempt: currentAttempt + 1,
|
|
7459
7459
|
total_attempts: currentAttempt + 1,
|
|
@@ -7469,7 +7469,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7469
7469
|
await this.deliveryTracker.onEnvelopeHandleFailed(inboxName, trackedEnvelope, context, error instanceof Error ? error : new Error(String(error)), isFinalAttempt);
|
|
7470
7470
|
}
|
|
7471
7471
|
if (isFinalAttempt) {
|
|
7472
|
-
logger$
|
|
7472
|
+
logger$1b.error('handler_execution_failed_exhausted_retries', {
|
|
7473
7473
|
envelope_id: envelope.id,
|
|
7474
7474
|
total_attempts: attemptNumber,
|
|
7475
7475
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -7478,7 +7478,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7478
7478
|
break;
|
|
7479
7479
|
}
|
|
7480
7480
|
const delayMs = retryPolicy?.nextDelayMs(attemptNumber) ?? 0;
|
|
7481
|
-
logger$
|
|
7481
|
+
logger$1b.warning('handler_execution_failed_will_retry', {
|
|
7482
7482
|
envelope_id: envelope.id,
|
|
7483
7483
|
attempt: attemptNumber,
|
|
7484
7484
|
max_retries: retryPolicy?.maxRetries ?? 0,
|
|
@@ -7508,7 +7508,7 @@ class EnvelopeListenerManager extends TaskSpawner {
|
|
|
7508
7508
|
}
|
|
7509
7509
|
}
|
|
7510
7510
|
|
|
7511
|
-
const logger$
|
|
7511
|
+
const logger$1a = getLogger('naylence.fame.delivery.default_delivery_tracker');
|
|
7512
7512
|
const STREAM_END = Symbol('stream-end');
|
|
7513
7513
|
const SWEEPER_TICK = Symbol('tracker-sweeper-tick');
|
|
7514
7514
|
function createDeferred$2() {
|
|
@@ -7727,7 +7727,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7727
7727
|
const expectedResponseType = options.expectedResponseType;
|
|
7728
7728
|
const tracked = await this.lock.runExclusive(async () => {
|
|
7729
7729
|
if (this.ackFutures.has(envelope.id)) {
|
|
7730
|
-
logger$
|
|
7730
|
+
logger$1a.debug('tracker_envelope_already_tracked', {
|
|
7731
7731
|
envp_id: envelope.id,
|
|
7732
7732
|
});
|
|
7733
7733
|
return null;
|
|
@@ -7737,7 +7737,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7737
7737
|
if (expectedResponseType & FameResponseType.REPLY ||
|
|
7738
7738
|
expectedResponseType & FameResponseType.STREAM) {
|
|
7739
7739
|
if (existingEnvId && existingEnvId !== envelope.id) {
|
|
7740
|
-
logger$
|
|
7740
|
+
logger$1a.debug('envelope_already_tracked_for_replies', {
|
|
7741
7741
|
envp_id: envelope.id,
|
|
7742
7742
|
corr_id: corrId,
|
|
7743
7743
|
expected_response_type: expectedResponseType,
|
|
@@ -7786,7 +7786,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7786
7786
|
return null;
|
|
7787
7787
|
}
|
|
7788
7788
|
await this.scheduleTimer(tracked, options.retryPolicy ?? null, options.retryHandler ?? null);
|
|
7789
|
-
logger$
|
|
7789
|
+
logger$1a.debug('tracker_registered_envelope', {
|
|
7790
7790
|
envp_id: envelope.id,
|
|
7791
7791
|
corr_id: tracked.originalEnvelope.corrId,
|
|
7792
7792
|
expected_response: tracked.expectedResponseType,
|
|
@@ -7810,21 +7810,21 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7810
7810
|
return this.awaitEnvelopeFuture(envelopeId, FameResponseType.REPLY | FameResponseType.STREAM, future, timeoutMs);
|
|
7811
7811
|
}
|
|
7812
7812
|
async onEnvelopeDelivered(inboxName, envelope, context) {
|
|
7813
|
-
logger$
|
|
7813
|
+
logger$1a.debug('envelope_delivered', {
|
|
7814
7814
|
envp_id: envelope.id,
|
|
7815
7815
|
corr_id: envelope.corrId,
|
|
7816
7816
|
rtype: envelope.rtype ?? FameResponseType.NONE,
|
|
7817
7817
|
frame_type: envelope.frame?.type ?? 'unknown',
|
|
7818
7818
|
});
|
|
7819
7819
|
if (!envelope.corrId) {
|
|
7820
|
-
logger$
|
|
7820
|
+
logger$1a.debug('envelope_delivered_no_corr_id', {
|
|
7821
7821
|
envelope_id: envelope.id,
|
|
7822
7822
|
});
|
|
7823
7823
|
return null;
|
|
7824
7824
|
}
|
|
7825
7825
|
if (this.isDeliveryAckFrame(envelope.frame)) {
|
|
7826
7826
|
if (!envelope.frame.refId) {
|
|
7827
|
-
logger$
|
|
7827
|
+
logger$1a.debug('envelope_delivered_no_ref_id', {
|
|
7828
7828
|
envelope_id: envelope.id,
|
|
7829
7829
|
});
|
|
7830
7830
|
return null;
|
|
@@ -7861,7 +7861,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7861
7861
|
await inbox.set(envelope.id, tracked);
|
|
7862
7862
|
}
|
|
7863
7863
|
else {
|
|
7864
|
-
logger$
|
|
7864
|
+
logger$1a.debug('tracker_duplicate_envelope_already_handled', {
|
|
7865
7865
|
envp_id: envelope.id,
|
|
7866
7866
|
status: tracked.status,
|
|
7867
7867
|
});
|
|
@@ -7903,7 +7903,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7903
7903
|
}
|
|
7904
7904
|
if (isFinalFailure) {
|
|
7905
7905
|
envelope.status = EnvelopeStatus.FAILED_TO_HANDLE;
|
|
7906
|
-
logger$
|
|
7906
|
+
logger$1a.error('envelope_handle_failed_final', {
|
|
7907
7907
|
inbox_name: inboxName,
|
|
7908
7908
|
envp_id: envelope.originalEnvelope.id,
|
|
7909
7909
|
error: error?.message ?? 'unknown',
|
|
@@ -7914,7 +7914,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7914
7914
|
await inbox.delete(envelope.originalEnvelope.id);
|
|
7915
7915
|
return;
|
|
7916
7916
|
}
|
|
7917
|
-
logger$
|
|
7917
|
+
logger$1a.warning('envelope_handle_failed_retry', {
|
|
7918
7918
|
inbox_name: inboxName,
|
|
7919
7919
|
envp_id: envelope.originalEnvelope.id,
|
|
7920
7920
|
error: error?.message ?? 'unknown',
|
|
@@ -7959,14 +7959,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7959
7959
|
if (handledViaFuture) {
|
|
7960
7960
|
await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
|
|
7961
7961
|
await this.clearTimer(refId);
|
|
7962
|
-
logger$
|
|
7962
|
+
logger$1a.debug('tracker_ack_resolved_without_tracked_envelope', {
|
|
7963
7963
|
envp_id: envelope.id,
|
|
7964
7964
|
ref_id: refId,
|
|
7965
7965
|
corr_id: envelope.corrId,
|
|
7966
7966
|
});
|
|
7967
7967
|
return;
|
|
7968
7968
|
}
|
|
7969
|
-
logger$
|
|
7969
|
+
logger$1a.debug('tracker_ack_for_unknown_envelope', {
|
|
7970
7970
|
envp_id: envelope.id,
|
|
7971
7971
|
ref_id: refId,
|
|
7972
7972
|
corr_id: envelope.corrId,
|
|
@@ -7974,7 +7974,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7974
7974
|
return;
|
|
7975
7975
|
}
|
|
7976
7976
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
7977
|
-
logger$
|
|
7977
|
+
logger$1a.debug('tracker_ack_corr_id_mismatch', {
|
|
7978
7978
|
envp_id: envelope.id,
|
|
7979
7979
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
7980
7980
|
actual_corr_id: envelope.corrId,
|
|
@@ -7999,7 +7999,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
7999
7999
|
for (const handler of this.eventHandlers) {
|
|
8000
8000
|
await handler.onEnvelopeAcked?.(tracked);
|
|
8001
8001
|
}
|
|
8002
|
-
logger$
|
|
8002
|
+
logger$1a.debug('tracker_envelope_acked', {
|
|
8003
8003
|
envp_id: tracked.originalEnvelope.id,
|
|
8004
8004
|
});
|
|
8005
8005
|
}
|
|
@@ -8016,13 +8016,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8016
8016
|
const outbox = this.ensureOutbox();
|
|
8017
8017
|
const tracked = await outbox.get(envelope.frame.refId);
|
|
8018
8018
|
if (!tracked) {
|
|
8019
|
-
logger$
|
|
8019
|
+
logger$1a.debug('tracker_nack_for_unknown_envelope', {
|
|
8020
8020
|
envp_id: envelope.id,
|
|
8021
8021
|
});
|
|
8022
8022
|
return;
|
|
8023
8023
|
}
|
|
8024
8024
|
if (tracked.originalEnvelope.corrId !== envelope.corrId) {
|
|
8025
|
-
logger$
|
|
8025
|
+
logger$1a.debug('tracker_nack_corr_id_mismatch', {
|
|
8026
8026
|
envp_id: envelope.id,
|
|
8027
8027
|
expected_corr_id: tracked.originalEnvelope.corrId,
|
|
8028
8028
|
actual_corr_id: envelope.corrId,
|
|
@@ -8064,7 +8064,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8064
8064
|
for (const handler of this.eventHandlers) {
|
|
8065
8065
|
await handler.onEnvelopeNacked?.(tracked, ackFrame.reason ?? null);
|
|
8066
8066
|
}
|
|
8067
|
-
logger$
|
|
8067
|
+
logger$1a.debug('tracker_envelope_nacked', {
|
|
8068
8068
|
envp_id: tracked.originalEnvelope.id,
|
|
8069
8069
|
reason: ackFrame.reason,
|
|
8070
8070
|
});
|
|
@@ -8111,7 +8111,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8111
8111
|
for (const handler of this.eventHandlers) {
|
|
8112
8112
|
await handler.onEnvelopeReplied?.(trackedEnvelope, envelope);
|
|
8113
8113
|
}
|
|
8114
|
-
logger$
|
|
8114
|
+
logger$1a.debug('tracked_envelope_replied', {
|
|
8115
8115
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
8116
8116
|
corr_id: envelope.corrId,
|
|
8117
8117
|
});
|
|
@@ -8185,7 +8185,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8185
8185
|
async addToInboxDlq(trackedEnvelope, reason = null) {
|
|
8186
8186
|
const dlq = this.inboxDlq;
|
|
8187
8187
|
if (!dlq) {
|
|
8188
|
-
logger$
|
|
8188
|
+
logger$1a.error('dlq_not_initialized', {
|
|
8189
8189
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
8190
8190
|
});
|
|
8191
8191
|
return;
|
|
@@ -8200,7 +8200,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8200
8200
|
const deadLetteredAt = Date.now();
|
|
8201
8201
|
setMetaWithLegacy(trackedEnvelope.meta, 'deadLetteredAtMs', 'dead_lettered_at_ms', deadLetteredAt);
|
|
8202
8202
|
await dlq.set(trackedEnvelope.originalEnvelope.id, trackedEnvelope);
|
|
8203
|
-
logger$
|
|
8203
|
+
logger$1a.warning('envelope_moved_to_dlq', {
|
|
8204
8204
|
envp_id: trackedEnvelope.originalEnvelope.id,
|
|
8205
8205
|
service_name: trackedEnvelope.serviceName,
|
|
8206
8206
|
});
|
|
@@ -8229,7 +8229,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8229
8229
|
const toDelete = Object.entries(items).filter(([, value]) => predicate ? predicate(value) : true);
|
|
8230
8230
|
await Promise.all(toDelete.map(([key]) => dlq.delete(key)));
|
|
8231
8231
|
if (toDelete.length) {
|
|
8232
|
-
logger$
|
|
8232
|
+
logger$1a.debug('dlq_purged', { count: toDelete.length });
|
|
8233
8233
|
}
|
|
8234
8234
|
return toDelete.length;
|
|
8235
8235
|
}
|
|
@@ -8282,11 +8282,11 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8282
8282
|
}
|
|
8283
8283
|
this.futuresSweeper = null;
|
|
8284
8284
|
}
|
|
8285
|
-
logger$
|
|
8285
|
+
logger$1a.debug('tracker_cleanup_completed');
|
|
8286
8286
|
}
|
|
8287
8287
|
async recoverPending() {
|
|
8288
8288
|
const pending = await this.listPending();
|
|
8289
|
-
logger$
|
|
8289
|
+
logger$1a.debug('tracker_recovering_pending', { count: pending.length });
|
|
8290
8290
|
await this.lock.runExclusive(async () => {
|
|
8291
8291
|
for (const tracked of pending) {
|
|
8292
8292
|
if (tracked.expectedResponseType & FameResponseType.ACK) {
|
|
@@ -8312,7 +8312,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8312
8312
|
for (const tracked of pending) {
|
|
8313
8313
|
await this.scheduleTimer(tracked, null, null);
|
|
8314
8314
|
}
|
|
8315
|
-
logger$
|
|
8315
|
+
logger$1a.debug('tracker_recovery_completed', { count: pending.length });
|
|
8316
8316
|
}
|
|
8317
8317
|
ensureOutbox() {
|
|
8318
8318
|
if (!this.outbox) {
|
|
@@ -8327,7 +8327,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8327
8327
|
return this.inbox;
|
|
8328
8328
|
}
|
|
8329
8329
|
async waitForPendingAcks() {
|
|
8330
|
-
logger$
|
|
8330
|
+
logger$1a.debug('tracker_node_preparing_to_stop_waiting_for_pending_acks');
|
|
8331
8331
|
const outbox = this.outbox;
|
|
8332
8332
|
if (!outbox) {
|
|
8333
8333
|
return;
|
|
@@ -8339,7 +8339,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8339
8339
|
continue;
|
|
8340
8340
|
}
|
|
8341
8341
|
if (!future.done) {
|
|
8342
|
-
logger$
|
|
8342
|
+
logger$1a.debug('tracker_pending_ack_future_detected', {
|
|
8343
8343
|
envelope_id: envelopeId,
|
|
8344
8344
|
});
|
|
8345
8345
|
pending.push({ envelopeId, future });
|
|
@@ -8347,10 +8347,10 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8347
8347
|
}
|
|
8348
8348
|
});
|
|
8349
8349
|
if (!pending.length) {
|
|
8350
|
-
logger$
|
|
8350
|
+
logger$1a.debug('tracker_no_pending_acks_to_wait_for');
|
|
8351
8351
|
return;
|
|
8352
8352
|
}
|
|
8353
|
-
logger$
|
|
8353
|
+
logger$1a.debug('tracker_waiting_for_pending_acks', { count: pending.length });
|
|
8354
8354
|
for (const entry of pending) {
|
|
8355
8355
|
if (!entry) {
|
|
8356
8356
|
continue;
|
|
@@ -8367,19 +8367,19 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8367
8367
|
}
|
|
8368
8368
|
try {
|
|
8369
8369
|
await this.awaitWithTimeout(entry.future.promise, remainingMs);
|
|
8370
|
-
logger$
|
|
8370
|
+
logger$1a.debug('tracker_received_ack', {
|
|
8371
8371
|
envelope_id: entry.envelopeId,
|
|
8372
8372
|
});
|
|
8373
8373
|
await outbox.delete(entry.envelopeId);
|
|
8374
8374
|
}
|
|
8375
8375
|
catch (error) {
|
|
8376
8376
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
8377
|
-
logger$
|
|
8377
|
+
logger$1a.debug('tracker_ack_timeout_expired', {
|
|
8378
8378
|
envelope_id: entry.envelopeId,
|
|
8379
8379
|
});
|
|
8380
8380
|
}
|
|
8381
8381
|
else {
|
|
8382
|
-
logger$
|
|
8382
|
+
logger$1a.debug('tracker_ack_wait_error', {
|
|
8383
8383
|
envelope_id: entry.envelopeId,
|
|
8384
8384
|
error: error instanceof Error ? error.message : String(error),
|
|
8385
8385
|
});
|
|
@@ -8387,13 +8387,13 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8387
8387
|
}
|
|
8388
8388
|
}
|
|
8389
8389
|
catch (error) {
|
|
8390
|
-
logger$
|
|
8390
|
+
logger$1a.error('tracker_error_waiting_for_ack', {
|
|
8391
8391
|
envelope_id: entry.envelopeId,
|
|
8392
8392
|
error: error instanceof Error ? error.message : String(error),
|
|
8393
8393
|
});
|
|
8394
8394
|
}
|
|
8395
8395
|
}
|
|
8396
|
-
logger$
|
|
8396
|
+
logger$1a.debug('tracker_finished_waiting_for_pending_acks');
|
|
8397
8397
|
}
|
|
8398
8398
|
async waitForPendingAckDispatches() {
|
|
8399
8399
|
while (this.pendingAckDispatches.size > 0) {
|
|
@@ -8451,7 +8451,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8451
8451
|
for (const handler of this.eventHandlers) {
|
|
8452
8452
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
8453
8453
|
}
|
|
8454
|
-
logger$
|
|
8454
|
+
logger$1a.debug('tracker_envelope_timed_out', {
|
|
8455
8455
|
envp_id: tracked.originalEnvelope.id,
|
|
8456
8456
|
});
|
|
8457
8457
|
return;
|
|
@@ -8464,7 +8464,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8464
8464
|
currentTracked.timeoutAtMs = nextTimeoutAt;
|
|
8465
8465
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
8466
8466
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
8467
|
-
logger$
|
|
8467
|
+
logger$1a.debug('tracker_retry_deferred_during_shutdown', {
|
|
8468
8468
|
envp_id: tracked.originalEnvelope.id,
|
|
8469
8469
|
defer_ms: shutdownDeferMs,
|
|
8470
8470
|
});
|
|
@@ -8487,7 +8487,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8487
8487
|
});
|
|
8488
8488
|
}
|
|
8489
8489
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
8490
|
-
logger$
|
|
8490
|
+
logger$1a.debug('envelope_delivery_retry_scheduled', {
|
|
8491
8491
|
envp_id: tracked.originalEnvelope.id,
|
|
8492
8492
|
attempt: currentTracked.attempt,
|
|
8493
8493
|
max_retries: retryPolicy.maxRetries,
|
|
@@ -8499,7 +8499,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8499
8499
|
currentTracked.timeoutAtMs = currentTracked.overallTimeoutAtMs;
|
|
8500
8500
|
await outbox.set(tracked.originalEnvelope.id, currentTracked);
|
|
8501
8501
|
await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
|
|
8502
|
-
logger$
|
|
8502
|
+
logger$1a.debug('envelope_retries_exhausted_waiting_until_overall_timeout', {
|
|
8503
8503
|
envp_id: tracked.originalEnvelope.id,
|
|
8504
8504
|
attempt: currentTracked.attempt,
|
|
8505
8505
|
overall_timeout_at_ms: currentTracked.overallTimeoutAtMs,
|
|
@@ -8519,7 +8519,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8519
8519
|
for (const handler of this.eventHandlers) {
|
|
8520
8520
|
await handler.onEnvelopeTimeout?.(currentTracked);
|
|
8521
8521
|
}
|
|
8522
|
-
logger$
|
|
8522
|
+
logger$1a.debug('tracker_envelope_timed_out', {
|
|
8523
8523
|
envp_id: tracked.originalEnvelope.id,
|
|
8524
8524
|
});
|
|
8525
8525
|
}
|
|
@@ -8527,7 +8527,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8527
8527
|
if (error instanceof TaskCancelledError) {
|
|
8528
8528
|
return;
|
|
8529
8529
|
}
|
|
8530
|
-
logger$
|
|
8530
|
+
logger$1a.error('tracker_timer_error', {
|
|
8531
8531
|
envp_id: tracked.originalEnvelope.id,
|
|
8532
8532
|
error: error instanceof Error ? error.message : String(error),
|
|
8533
8533
|
});
|
|
@@ -8582,7 +8582,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8582
8582
|
if (timeoutSeconds !== null) {
|
|
8583
8583
|
return await this.awaitWithTimeout(future.promise, timeoutSeconds);
|
|
8584
8584
|
}
|
|
8585
|
-
logger$
|
|
8585
|
+
logger$1a.debug('await_envelope_no_timeout_wait', {
|
|
8586
8586
|
envelope_id: envelopeId,
|
|
8587
8587
|
});
|
|
8588
8588
|
return await future.promise;
|
|
@@ -8591,7 +8591,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8591
8591
|
if (error instanceof Error && error.name !== 'TimeoutError') {
|
|
8592
8592
|
throw error;
|
|
8593
8593
|
}
|
|
8594
|
-
logger$
|
|
8594
|
+
logger$1a.error('await_envelope_timeout_error', {
|
|
8595
8595
|
envelope_id: envelopeId,
|
|
8596
8596
|
timeout_ms: timeoutSeconds,
|
|
8597
8597
|
future_done: false,
|
|
@@ -8752,7 +8752,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8752
8752
|
this.replyDoneSince.delete(envId);
|
|
8753
8753
|
}
|
|
8754
8754
|
});
|
|
8755
|
-
logger$
|
|
8755
|
+
logger$1a.debug('tracker_swept_completed_futures', {
|
|
8756
8756
|
ack_removed: toRemoveAck.length,
|
|
8757
8757
|
reply_removed: toRemoveReply.length,
|
|
8758
8758
|
grace_secs: this.futGcGraceSecs,
|
|
@@ -8766,7 +8766,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8766
8766
|
if (error instanceof Error && error.name === 'TimeoutError') {
|
|
8767
8767
|
continue;
|
|
8768
8768
|
}
|
|
8769
|
-
logger$
|
|
8769
|
+
logger$1a.error('tracker_sweeper_error', {
|
|
8770
8770
|
error: error instanceof Error ? error.message : String(error),
|
|
8771
8771
|
});
|
|
8772
8772
|
}
|
|
@@ -8797,14 +8797,14 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8797
8797
|
}
|
|
8798
8798
|
const node = this.node;
|
|
8799
8799
|
if (!envelope.replyTo) {
|
|
8800
|
-
logger$
|
|
8800
|
+
logger$1a.error('cannot_send_ack_no_reply_to', { envp_id: envelope.id });
|
|
8801
8801
|
return;
|
|
8802
8802
|
}
|
|
8803
8803
|
if (!envelope.corrId) {
|
|
8804
|
-
logger$
|
|
8804
|
+
logger$1a.error('cannot_send_ack_no_corr_id', { envp_id: envelope.id });
|
|
8805
8805
|
return;
|
|
8806
8806
|
}
|
|
8807
|
-
logger$
|
|
8807
|
+
logger$1a.debug('tracker_sending_ack', {
|
|
8808
8808
|
envp_id: envelope.id,
|
|
8809
8809
|
ref_id: envelope.id,
|
|
8810
8810
|
to: envelope.replyTo,
|
|
@@ -8824,7 +8824,7 @@ class DefaultDeliveryTracker extends TaskSpawner {
|
|
|
8824
8824
|
.send(ackEnvelope)
|
|
8825
8825
|
.then(() => undefined)
|
|
8826
8826
|
.catch((error) => {
|
|
8827
|
-
logger$
|
|
8827
|
+
logger$1a.error('tracker_ack_dispatch_failed', {
|
|
8828
8828
|
envp_id: envelope.id,
|
|
8829
8829
|
error: error instanceof Error ? error.message : String(error),
|
|
8830
8830
|
});
|
|
@@ -8910,7 +8910,7 @@ class AsyncEvent {
|
|
|
8910
8910
|
}
|
|
8911
8911
|
}
|
|
8912
8912
|
|
|
8913
|
-
const logger$
|
|
8913
|
+
const logger$19 = getLogger('naylence.fame.node.root_session_manager');
|
|
8914
8914
|
function resolveOption$1(options, primary, ...aliases) {
|
|
8915
8915
|
const record = options;
|
|
8916
8916
|
const primaryKey = primary;
|
|
@@ -8991,7 +8991,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
8991
8991
|
this.onAdmissionFailed =
|
|
8992
8992
|
typeof onAdmissionFailed === 'function' ? onAdmissionFailed : undefined;
|
|
8993
8993
|
this.enableContinuousRefresh = enableContinuousRefresh ?? true;
|
|
8994
|
-
logger$
|
|
8994
|
+
logger$19.debug('created_root_session_manager');
|
|
8995
8995
|
}
|
|
8996
8996
|
get isReady() {
|
|
8997
8997
|
return this.readyEvent.isSet();
|
|
@@ -9016,7 +9016,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9016
9016
|
if (this.admissionTask) {
|
|
9017
9017
|
return;
|
|
9018
9018
|
}
|
|
9019
|
-
logger$
|
|
9019
|
+
logger$19.debug('root_session_manager_starting');
|
|
9020
9020
|
this.stopEvent.clear();
|
|
9021
9021
|
this.readyEvent.clear();
|
|
9022
9022
|
const taskName = `root-admission-${this.admissionEpoch}`;
|
|
@@ -9036,10 +9036,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9036
9036
|
await this.admissionTask.promise;
|
|
9037
9037
|
throw new FameConnectError('Root session manager failed to become ready');
|
|
9038
9038
|
}
|
|
9039
|
-
logger$
|
|
9039
|
+
logger$19.debug('root_session_manager_started');
|
|
9040
9040
|
}
|
|
9041
9041
|
async stop() {
|
|
9042
|
-
logger$
|
|
9042
|
+
logger$19.debug('root_session_manager_stopping');
|
|
9043
9043
|
this.stopEvent.set();
|
|
9044
9044
|
if (this.admissionTask) {
|
|
9045
9045
|
this.admissionTask.cancel();
|
|
@@ -9051,7 +9051,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9051
9051
|
await this.consumeTask(this.expiryGuardTask);
|
|
9052
9052
|
this.expiryGuardTask = null;
|
|
9053
9053
|
}
|
|
9054
|
-
logger$
|
|
9054
|
+
logger$19.debug('root_session_manager_stopped');
|
|
9055
9055
|
}
|
|
9056
9056
|
async awaitReady(timeoutMs) {
|
|
9057
9057
|
if (this.isReady) {
|
|
@@ -9092,12 +9092,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9092
9092
|
await this.onEpochChange(epoch);
|
|
9093
9093
|
}
|
|
9094
9094
|
else {
|
|
9095
|
-
logger$
|
|
9095
|
+
logger$19.debug('epoch_change_ignored_no_handler', { epoch });
|
|
9096
9096
|
}
|
|
9097
9097
|
}
|
|
9098
9098
|
static createForRootSentinel(node, admissionClient, requestedLogicals = [], enableContinuousRefresh = true, onEpochChange) {
|
|
9099
9099
|
const handleWelcome = async (frame) => {
|
|
9100
|
-
logger$
|
|
9100
|
+
logger$19.info('root_admission_successful', {
|
|
9101
9101
|
system_id: frame.systemId,
|
|
9102
9102
|
assigned_path: frame.assignedPath ?? null,
|
|
9103
9103
|
accepted_logicals: frame.acceptedLogicals ?? [],
|
|
@@ -9108,12 +9108,12 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9108
9108
|
? grant.purpose
|
|
9109
9109
|
: undefined;
|
|
9110
9110
|
if (purpose) {
|
|
9111
|
-
logger$
|
|
9111
|
+
logger$19.debug('received_admission_grant', { purpose });
|
|
9112
9112
|
}
|
|
9113
9113
|
}
|
|
9114
9114
|
};
|
|
9115
9115
|
const handleFailure = async (error) => {
|
|
9116
|
-
logger$
|
|
9116
|
+
logger$19.error('root_admission_failed_permanently', {
|
|
9117
9117
|
error: error.message,
|
|
9118
9118
|
});
|
|
9119
9119
|
};
|
|
@@ -9142,10 +9142,10 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9142
9142
|
this.readyEvent.set();
|
|
9143
9143
|
}
|
|
9144
9144
|
if (this.hadSuccessfulAdmission) {
|
|
9145
|
-
logger$
|
|
9145
|
+
logger$19.debug('root_admission_refreshed');
|
|
9146
9146
|
}
|
|
9147
9147
|
else {
|
|
9148
|
-
logger$
|
|
9148
|
+
logger$19.debug('root_admission_completed');
|
|
9149
9149
|
}
|
|
9150
9150
|
this.hadSuccessfulAdmission = true;
|
|
9151
9151
|
delay = RootSessionManager.BACKOFF_INITIAL;
|
|
@@ -9154,7 +9154,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9154
9154
|
await this.startExpiryGuard(welcomeFrame);
|
|
9155
9155
|
const expiryTriggered = await this.waitForExpiryOrStop();
|
|
9156
9156
|
if (expiryTriggered && !this.stopEvent.isSet()) {
|
|
9157
|
-
logger$
|
|
9157
|
+
logger$19.debug('performing_scheduled_re_admission');
|
|
9158
9158
|
continue;
|
|
9159
9159
|
}
|
|
9160
9160
|
}
|
|
@@ -9166,7 +9166,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9166
9166
|
}
|
|
9167
9167
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
9168
9168
|
const willRetry = attempts < RootSessionManager.RETRY_MAX_ATTEMPTS;
|
|
9169
|
-
logger$
|
|
9169
|
+
logger$19.warning('root_admission_failed', {
|
|
9170
9170
|
error: errorObject.message,
|
|
9171
9171
|
attempt: attempts,
|
|
9172
9172
|
will_retry: willRetry,
|
|
@@ -9184,7 +9184,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9184
9184
|
}
|
|
9185
9185
|
}
|
|
9186
9186
|
if (attempts >= RootSessionManager.RETRY_MAX_ATTEMPTS) {
|
|
9187
|
-
logger$
|
|
9187
|
+
logger$19.error('root_admission_max_attempts_exceeded', {
|
|
9188
9188
|
max_attempts: RootSessionManager.RETRY_MAX_ATTEMPTS,
|
|
9189
9189
|
});
|
|
9190
9190
|
}
|
|
@@ -9261,7 +9261,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9261
9261
|
}
|
|
9262
9262
|
async expiryGuard(welcomeFrame, signal) {
|
|
9263
9263
|
if (!welcomeFrame.expiresAt) {
|
|
9264
|
-
logger$
|
|
9264
|
+
logger$19.debug('no_admission_expiry_configured');
|
|
9265
9265
|
await Promise.race([this.stopEvent.wait(), this.waitForAbort(signal)]);
|
|
9266
9266
|
return;
|
|
9267
9267
|
}
|
|
@@ -9270,7 +9270,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9270
9270
|
let delaySeconds = (expiresAt.getTime() - now.getTime()) / 1000 -
|
|
9271
9271
|
RootSessionManager.JWT_REFRESH_SAFETY;
|
|
9272
9272
|
delaySeconds = Math.max(delaySeconds, 0);
|
|
9273
|
-
logger$
|
|
9273
|
+
logger$19.debug('admission_expiry_guard_started', {
|
|
9274
9274
|
welcome_expires_at: expiresAt.toISOString(),
|
|
9275
9275
|
delay_seconds: delaySeconds,
|
|
9276
9276
|
refresh_safety_seconds: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -9279,7 +9279,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9279
9279
|
if (this.stopEvent.isSet() || signal?.aborted) {
|
|
9280
9280
|
return;
|
|
9281
9281
|
}
|
|
9282
|
-
logger$
|
|
9282
|
+
logger$19.debug('admission_expiry_triggered_refresh', {
|
|
9283
9283
|
expires_at: expiresAt.toISOString(),
|
|
9284
9284
|
current_time: new Date().toISOString(),
|
|
9285
9285
|
seconds_before_expiry: RootSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -9294,7 +9294,7 @@ class RootSessionManager extends TaskSpawner {
|
|
|
9294
9294
|
return;
|
|
9295
9295
|
}
|
|
9296
9296
|
const errorObject = error instanceof Error ? error : new Error(String(error));
|
|
9297
|
-
logger$
|
|
9297
|
+
logger$19.debug('background_task_error', {
|
|
9298
9298
|
task_name: task.name,
|
|
9299
9299
|
error: errorObject.message,
|
|
9300
9300
|
});
|
|
@@ -9335,7 +9335,7 @@ RootSessionManager.JWT_REFRESH_SAFETY = 60.0;
|
|
|
9335
9335
|
* Concrete implementations must define supported grant types and provide grant-to-connector
|
|
9336
9336
|
* conversion logic.
|
|
9337
9337
|
*/
|
|
9338
|
-
const logger$
|
|
9338
|
+
const logger$18 = getLogger('naylence.fame.connector.connector_factory');
|
|
9339
9339
|
const CONNECTOR_FACTORY_BASE_TYPE = 'ConnectorFactory';
|
|
9340
9340
|
/**
|
|
9341
9341
|
* Abstract base class for connector factories
|
|
@@ -9371,7 +9371,7 @@ class ConnectorFactory {
|
|
|
9371
9371
|
}
|
|
9372
9372
|
}
|
|
9373
9373
|
catch (error) {
|
|
9374
|
-
logger$
|
|
9374
|
+
logger$18.warning(`Failed to evaluate grant with factory ${factoryInfo.constructor.name}: ${error}`);
|
|
9375
9375
|
continue;
|
|
9376
9376
|
}
|
|
9377
9377
|
}
|
|
@@ -9414,7 +9414,7 @@ class ConnectorFactory {
|
|
|
9414
9414
|
}
|
|
9415
9415
|
}
|
|
9416
9416
|
catch (error) {
|
|
9417
|
-
logger$
|
|
9417
|
+
logger$18.warning(`Failed to create connector config from grant: ${error}`);
|
|
9418
9418
|
continue;
|
|
9419
9419
|
}
|
|
9420
9420
|
}
|
|
@@ -9481,20 +9481,20 @@ class ConnectorFactory {
|
|
|
9481
9481
|
return existing;
|
|
9482
9482
|
}
|
|
9483
9483
|
if (existing && !this.isGrantAware(existing)) {
|
|
9484
|
-
logger$
|
|
9484
|
+
logger$18.warning(`Factory ${factoryInfo.constructor.name} is registered under ${CONNECTOR_FACTORY_BASE_TYPE} but is missing grant conversion APIs; skipping.`);
|
|
9485
9485
|
return null;
|
|
9486
9486
|
}
|
|
9487
9487
|
try {
|
|
9488
9488
|
const instance = new factoryInfo.constructor();
|
|
9489
9489
|
if (!this.isGrantAware(instance)) {
|
|
9490
|
-
logger$
|
|
9490
|
+
logger$18.warning(`Factory ${factoryInfo.constructor.name} does not implement grant conversion APIs required by ${CONNECTOR_FACTORY_BASE_TYPE}; skipping.`);
|
|
9491
9491
|
return null;
|
|
9492
9492
|
}
|
|
9493
9493
|
factoryInfo.instance = instance;
|
|
9494
9494
|
return instance;
|
|
9495
9495
|
}
|
|
9496
9496
|
catch (error) {
|
|
9497
|
-
logger$
|
|
9497
|
+
logger$18.warning(`Failed to instantiate factory ${factoryInfo.constructor.name} while resolving grant conversion APIs: ${error}`);
|
|
9498
9498
|
return null;
|
|
9499
9499
|
}
|
|
9500
9500
|
}
|
|
@@ -9597,7 +9597,7 @@ class TaskCancellationError extends Error {
|
|
|
9597
9597
|
this.name = 'TaskCancellationError';
|
|
9598
9598
|
}
|
|
9599
9599
|
}
|
|
9600
|
-
const logger$
|
|
9600
|
+
const logger$17 = getLogger('naylence.fame.connector.base_async_connector');
|
|
9601
9601
|
// Environment variables
|
|
9602
9602
|
const ENV_VAR_FAME_FLOW_CONTROL = 'FAME_FLOW_CONTROL';
|
|
9603
9603
|
const FLOW_CONTROL_ENABLED = typeof process !== 'undefined' && process?.env
|
|
@@ -9680,7 +9680,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9680
9680
|
if (this._state !== newState) {
|
|
9681
9681
|
const oldState = this._state;
|
|
9682
9682
|
this._state = newState;
|
|
9683
|
-
logger$
|
|
9683
|
+
logger$17.debug('connector_state_transition', {
|
|
9684
9684
|
connector_id: this._connectorFlowId,
|
|
9685
9685
|
old_state: oldState,
|
|
9686
9686
|
new_state: newState,
|
|
@@ -9719,12 +9719,12 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9719
9719
|
* Stop the connector gracefully
|
|
9720
9720
|
*/
|
|
9721
9721
|
async stop() {
|
|
9722
|
-
logger$
|
|
9722
|
+
logger$17.debug('stopping_connector', {
|
|
9723
9723
|
current_state: this._state,
|
|
9724
9724
|
connector_id: this._connectorFlowId,
|
|
9725
9725
|
});
|
|
9726
9726
|
if (!ConnectorStateUtils.canStop(this._state)) {
|
|
9727
|
-
logger$
|
|
9727
|
+
logger$17.debug('connector_stop_already_stopped', {
|
|
9728
9728
|
current_state: this._state,
|
|
9729
9729
|
connector_id: this._connectorFlowId,
|
|
9730
9730
|
});
|
|
@@ -9735,7 +9735,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9735
9735
|
if (this._lastError) {
|
|
9736
9736
|
throw this._lastError;
|
|
9737
9737
|
}
|
|
9738
|
-
logger$
|
|
9738
|
+
logger$17.debug('connector_stopped', {
|
|
9739
9739
|
current_state: this._state,
|
|
9740
9740
|
connector_id: this._connectorFlowId,
|
|
9741
9741
|
});
|
|
@@ -9744,19 +9744,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9744
9744
|
* Pause the connector (suspends heartbeat and housekeeping, but keeps connection alive)
|
|
9745
9745
|
*/
|
|
9746
9746
|
async pause() {
|
|
9747
|
-
logger$
|
|
9747
|
+
logger$17.debug('pausing_connector', {
|
|
9748
9748
|
current_state: this._state,
|
|
9749
9749
|
connector_id: this._connectorFlowId,
|
|
9750
9750
|
});
|
|
9751
9751
|
if (this._state !== ConnectorState.STARTED) {
|
|
9752
|
-
logger$
|
|
9752
|
+
logger$17.debug('connector_pause_invalid_state', {
|
|
9753
9753
|
current_state: this._state,
|
|
9754
9754
|
connector_id: this._connectorFlowId,
|
|
9755
9755
|
});
|
|
9756
9756
|
return;
|
|
9757
9757
|
}
|
|
9758
9758
|
this._setState(ConnectorState.PAUSED);
|
|
9759
|
-
logger$
|
|
9759
|
+
logger$17.debug('connector_paused', {
|
|
9760
9760
|
current_state: this._state,
|
|
9761
9761
|
connector_id: this._connectorFlowId,
|
|
9762
9762
|
});
|
|
@@ -9765,19 +9765,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9765
9765
|
* Resume the connector from paused state
|
|
9766
9766
|
*/
|
|
9767
9767
|
async resume() {
|
|
9768
|
-
logger$
|
|
9768
|
+
logger$17.debug('resuming_connector', {
|
|
9769
9769
|
current_state: this._state,
|
|
9770
9770
|
connector_id: this._connectorFlowId,
|
|
9771
9771
|
});
|
|
9772
9772
|
if (this._state !== ConnectorState.PAUSED) {
|
|
9773
|
-
logger$
|
|
9773
|
+
logger$17.debug('connector_resume_invalid_state', {
|
|
9774
9774
|
current_state: this._state,
|
|
9775
9775
|
connector_id: this._connectorFlowId,
|
|
9776
9776
|
});
|
|
9777
9777
|
return;
|
|
9778
9778
|
}
|
|
9779
9779
|
this._setState(ConnectorState.STARTED);
|
|
9780
|
-
logger$
|
|
9780
|
+
logger$17.debug('connector_resumed', {
|
|
9781
9781
|
current_state: this._state,
|
|
9782
9782
|
connector_id: this._connectorFlowId,
|
|
9783
9783
|
});
|
|
@@ -9787,7 +9787,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9787
9787
|
*/
|
|
9788
9788
|
async close(code = 1000, reason = 'normal closure') {
|
|
9789
9789
|
if (!ConnectorStateUtils.canClose(this._state)) {
|
|
9790
|
-
logger$
|
|
9790
|
+
logger$17.warning('connector_close_invalid_state', {
|
|
9791
9791
|
current_state: this._state,
|
|
9792
9792
|
connector_id: this._connectorFlowId,
|
|
9793
9793
|
});
|
|
@@ -9868,7 +9868,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9868
9868
|
// Add to queue and notify send loop
|
|
9869
9869
|
this._sendQueue.push(raw);
|
|
9870
9870
|
// Log for debugging
|
|
9871
|
-
logger$
|
|
9871
|
+
logger$17.debug('send_envelope_queued', {
|
|
9872
9872
|
queue_length: this._sendQueue.length,
|
|
9873
9873
|
max_queue_size: this._maxQueueSize,
|
|
9874
9874
|
});
|
|
@@ -9917,14 +9917,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9917
9917
|
const item = this._sendQueue[0];
|
|
9918
9918
|
if (!item)
|
|
9919
9919
|
continue;
|
|
9920
|
-
logger$
|
|
9920
|
+
logger$17.debug('send_loop_processing_item', {
|
|
9921
9921
|
queue_length_before_send: this._sendQueue.length,
|
|
9922
9922
|
});
|
|
9923
9923
|
// Send through transport (this may block)
|
|
9924
9924
|
await this._transportSendBytes(item);
|
|
9925
9925
|
// Only remove from queue after successful send
|
|
9926
9926
|
this._sendQueue.shift();
|
|
9927
|
-
logger$
|
|
9927
|
+
logger$17.debug('send_loop_item_sent', {
|
|
9928
9928
|
queue_length_after_send: this._sendQueue.length,
|
|
9929
9929
|
});
|
|
9930
9930
|
}
|
|
@@ -9937,14 +9937,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9937
9937
|
}
|
|
9938
9938
|
else if (error instanceof TaskCancellationError) {
|
|
9939
9939
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
9940
|
-
logger$
|
|
9940
|
+
logger$17.debug('send loop cancelled', {
|
|
9941
9941
|
connector: this.constructor.name,
|
|
9942
9942
|
reason: error.message,
|
|
9943
9943
|
});
|
|
9944
9944
|
// Don't re-throw - this is normal during shutdown
|
|
9945
9945
|
}
|
|
9946
9946
|
else {
|
|
9947
|
-
logger$
|
|
9947
|
+
logger$17.critical('unexpected exception in send loop', {
|
|
9948
9948
|
connector: this.constructor.name,
|
|
9949
9949
|
error: error instanceof Error ? error.message : String(error),
|
|
9950
9950
|
});
|
|
@@ -9985,7 +9985,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
9985
9985
|
env = JSON.parse(jsonStr);
|
|
9986
9986
|
}
|
|
9987
9987
|
catch (error) {
|
|
9988
|
-
logger$
|
|
9988
|
+
logger$17.error('Invalid envelope', {
|
|
9989
9989
|
message: message.toString(),
|
|
9990
9990
|
error: error instanceof Error ? error.message : String(error),
|
|
9991
9991
|
});
|
|
@@ -10009,7 +10009,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10009
10009
|
};
|
|
10010
10010
|
await withEnvelopeContextAsync(envelopeContext, async () => {
|
|
10011
10011
|
const prettyEnvelope = prettyModel$1(env);
|
|
10012
|
-
logger$
|
|
10012
|
+
logger$17.trace('connector_received_envelope', {
|
|
10013
10013
|
envelope: env,
|
|
10014
10014
|
pretty: prettyEnvelope,
|
|
10015
10015
|
});
|
|
@@ -10038,7 +10038,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10038
10038
|
if (error instanceof TaskCancellationError) {
|
|
10039
10039
|
throw error;
|
|
10040
10040
|
}
|
|
10041
|
-
logger$
|
|
10041
|
+
logger$17.error('handler_failed', {
|
|
10042
10042
|
error: error instanceof Error ? error.message : String(error),
|
|
10043
10043
|
envelope_id: env.id ?? null,
|
|
10044
10044
|
trace_id: env.traceId ?? null,
|
|
@@ -10059,14 +10059,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10059
10059
|
}
|
|
10060
10060
|
else if (error instanceof TaskCancellationError) {
|
|
10061
10061
|
// Task cancellation is expected during shutdown - log as debug, not critical
|
|
10062
|
-
logger$
|
|
10062
|
+
logger$17.debug('receive loop cancelled', {
|
|
10063
10063
|
connector: this.constructor.name,
|
|
10064
10064
|
reason: error.message,
|
|
10065
10065
|
});
|
|
10066
10066
|
// Don't re-throw - this is normal during shutdown
|
|
10067
10067
|
}
|
|
10068
10068
|
else {
|
|
10069
|
-
logger$
|
|
10069
|
+
logger$17.critical('unexpected_error_in recv_loop', {
|
|
10070
10070
|
error: error instanceof Error ? error.message : String(error),
|
|
10071
10071
|
});
|
|
10072
10072
|
throw error;
|
|
@@ -10082,7 +10082,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10082
10082
|
async _maybeEmitCredit(flowId, traceId) {
|
|
10083
10083
|
const remainingCredits = this._flowCtrl.getCredits(flowId);
|
|
10084
10084
|
const needsRefill = this._flowCtrl.needsRefill(flowId);
|
|
10085
|
-
logger$
|
|
10085
|
+
logger$17.debug('maybe_emit_credit_check', {
|
|
10086
10086
|
connector_id: this._connectorFlowId,
|
|
10087
10087
|
flow_id: flowId,
|
|
10088
10088
|
trace_id: traceId ?? null,
|
|
@@ -10098,7 +10098,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10098
10098
|
}
|
|
10099
10099
|
const delta = this._initialWindow;
|
|
10100
10100
|
this._flowCtrl.addCredits(flowId, delta);
|
|
10101
|
-
logger$
|
|
10101
|
+
logger$17.debug('maybe_emit_credit_emit', {
|
|
10102
10102
|
connector_id: this._connectorFlowId,
|
|
10103
10103
|
flow_id: flowId,
|
|
10104
10104
|
trace_id: traceId ?? null,
|
|
@@ -10118,7 +10118,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10118
10118
|
});
|
|
10119
10119
|
try {
|
|
10120
10120
|
await this.send(ackEnv);
|
|
10121
|
-
logger$
|
|
10121
|
+
logger$17.debug('maybe_emit_credit_sent', {
|
|
10122
10122
|
connector_id: this._connectorFlowId,
|
|
10123
10123
|
flow_id: flowId,
|
|
10124
10124
|
trace_id: traceId ?? null,
|
|
@@ -10126,7 +10126,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10126
10126
|
});
|
|
10127
10127
|
}
|
|
10128
10128
|
catch (error) {
|
|
10129
|
-
logger$
|
|
10129
|
+
logger$17.error('maybe_emit_credit_send_failed', {
|
|
10130
10130
|
connector_id: this._connectorFlowId,
|
|
10131
10131
|
flow_id: flowId,
|
|
10132
10132
|
trace_id: traceId ?? null,
|
|
@@ -10151,13 +10151,13 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10151
10151
|
*/
|
|
10152
10152
|
async _shutdown(code, reason, gracePeriod, exc) {
|
|
10153
10153
|
if (this._closed) {
|
|
10154
|
-
logger$
|
|
10154
|
+
logger$17.debug('shutdown_already_closed', {
|
|
10155
10155
|
connector_id: this._connectorFlowId,
|
|
10156
10156
|
current_state: this._state,
|
|
10157
10157
|
});
|
|
10158
10158
|
return;
|
|
10159
10159
|
}
|
|
10160
|
-
logger$
|
|
10160
|
+
logger$17.debug('connector_shutdown_starting', {
|
|
10161
10161
|
connector_id: this._connectorFlowId,
|
|
10162
10162
|
connector_type: this.constructor.name,
|
|
10163
10163
|
code,
|
|
@@ -10187,19 +10187,19 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10187
10187
|
this._sendPromiseResolve = undefined;
|
|
10188
10188
|
}
|
|
10189
10189
|
// Close transport
|
|
10190
|
-
logger$
|
|
10190
|
+
logger$17.debug('connector_closing_transport', {
|
|
10191
10191
|
connector_id: this._connectorFlowId,
|
|
10192
10192
|
connector_type: this.constructor.name,
|
|
10193
10193
|
timestamp: new Date().toISOString(),
|
|
10194
10194
|
});
|
|
10195
10195
|
await this._transportClose(code, reason);
|
|
10196
|
-
logger$
|
|
10196
|
+
logger$17.debug('connector_transport_closed', {
|
|
10197
10197
|
connector_id: this._connectorFlowId,
|
|
10198
10198
|
connector_type: this.constructor.name,
|
|
10199
10199
|
timestamp: new Date().toISOString(),
|
|
10200
10200
|
});
|
|
10201
10201
|
// Shutdown spawned tasks
|
|
10202
|
-
logger$
|
|
10202
|
+
logger$17.debug('connector_shutting_down_tasks', {
|
|
10203
10203
|
connector_id: this._connectorFlowId,
|
|
10204
10204
|
connector_type: this.constructor.name,
|
|
10205
10205
|
grace_period_ms: effectiveGracePeriod * 1000,
|
|
@@ -10211,14 +10211,14 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10211
10211
|
gracePeriod: effectiveGracePeriod * 1000, // Convert to milliseconds
|
|
10212
10212
|
joinTimeout: this._shutdownJoinTimeout,
|
|
10213
10213
|
});
|
|
10214
|
-
logger$
|
|
10214
|
+
logger$17.debug('connector_tasks_shutdown_complete', {
|
|
10215
10215
|
connector_id: this._connectorFlowId,
|
|
10216
10216
|
connector_type: this.constructor.name,
|
|
10217
10217
|
timestamp: new Date().toISOString(),
|
|
10218
10218
|
});
|
|
10219
10219
|
}
|
|
10220
10220
|
catch (error) {
|
|
10221
|
-
logger$
|
|
10221
|
+
logger$17.warning('task_shutdown_error', {
|
|
10222
10222
|
connector_id: this._connectorFlowId,
|
|
10223
10223
|
error: error instanceof Error ? error.message : String(error),
|
|
10224
10224
|
});
|
|
@@ -10231,7 +10231,7 @@ class BaseAsyncConnector extends TaskSpawner {
|
|
|
10231
10231
|
if (this._closeResolver) {
|
|
10232
10232
|
this._closeResolver();
|
|
10233
10233
|
}
|
|
10234
|
-
logger$
|
|
10234
|
+
logger$17.debug('connector_shutdown_complete', {
|
|
10235
10235
|
connector_id: this._connectorFlowId,
|
|
10236
10236
|
connector_type: this.constructor.name,
|
|
10237
10237
|
final_state: this._state,
|
|
@@ -10307,7 +10307,7 @@ class BoundedAsyncQueue {
|
|
|
10307
10307
|
}
|
|
10308
10308
|
}
|
|
10309
10309
|
|
|
10310
|
-
const logger$
|
|
10310
|
+
const logger$16 = getLogger('naylence.fame.connector.broadcast_channel_connector');
|
|
10311
10311
|
const BROADCAST_CHANNEL_CONNECTOR_TYPE = 'broadcast-channel-connector';
|
|
10312
10312
|
const DEFAULT_CHANNEL$7 = 'naylence-fabric';
|
|
10313
10313
|
const DEFAULT_INBOX_CAPACITY$7 = 2048;
|
|
@@ -10396,7 +10396,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10396
10396
|
this.localNodeId = normalizedLocalNodeId;
|
|
10397
10397
|
this.targetNodeId = BroadcastChannelConnector.normalizeTargetNodeId(config.initialTargetNodeId);
|
|
10398
10398
|
this.channel = new BroadcastChannel(this.channelName);
|
|
10399
|
-
logger$
|
|
10399
|
+
logger$16.debug('broadcast_channel_connector_created', {
|
|
10400
10400
|
channel: this.channelName,
|
|
10401
10401
|
connector_id: this.connectorId,
|
|
10402
10402
|
local_node_id: this.localNodeId,
|
|
@@ -10408,7 +10408,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10408
10408
|
this.onMsg = (event) => {
|
|
10409
10409
|
// Guard: Don't process if listener was unregistered
|
|
10410
10410
|
if (!this.listenerRegistered) {
|
|
10411
|
-
logger$
|
|
10411
|
+
logger$16.warning('broadcast_channel_message_after_unregister', {
|
|
10412
10412
|
channel: this.channelName,
|
|
10413
10413
|
connector_id: this.connectorId,
|
|
10414
10414
|
timestamp: new Date().toISOString(),
|
|
@@ -10416,7 +10416,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10416
10416
|
return;
|
|
10417
10417
|
}
|
|
10418
10418
|
const message = event.data;
|
|
10419
|
-
logger$
|
|
10419
|
+
logger$16.debug('broadcast_channel_raw_event', {
|
|
10420
10420
|
channel: this.channelName,
|
|
10421
10421
|
connector_id: this.connectorId,
|
|
10422
10422
|
message_type: message && typeof message === 'object'
|
|
@@ -10432,7 +10432,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10432
10432
|
const busMessage = message;
|
|
10433
10433
|
const senderNodeId = BroadcastChannelConnector.normalizeNodeId(busMessage.senderNodeId);
|
|
10434
10434
|
if (!senderNodeId) {
|
|
10435
|
-
logger$
|
|
10435
|
+
logger$16.debug('broadcast_channel_message_rejected', {
|
|
10436
10436
|
channel: this.channelName,
|
|
10437
10437
|
connector_id: this.connectorId,
|
|
10438
10438
|
reason: 'missing_sender_node_id',
|
|
@@ -10440,7 +10440,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10440
10440
|
return;
|
|
10441
10441
|
}
|
|
10442
10442
|
if (senderNodeId === this.localNodeId) {
|
|
10443
|
-
logger$
|
|
10443
|
+
logger$16.debug('broadcast_channel_message_rejected', {
|
|
10444
10444
|
channel: this.channelName,
|
|
10445
10445
|
connector_id: this.connectorId,
|
|
10446
10446
|
reason: 'self_echo',
|
|
@@ -10454,14 +10454,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10454
10454
|
}
|
|
10455
10455
|
const payload = BroadcastChannelConnector.coercePayload(busMessage.payload);
|
|
10456
10456
|
if (!payload) {
|
|
10457
|
-
logger$
|
|
10457
|
+
logger$16.debug('broadcast_channel_payload_rejected', {
|
|
10458
10458
|
channel: this.channelName,
|
|
10459
10459
|
connector_id: this.connectorId,
|
|
10460
10460
|
reason: 'unrecognized_payload_type',
|
|
10461
10461
|
});
|
|
10462
10462
|
return;
|
|
10463
10463
|
}
|
|
10464
|
-
logger$
|
|
10464
|
+
logger$16.debug('broadcast_channel_message_received', {
|
|
10465
10465
|
channel: this.channelName,
|
|
10466
10466
|
sender_id: message?.senderId,
|
|
10467
10467
|
sender_node_id: senderNodeId,
|
|
@@ -10490,14 +10490,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10490
10490
|
}
|
|
10491
10491
|
catch (error) {
|
|
10492
10492
|
if (error instanceof QueueFullError) {
|
|
10493
|
-
logger$
|
|
10493
|
+
logger$16.warning('broadcast_channel_receive_queue_full', {
|
|
10494
10494
|
channel: this.channelName,
|
|
10495
10495
|
inbox_capacity: this.inboxCapacity,
|
|
10496
10496
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
10497
10497
|
});
|
|
10498
10498
|
}
|
|
10499
10499
|
else {
|
|
10500
|
-
logger$
|
|
10500
|
+
logger$16.error('broadcast_channel_receive_error', {
|
|
10501
10501
|
channel: this.channelName,
|
|
10502
10502
|
error: error instanceof Error ? error.message : String(error),
|
|
10503
10503
|
});
|
|
@@ -10511,7 +10511,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10511
10511
|
// Setup visibility change monitoring
|
|
10512
10512
|
this.visibilityChangeHandler = () => {
|
|
10513
10513
|
const isHidden = document.hidden;
|
|
10514
|
-
logger$
|
|
10514
|
+
logger$16.debug('broadcast_channel_visibility_changed', {
|
|
10515
10515
|
channel: this.channelName,
|
|
10516
10516
|
connector_id: this.connectorId,
|
|
10517
10517
|
visibility: isHidden ? 'hidden' : 'visible',
|
|
@@ -10520,7 +10520,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10520
10520
|
// Pause/resume connector based on visibility
|
|
10521
10521
|
if (isHidden && this.state === ConnectorState.STARTED) {
|
|
10522
10522
|
this.pause().catch((err) => {
|
|
10523
|
-
logger$
|
|
10523
|
+
logger$16.warning('broadcast_channel_pause_failed', {
|
|
10524
10524
|
channel: this.channelName,
|
|
10525
10525
|
connector_id: this.connectorId,
|
|
10526
10526
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -10529,7 +10529,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10529
10529
|
}
|
|
10530
10530
|
else if (!isHidden && this.state === ConnectorState.PAUSED) {
|
|
10531
10531
|
this.resume().catch((err) => {
|
|
10532
|
-
logger$
|
|
10532
|
+
logger$16.warning('broadcast_channel_resume_failed', {
|
|
10533
10533
|
channel: this.channelName,
|
|
10534
10534
|
connector_id: this.connectorId,
|
|
10535
10535
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -10543,7 +10543,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10543
10543
|
// Track page lifecycle events to detect browser unload/discard
|
|
10544
10544
|
if (typeof window !== 'undefined') {
|
|
10545
10545
|
const lifecycleLogger = (event) => {
|
|
10546
|
-
logger$
|
|
10546
|
+
logger$16.debug('broadcast_channel_page_lifecycle', {
|
|
10547
10547
|
channel: this.channelName,
|
|
10548
10548
|
connector_id: this.connectorId,
|
|
10549
10549
|
event_type: event.type,
|
|
@@ -10559,7 +10559,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10559
10559
|
document.addEventListener('resume', lifecycleLogger);
|
|
10560
10560
|
}
|
|
10561
10561
|
// Log initial state with detailed visibility info
|
|
10562
|
-
logger$
|
|
10562
|
+
logger$16.debug('broadcast_channel_initial_visibility', {
|
|
10563
10563
|
channel: this.channelName,
|
|
10564
10564
|
connector_id: this.connectorId,
|
|
10565
10565
|
visibility: document.hidden ? 'hidden' : 'visible',
|
|
@@ -10591,14 +10591,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10591
10591
|
}
|
|
10592
10592
|
catch (error) {
|
|
10593
10593
|
if (error instanceof QueueFullError) {
|
|
10594
|
-
logger$
|
|
10594
|
+
logger$16.warning('broadcast_channel_push_queue_full', {
|
|
10595
10595
|
channel: this.channelName,
|
|
10596
10596
|
inbox_capacity: this.inboxCapacity,
|
|
10597
10597
|
inbox_remaining_capacity: this.inbox.remainingCapacity,
|
|
10598
10598
|
});
|
|
10599
10599
|
throw error;
|
|
10600
10600
|
}
|
|
10601
|
-
logger$
|
|
10601
|
+
logger$16.error('broadcast_channel_push_failed', {
|
|
10602
10602
|
channel: this.channelName,
|
|
10603
10603
|
error: error instanceof Error ? error.message : String(error),
|
|
10604
10604
|
});
|
|
@@ -10608,7 +10608,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10608
10608
|
async _transportSendBytes(data) {
|
|
10609
10609
|
ensureBroadcastEnvironment();
|
|
10610
10610
|
const targetNodeId = this.targetNodeId ?? '*';
|
|
10611
|
-
logger$
|
|
10611
|
+
logger$16.debug('broadcast_channel_message_sending', {
|
|
10612
10612
|
channel: this.channelName,
|
|
10613
10613
|
sender_id: this.connectorId,
|
|
10614
10614
|
sender_node_id: this.localNodeId,
|
|
@@ -10629,7 +10629,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10629
10629
|
return item;
|
|
10630
10630
|
}
|
|
10631
10631
|
async _transportClose(code, reason) {
|
|
10632
|
-
logger$
|
|
10632
|
+
logger$16.debug('broadcast_channel_transport_closing', {
|
|
10633
10633
|
channel: this.channelName,
|
|
10634
10634
|
connector_id: this.connectorId,
|
|
10635
10635
|
code,
|
|
@@ -10638,14 +10638,14 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10638
10638
|
timestamp: new Date().toISOString(),
|
|
10639
10639
|
});
|
|
10640
10640
|
if (this.listenerRegistered) {
|
|
10641
|
-
logger$
|
|
10641
|
+
logger$16.debug('broadcast_channel_removing_listener', {
|
|
10642
10642
|
channel: this.channelName,
|
|
10643
10643
|
connector_id: this.connectorId,
|
|
10644
10644
|
timestamp: new Date().toISOString(),
|
|
10645
10645
|
});
|
|
10646
10646
|
this.channel.removeEventListener('message', this.onMsg);
|
|
10647
10647
|
this.listenerRegistered = false;
|
|
10648
|
-
logger$
|
|
10648
|
+
logger$16.debug('broadcast_channel_listener_removed', {
|
|
10649
10649
|
channel: this.channelName,
|
|
10650
10650
|
connector_id: this.connectorId,
|
|
10651
10651
|
timestamp: new Date().toISOString(),
|
|
@@ -10658,13 +10658,13 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10658
10658
|
this.visibilityChangeListenerRegistered = false;
|
|
10659
10659
|
this.visibilityChangeHandler = undefined;
|
|
10660
10660
|
}
|
|
10661
|
-
logger$
|
|
10661
|
+
logger$16.debug('broadcast_channel_closing', {
|
|
10662
10662
|
channel: this.channelName,
|
|
10663
10663
|
connector_id: this.connectorId,
|
|
10664
10664
|
timestamp: new Date().toISOString(),
|
|
10665
10665
|
});
|
|
10666
10666
|
this.channel.close();
|
|
10667
|
-
logger$
|
|
10667
|
+
logger$16.debug('broadcast_channel_closed', {
|
|
10668
10668
|
channel: this.channelName,
|
|
10669
10669
|
connector_id: this.connectorId,
|
|
10670
10670
|
timestamp: new Date().toISOString(),
|
|
@@ -10688,7 +10688,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10688
10688
|
if (targetNodeId &&
|
|
10689
10689
|
targetNodeId !== '*' &&
|
|
10690
10690
|
targetNodeId !== this.localNodeId) {
|
|
10691
|
-
logger$
|
|
10691
|
+
logger$16.debug('broadcast_channel_message_rejected', {
|
|
10692
10692
|
channel: this.channelName,
|
|
10693
10693
|
connector_id: this.connectorId,
|
|
10694
10694
|
reason: 'wildcard_target_mismatch',
|
|
@@ -10704,7 +10704,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10704
10704
|
if (expectedSender &&
|
|
10705
10705
|
expectedSender !== '*' &&
|
|
10706
10706
|
senderNodeId !== expectedSender) {
|
|
10707
|
-
logger$
|
|
10707
|
+
logger$16.debug('broadcast_channel_message_rejected', {
|
|
10708
10708
|
channel: this.channelName,
|
|
10709
10709
|
connector_id: this.connectorId,
|
|
10710
10710
|
reason: 'unexpected_sender',
|
|
@@ -10717,7 +10717,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10717
10717
|
if (targetNodeId &&
|
|
10718
10718
|
targetNodeId !== '*' &&
|
|
10719
10719
|
targetNodeId !== this.localNodeId) {
|
|
10720
|
-
logger$
|
|
10720
|
+
logger$16.debug('broadcast_channel_message_rejected', {
|
|
10721
10721
|
channel: this.channelName,
|
|
10722
10722
|
connector_id: this.connectorId,
|
|
10723
10723
|
reason: 'unexpected_target',
|
|
@@ -10742,7 +10742,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10742
10742
|
return 'unknown';
|
|
10743
10743
|
}
|
|
10744
10744
|
logInboxSnapshot(event, extra = {}) {
|
|
10745
|
-
logger$
|
|
10745
|
+
logger$16.debug(event, {
|
|
10746
10746
|
channel: this.channelName,
|
|
10747
10747
|
connector_id: this.connectorId,
|
|
10748
10748
|
connector_state: this.state,
|
|
@@ -10758,7 +10758,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10758
10758
|
await super.start(inboundHandler);
|
|
10759
10759
|
// After transitioning to STARTED, check if tab is already hidden
|
|
10760
10760
|
if (typeof document !== 'undefined' && document.hidden) {
|
|
10761
|
-
logger$
|
|
10761
|
+
logger$16.debug('broadcast_channel_start_in_hidden_tab', {
|
|
10762
10762
|
channel: this.channelName,
|
|
10763
10763
|
connector_id: this.connectorId,
|
|
10764
10764
|
document_hidden: document.hidden,
|
|
@@ -10768,7 +10768,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10768
10768
|
});
|
|
10769
10769
|
// Immediately pause if tab is hidden at start time
|
|
10770
10770
|
await this.pause().catch((err) => {
|
|
10771
|
-
logger$
|
|
10771
|
+
logger$16.warning('broadcast_channel_initial_pause_failed', {
|
|
10772
10772
|
channel: this.channelName,
|
|
10773
10773
|
connector_id: this.connectorId,
|
|
10774
10774
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -10786,7 +10786,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10786
10786
|
return;
|
|
10787
10787
|
}
|
|
10788
10788
|
this.targetNodeId = normalized;
|
|
10789
|
-
logger$
|
|
10789
|
+
logger$16.debug('broadcast_channel_target_updated', {
|
|
10790
10790
|
channel: this.channelName,
|
|
10791
10791
|
connector_id: this.connectorId,
|
|
10792
10792
|
local_node_id: this.localNodeId,
|
|
@@ -10796,7 +10796,7 @@ let BroadcastChannelConnector$2 = class BroadcastChannelConnector extends BaseAs
|
|
|
10796
10796
|
}
|
|
10797
10797
|
setWildcardTarget() {
|
|
10798
10798
|
this.targetNodeId = '*';
|
|
10799
|
-
logger$
|
|
10799
|
+
logger$16.debug('broadcast_channel_target_updated', {
|
|
10800
10800
|
channel: this.channelName,
|
|
10801
10801
|
connector_id: this.connectorId,
|
|
10802
10802
|
local_node_id: this.localNodeId,
|
|
@@ -10969,7 +10969,7 @@ function broadcastChannelGrantToConnectorConfig(grant) {
|
|
|
10969
10969
|
return config;
|
|
10970
10970
|
}
|
|
10971
10971
|
|
|
10972
|
-
const logger$
|
|
10972
|
+
const logger$15 = getLogger('naylence.fame.node.upstream_session_manager');
|
|
10973
10973
|
function isPlainRecord$4(value) {
|
|
10974
10974
|
if (typeof value !== 'object' || value === null) {
|
|
10975
10975
|
return false;
|
|
@@ -11090,7 +11090,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11090
11090
|
this.wrappedHandler = this.makeHeartbeatEnabledHandler(options.inboundHandler);
|
|
11091
11091
|
// Store the connection retry policy (can be null, in which case default behavior applies)
|
|
11092
11092
|
this.connectionRetryPolicy = options.retryPolicy ?? null;
|
|
11093
|
-
logger$
|
|
11093
|
+
logger$15.debug('created_upstream_session_manager', {
|
|
11094
11094
|
target_system_id: this.targetSystemId,
|
|
11095
11095
|
has_retry_policy: this.connectionRetryPolicy !== null,
|
|
11096
11096
|
});
|
|
@@ -11099,23 +11099,23 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11099
11099
|
return this.targetSystemId;
|
|
11100
11100
|
}
|
|
11101
11101
|
setupVisibilityListener() {
|
|
11102
|
-
logger$
|
|
11102
|
+
logger$15.debug('setup_visibility_listener_called', {
|
|
11103
11103
|
has_document: typeof document !== 'undefined',
|
|
11104
11104
|
});
|
|
11105
11105
|
if (typeof document !== 'undefined' && document.addEventListener) {
|
|
11106
11106
|
this._visibilityHandler = () => {
|
|
11107
|
-
logger$
|
|
11107
|
+
logger$15.debug('visibility_change_event_fired', {
|
|
11108
11108
|
state: document.visibilityState,
|
|
11109
11109
|
});
|
|
11110
11110
|
if (document.visibilityState === 'visible') {
|
|
11111
|
-
logger$
|
|
11111
|
+
logger$15.debug('visibility_change_detected_waking_up');
|
|
11112
11112
|
this.wakeEvent.set();
|
|
11113
11113
|
}
|
|
11114
11114
|
};
|
|
11115
11115
|
document.addEventListener('visibilitychange', this._visibilityHandler);
|
|
11116
11116
|
}
|
|
11117
11117
|
else {
|
|
11118
|
-
logger$
|
|
11118
|
+
logger$15.debug('setup_visibility_listener_skipped_no_document');
|
|
11119
11119
|
}
|
|
11120
11120
|
}
|
|
11121
11121
|
teardownVisibilityListener() {
|
|
@@ -11148,13 +11148,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11148
11148
|
}
|
|
11149
11149
|
throw new FameConnectError('Upstream session manager failed to attach');
|
|
11150
11150
|
}
|
|
11151
|
-
logger$
|
|
11151
|
+
logger$15.debug('upstream_session_manager_started');
|
|
11152
11152
|
}
|
|
11153
11153
|
getActiveConnector() {
|
|
11154
11154
|
return this.connector;
|
|
11155
11155
|
}
|
|
11156
11156
|
async stop() {
|
|
11157
|
-
logger$
|
|
11157
|
+
logger$15.debug('upstream_session_manager_stopping');
|
|
11158
11158
|
this.teardownVisibilityListener();
|
|
11159
11159
|
this.stopEvent.set();
|
|
11160
11160
|
this.currentStopSubtasks?.set();
|
|
@@ -11165,7 +11165,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11165
11165
|
}
|
|
11166
11166
|
catch (error) {
|
|
11167
11167
|
if (!(error instanceof TaskCancelledError)) {
|
|
11168
|
-
logger$
|
|
11168
|
+
logger$15.debug('fsm_task_stopped_with_error', {
|
|
11169
11169
|
error: error.message,
|
|
11170
11170
|
});
|
|
11171
11171
|
}
|
|
@@ -11174,13 +11174,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11174
11174
|
}
|
|
11175
11175
|
if (this.connector) {
|
|
11176
11176
|
await this.connector.stop().catch((error) => {
|
|
11177
|
-
logger$
|
|
11177
|
+
logger$15.debug('connector_stop_error', {
|
|
11178
11178
|
error: error.message,
|
|
11179
11179
|
});
|
|
11180
11180
|
});
|
|
11181
11181
|
this.connector = null;
|
|
11182
11182
|
}
|
|
11183
|
-
logger$
|
|
11183
|
+
logger$15.debug('upstream_session_manager_stopped');
|
|
11184
11184
|
}
|
|
11185
11185
|
async send(envelope) {
|
|
11186
11186
|
if (this.messageQueue.length >= UpstreamSessionManager.TX_QUEUE_MAX) {
|
|
@@ -11229,7 +11229,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11229
11229
|
const shouldFailFast = this.shouldFailFastOnError(error);
|
|
11230
11230
|
if (error instanceof FameTransportClose ||
|
|
11231
11231
|
error instanceof FameConnectError) {
|
|
11232
|
-
logger$
|
|
11232
|
+
logger$15.warning('upstream_link_closed', {
|
|
11233
11233
|
error: error.message,
|
|
11234
11234
|
will_retry: !shouldFailFast,
|
|
11235
11235
|
attempt: this.initialAttempts,
|
|
@@ -11242,13 +11242,13 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11242
11242
|
else {
|
|
11243
11243
|
const err = error;
|
|
11244
11244
|
if (err.name === 'OAuth2PkceRedirectInitiatedError') {
|
|
11245
|
-
logger$
|
|
11245
|
+
logger$15.info('upstream_link_redirecting', {
|
|
11246
11246
|
error: err.message,
|
|
11247
11247
|
will_retry: true,
|
|
11248
11248
|
});
|
|
11249
11249
|
}
|
|
11250
11250
|
else {
|
|
11251
|
-
logger$
|
|
11251
|
+
logger$15.warning('upstream_link_closed', {
|
|
11252
11252
|
error: err.message,
|
|
11253
11253
|
will_retry: !shouldFailFast,
|
|
11254
11254
|
attempt: this.initialAttempts,
|
|
@@ -11292,7 +11292,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11292
11292
|
// If sleep was interrupted by visibility change (user returned to tab),
|
|
11293
11293
|
// reset backoff to initial delay for immediate retry with fresh backoff
|
|
11294
11294
|
if (wasWoken) {
|
|
11295
|
-
logger$
|
|
11295
|
+
logger$15.debug('backoff_reset_on_visibility_change', {
|
|
11296
11296
|
previous_delay: delay,
|
|
11297
11297
|
new_delay: UpstreamSessionManager.BACKOFF_INITIAL,
|
|
11298
11298
|
});
|
|
@@ -11311,7 +11311,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11311
11311
|
// Check if wake event is already set (e.g., visibility just changed)
|
|
11312
11312
|
if (this.wakeEvent.isSet()) {
|
|
11313
11313
|
this.wakeEvent.clear();
|
|
11314
|
-
logger$
|
|
11314
|
+
logger$15.debug('sleep_skipped_wake_event_pending');
|
|
11315
11315
|
return true;
|
|
11316
11316
|
}
|
|
11317
11317
|
let timeout;
|
|
@@ -11328,7 +11328,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11328
11328
|
]);
|
|
11329
11329
|
const wasWoken = this.wakeEvent.isSet();
|
|
11330
11330
|
if (wasWoken) {
|
|
11331
|
-
logger$
|
|
11331
|
+
logger$15.debug('sleep_interrupted_by_wake_event');
|
|
11332
11332
|
this.wakeEvent.clear();
|
|
11333
11333
|
}
|
|
11334
11334
|
if (timeout !== undefined) {
|
|
@@ -11391,7 +11391,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11391
11391
|
await connector.start(this.wrappedHandler);
|
|
11392
11392
|
this.connector = connector;
|
|
11393
11393
|
const callbackGrants = this.node.gatherSupportedCallbackGrants();
|
|
11394
|
-
logger$
|
|
11394
|
+
logger$15.debug('callback_grants_before_augmentation', {
|
|
11395
11395
|
count: callbackGrants.length,
|
|
11396
11396
|
types: callbackGrants.map((g) => g.type),
|
|
11397
11397
|
});
|
|
@@ -11401,7 +11401,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11401
11401
|
const broadcastCallbackGrant = shouldAddBroadcastGrant
|
|
11402
11402
|
? this.createBroadcastCallbackGrant(grant)
|
|
11403
11403
|
: null;
|
|
11404
|
-
logger$
|
|
11404
|
+
logger$15.debug('broadcast_callback_grant_check', {
|
|
11405
11405
|
should_add: shouldAddBroadcastGrant,
|
|
11406
11406
|
grant_created: !!broadcastCallbackGrant,
|
|
11407
11407
|
});
|
|
@@ -11420,12 +11420,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11420
11420
|
const isDuplicate = callbackGrants.some((existing) => JSON.stringify(existing) === JSON.stringify(grant));
|
|
11421
11421
|
if (!isDuplicate) {
|
|
11422
11422
|
callbackGrants.push(grant);
|
|
11423
|
-
logger$
|
|
11423
|
+
logger$15.debug('added_connection_grant_as_callback', {
|
|
11424
11424
|
type: grant.type,
|
|
11425
11425
|
});
|
|
11426
11426
|
}
|
|
11427
11427
|
else {
|
|
11428
|
-
logger$
|
|
11428
|
+
logger$15.debug('skipped_duplicate_connection_grant', {
|
|
11429
11429
|
type: grant.type,
|
|
11430
11430
|
});
|
|
11431
11431
|
}
|
|
@@ -11437,12 +11437,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11437
11437
|
if (broadcastCallbackGrant &&
|
|
11438
11438
|
this.shouldAdvertiseBroadcastGrant(grant, callbackGrants)) {
|
|
11439
11439
|
callbackGrants.push(broadcastCallbackGrant);
|
|
11440
|
-
logger$
|
|
11440
|
+
logger$15.debug('added_broadcast_callback_grant');
|
|
11441
11441
|
}
|
|
11442
11442
|
else if (broadcastCallbackGrant) {
|
|
11443
|
-
logger$
|
|
11443
|
+
logger$15.debug('skipped_duplicate_broadcast_callback_grant');
|
|
11444
11444
|
}
|
|
11445
|
-
logger$
|
|
11445
|
+
logger$15.debug('callback_grants_after_augmentation', {
|
|
11446
11446
|
count: callbackGrants.length,
|
|
11447
11447
|
types: callbackGrants.map((g) => g.type),
|
|
11448
11448
|
});
|
|
@@ -11455,7 +11455,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11455
11455
|
targetAware.setTargetNodeId(this.targetSystemId);
|
|
11456
11456
|
}
|
|
11457
11457
|
catch (error) {
|
|
11458
|
-
logger$
|
|
11458
|
+
logger$15.warning('broadcast_channel_target_apply_failed', {
|
|
11459
11459
|
error: error instanceof Error ? error.message : String(error),
|
|
11460
11460
|
target_node_id: this.targetSystemId,
|
|
11461
11461
|
});
|
|
@@ -11477,14 +11477,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11477
11477
|
});
|
|
11478
11478
|
}
|
|
11479
11479
|
else {
|
|
11480
|
-
logger$
|
|
11480
|
+
logger$15.warning('parent_epoch_changed', { epoch });
|
|
11481
11481
|
}
|
|
11482
11482
|
}
|
|
11483
11483
|
if (!this.readyEvent.isSet()) {
|
|
11484
11484
|
this.readyEvent.set();
|
|
11485
11485
|
}
|
|
11486
11486
|
if (this.messageQueue.length > 0) {
|
|
11487
|
-
logger$
|
|
11487
|
+
logger$15.debug('flushing_buffered_frames', {
|
|
11488
11488
|
queue_size: this.messageQueue.length,
|
|
11489
11489
|
});
|
|
11490
11490
|
this.queueEvent.set();
|
|
@@ -11501,12 +11501,12 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11501
11501
|
name: `expiry-guard-${this.connectEpoch}`,
|
|
11502
11502
|
});
|
|
11503
11503
|
if (this.hadSuccessfulAttach) {
|
|
11504
|
-
logger$
|
|
11504
|
+
logger$15.debug('reconnected_to_upstream', {
|
|
11505
11505
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
11506
11506
|
});
|
|
11507
11507
|
}
|
|
11508
11508
|
else {
|
|
11509
|
-
logger$
|
|
11509
|
+
logger$15.debug('connected_to_upstream', {
|
|
11510
11510
|
attach_expires_at: attachInfo.attachExpiresAt?.toISOString?.() ?? null,
|
|
11511
11511
|
});
|
|
11512
11512
|
}
|
|
@@ -11524,18 +11524,18 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11524
11524
|
this.currentStopSubtasks = null;
|
|
11525
11525
|
await Promise.allSettled(tasks.map((task) => task.promise));
|
|
11526
11526
|
if (this.connector) {
|
|
11527
|
-
logger$
|
|
11527
|
+
logger$15.debug('upstream_stopping_old_connector', {
|
|
11528
11528
|
connect_epoch: this.connectEpoch,
|
|
11529
11529
|
target_system_id: this.targetSystemId,
|
|
11530
11530
|
timestamp: new Date().toISOString(),
|
|
11531
11531
|
});
|
|
11532
11532
|
await this.connector.stop().catch((err) => {
|
|
11533
|
-
logger$
|
|
11533
|
+
logger$15.warning('upstream_connector_stop_error', {
|
|
11534
11534
|
connect_epoch: this.connectEpoch,
|
|
11535
11535
|
error: err instanceof Error ? err.message : String(err),
|
|
11536
11536
|
});
|
|
11537
11537
|
});
|
|
11538
|
-
logger$
|
|
11538
|
+
logger$15.debug('upstream_old_connector_stopped', {
|
|
11539
11539
|
connect_epoch: this.connectEpoch,
|
|
11540
11540
|
target_system_id: this.targetSystemId,
|
|
11541
11541
|
timestamp: new Date().toISOString(),
|
|
@@ -11588,7 +11588,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11588
11588
|
});
|
|
11589
11589
|
}
|
|
11590
11590
|
catch (error) {
|
|
11591
|
-
logger$
|
|
11591
|
+
logger$15.debug('broadcast_callback_grant_generation_failed', {
|
|
11592
11592
|
error: error instanceof Error ? error.message : String(error),
|
|
11593
11593
|
});
|
|
11594
11594
|
return null;
|
|
@@ -11643,7 +11643,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11643
11643
|
}
|
|
11644
11644
|
}
|
|
11645
11645
|
async heartbeatLoop(connector, stopEvt, signal) {
|
|
11646
|
-
logger$
|
|
11646
|
+
logger$15.debug('starting_heartbeat_loop');
|
|
11647
11647
|
const intervalMs = UpstreamSessionManager.HEARTBEAT_INTERVAL * 1000;
|
|
11648
11648
|
const graceMs = intervalMs * UpstreamSessionManager.HEARTBEAT_GRACE;
|
|
11649
11649
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -11679,7 +11679,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11679
11679
|
// Skip heartbeat if connector is paused (e.g., tab is hidden)
|
|
11680
11680
|
// Keep ack time current so we don't timeout immediately after resuming
|
|
11681
11681
|
if (currentState === ConnectorState.PAUSED) {
|
|
11682
|
-
logger$
|
|
11682
|
+
logger$15.debug('skipping_heartbeat_connector_paused', {
|
|
11683
11683
|
connector_state: currentState,
|
|
11684
11684
|
});
|
|
11685
11685
|
this.lastHeartbeatAckTime = Date.now();
|
|
@@ -11688,14 +11688,14 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11688
11688
|
// Reset ack time if just resumed from pause (prevents immediate timeout)
|
|
11689
11689
|
if (previousState === ConnectorState.PAUSED &&
|
|
11690
11690
|
currentState === ConnectorState.STARTED) {
|
|
11691
|
-
logger$
|
|
11691
|
+
logger$15.debug('connector_just_resumed_resetting_ack_time', {
|
|
11692
11692
|
previous_state: previousState,
|
|
11693
11693
|
current_state: currentState,
|
|
11694
11694
|
});
|
|
11695
11695
|
this.lastHeartbeatAckTime = Date.now();
|
|
11696
11696
|
}
|
|
11697
11697
|
const envelope = await this.makeHeartbeatEnvelope();
|
|
11698
|
-
logger$
|
|
11698
|
+
logger$15.debug('sending_heartbeat', {
|
|
11699
11699
|
hb_corr_id: envelope.corrId,
|
|
11700
11700
|
hb_env_id: envelope.id,
|
|
11701
11701
|
});
|
|
@@ -11721,7 +11721,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11721
11721
|
throw new FameConnectError('missed heartbeat acknowledgement');
|
|
11722
11722
|
}
|
|
11723
11723
|
}
|
|
11724
|
-
logger$
|
|
11724
|
+
logger$15.debug('completed_heartbeat_loop');
|
|
11725
11725
|
}
|
|
11726
11726
|
async messagePumpLoop(connector, stopEvt, signal) {
|
|
11727
11727
|
while (!stopEvt.isSet() && !signal?.aborted) {
|
|
@@ -11738,19 +11738,19 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11738
11738
|
if (!envelope) {
|
|
11739
11739
|
continue;
|
|
11740
11740
|
}
|
|
11741
|
-
logger$
|
|
11741
|
+
logger$15.debug('upstream_pump_sending_envelope', {
|
|
11742
11742
|
envelopeId: envelope.id,
|
|
11743
11743
|
type: envelope.frame?.type,
|
|
11744
11744
|
});
|
|
11745
11745
|
try {
|
|
11746
11746
|
await connector.send(envelope);
|
|
11747
|
-
logger$
|
|
11747
|
+
logger$15.debug('upstream_pump_sent_envelope', {
|
|
11748
11748
|
envelopeId: envelope.id,
|
|
11749
11749
|
});
|
|
11750
11750
|
}
|
|
11751
11751
|
catch (error) {
|
|
11752
11752
|
if (error instanceof FameMessageTooLarge) {
|
|
11753
|
-
logger$
|
|
11753
|
+
logger$15.error('failed_to_send_message', { error: error.message });
|
|
11754
11754
|
await this.handleMessageTooLarge(envelope, error.message);
|
|
11755
11755
|
}
|
|
11756
11756
|
else if (error instanceof FameTransportClose) {
|
|
@@ -11812,7 +11812,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11812
11812
|
await fabric.send(ackEnvelope);
|
|
11813
11813
|
}
|
|
11814
11814
|
catch (error) {
|
|
11815
|
-
logger$
|
|
11815
|
+
logger$15.warning('failed_to_send_nack', {
|
|
11816
11816
|
error: error.message,
|
|
11817
11817
|
});
|
|
11818
11818
|
}
|
|
@@ -11826,7 +11826,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11826
11826
|
timestamps.push(info.attachExpiresAt);
|
|
11827
11827
|
}
|
|
11828
11828
|
if (!timestamps.length) {
|
|
11829
|
-
logger$
|
|
11829
|
+
logger$15.debug('no_ttl_expiry_configured');
|
|
11830
11830
|
await this.waitEvent(stopEvt, signal);
|
|
11831
11831
|
return;
|
|
11832
11832
|
}
|
|
@@ -11835,7 +11835,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11835
11835
|
let delaySeconds = (earliest.getTime() - now.getTime()) / 1000 -
|
|
11836
11836
|
UpstreamSessionManager.JWT_REFRESH_SAFETY;
|
|
11837
11837
|
delaySeconds = Math.max(delaySeconds, UpstreamSessionManager.JWT_REFRESH_SAFETY);
|
|
11838
|
-
logger$
|
|
11838
|
+
logger$15.debug('ttl_expiry_guard_started', {
|
|
11839
11839
|
welcome_expires_at: welcome.frame.expiresAt ?? null,
|
|
11840
11840
|
attach_expires_at: info.attachExpiresAt?.toISOString?.() ?? null,
|
|
11841
11841
|
earliest_expiry: earliest.toISOString(),
|
|
@@ -11863,7 +11863,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11863
11863
|
}
|
|
11864
11864
|
}
|
|
11865
11865
|
if (!stopEvt.isSet()) {
|
|
11866
|
-
logger$
|
|
11866
|
+
logger$15.debug('ttl_expiry_triggered_reconnect', {
|
|
11867
11867
|
expires_at: earliest.toISOString(),
|
|
11868
11868
|
current_time: new Date().toISOString(),
|
|
11869
11869
|
seconds_before_expiry: UpstreamSessionManager.JWT_REFRESH_SAFETY,
|
|
@@ -11908,7 +11908,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11908
11908
|
}
|
|
11909
11909
|
await this.node.dispatchEnvelopeEvent('onEnvelopeReceived', this.node, env, context);
|
|
11910
11910
|
if (env.frame.type === 'NodeHeartbeatAck') {
|
|
11911
|
-
logger$
|
|
11911
|
+
logger$15.debug('received_heartbeat_ack', {
|
|
11912
11912
|
hb_ack_env_id: env.id,
|
|
11913
11913
|
hb_ack_corr_id: env.corrId,
|
|
11914
11914
|
hb_routing_epoch: env.frame.routingEpoch,
|
|
@@ -11922,7 +11922,7 @@ class UpstreamSessionManager extends TaskSpawner {
|
|
|
11922
11922
|
await this.onEpochChange(epoch);
|
|
11923
11923
|
}
|
|
11924
11924
|
else {
|
|
11925
|
-
logger$
|
|
11925
|
+
logger$15.warning('parent_epoch_changed', { epoch });
|
|
11926
11926
|
}
|
|
11927
11927
|
}
|
|
11928
11928
|
return;
|
|
@@ -11941,7 +11941,7 @@ UpstreamSessionManager.TX_QUEUE_MAX = 512;
|
|
|
11941
11941
|
UpstreamSessionManager.BACKOFF_INITIAL = 1; // seconds
|
|
11942
11942
|
UpstreamSessionManager.BACKOFF_CAP = 30; // seconds
|
|
11943
11943
|
|
|
11944
|
-
const logger$
|
|
11944
|
+
const logger$14 = getLogger('naylence.fame.node.admission.noop_admission_client');
|
|
11945
11945
|
class NoopAdmissionClient {
|
|
11946
11946
|
constructor(options = {}) {
|
|
11947
11947
|
this.hasUpstream = false;
|
|
@@ -11955,7 +11955,7 @@ class NoopAdmissionClient {
|
|
|
11955
11955
|
const acceptedLogicals = this.autoAcceptLogicals
|
|
11956
11956
|
? [...(requestedLogicals ?? [])]
|
|
11957
11957
|
: [];
|
|
11958
|
-
logger$
|
|
11958
|
+
logger$14.debug('noop_admission_hello', {
|
|
11959
11959
|
systemId: effectiveSystemId,
|
|
11960
11960
|
instanceId,
|
|
11961
11961
|
requestedLogicals,
|
|
@@ -11973,7 +11973,7 @@ class NoopAdmissionClient {
|
|
|
11973
11973
|
});
|
|
11974
11974
|
}
|
|
11975
11975
|
async close() {
|
|
11976
|
-
logger$
|
|
11976
|
+
logger$14.debug('noop_admission_close');
|
|
11977
11977
|
}
|
|
11978
11978
|
}
|
|
11979
11979
|
|
|
@@ -12179,7 +12179,7 @@ class DefaultServiceManager {
|
|
|
12179
12179
|
}
|
|
12180
12180
|
|
|
12181
12181
|
const SYSTEM_INBOX$1 = '__sys__';
|
|
12182
|
-
const logger$
|
|
12182
|
+
const logger$13 = getLogger('naylence.fame.node.node');
|
|
12183
12183
|
function isSnakeCase(name) {
|
|
12184
12184
|
return name.includes('_');
|
|
12185
12185
|
}
|
|
@@ -12449,7 +12449,7 @@ class FameNode extends TaskSpawner {
|
|
|
12449
12449
|
confirmIdentity(systemId, source) {
|
|
12450
12450
|
if (this._confirmedId) {
|
|
12451
12451
|
if (this._confirmedId !== systemId) {
|
|
12452
|
-
logger$
|
|
12452
|
+
logger$13.error('node_identity_mismatch', {
|
|
12453
12453
|
current_id: this._confirmedId,
|
|
12454
12454
|
new_id: systemId,
|
|
12455
12455
|
source,
|
|
@@ -12461,14 +12461,14 @@ class FameNode extends TaskSpawner {
|
|
|
12461
12461
|
const isReassignment = this._provisionalId !== systemId;
|
|
12462
12462
|
this._confirmedId = systemId;
|
|
12463
12463
|
if (isReassignment) {
|
|
12464
|
-
logger$
|
|
12464
|
+
logger$13.debug('node_identity_reassigned', {
|
|
12465
12465
|
system_id: systemId,
|
|
12466
12466
|
previous_id: this._provisionalId,
|
|
12467
12467
|
source,
|
|
12468
12468
|
});
|
|
12469
12469
|
}
|
|
12470
12470
|
else {
|
|
12471
|
-
logger$
|
|
12471
|
+
logger$13.debug('node_identity_confirmed', {
|
|
12472
12472
|
system_id: systemId,
|
|
12473
12473
|
source,
|
|
12474
12474
|
});
|
|
@@ -12536,7 +12536,7 @@ class FameNode extends TaskSpawner {
|
|
|
12536
12536
|
return;
|
|
12537
12537
|
}
|
|
12538
12538
|
if (frameType === 'NodeHeartbeat') {
|
|
12539
|
-
logger$
|
|
12539
|
+
logger$13.debug('received_heartbeat_frame', {
|
|
12540
12540
|
envelopeId: envelope.id,
|
|
12541
12541
|
corrId: envelope.corrId ?? null,
|
|
12542
12542
|
});
|
|
@@ -12548,7 +12548,7 @@ class FameNode extends TaskSpawner {
|
|
|
12548
12548
|
await this.handleDeliveryAck(envelope, context);
|
|
12549
12549
|
return;
|
|
12550
12550
|
}
|
|
12551
|
-
logger$
|
|
12551
|
+
logger$13.debug('unhandled_system_frame', {
|
|
12552
12552
|
envelopeId: envelope.id,
|
|
12553
12553
|
frameType,
|
|
12554
12554
|
});
|
|
@@ -12560,13 +12560,13 @@ class FameNode extends TaskSpawner {
|
|
|
12560
12560
|
}
|
|
12561
12561
|
await this._deliveryTracker.onEnvelopeDelivered(SYSTEM_INBOX$1, envelope, context);
|
|
12562
12562
|
if (frame.ok !== false) {
|
|
12563
|
-
logger$
|
|
12563
|
+
logger$13.debug('delivery_ack_received', {
|
|
12564
12564
|
envelopeId: envelope.id,
|
|
12565
12565
|
corrId: envelope.corrId ?? null,
|
|
12566
12566
|
});
|
|
12567
12567
|
return;
|
|
12568
12568
|
}
|
|
12569
|
-
logger$
|
|
12569
|
+
logger$13.warning('delivery_nack_received', {
|
|
12570
12570
|
envelopeId: envelope.id,
|
|
12571
12571
|
corrId: envelope.corrId ?? null,
|
|
12572
12572
|
code: frame.code ?? null,
|
|
@@ -12576,7 +12576,7 @@ class FameNode extends TaskSpawner {
|
|
|
12576
12576
|
await this.onDeliveryNack(frame, envelope, context);
|
|
12577
12577
|
}
|
|
12578
12578
|
async onDeliveryNack(frame, envelope, _context) {
|
|
12579
|
-
logger$
|
|
12579
|
+
logger$13.debug('delivery_nack_processed', {
|
|
12580
12580
|
envelopeId: envelope.id,
|
|
12581
12581
|
code: frame.code ?? null,
|
|
12582
12582
|
reason: frame.reason ?? null,
|
|
@@ -12691,7 +12691,7 @@ class FameNode extends TaskSpawner {
|
|
|
12691
12691
|
await this._bindingManager.restore();
|
|
12692
12692
|
await this._envelopeListenerManager.start();
|
|
12693
12693
|
this._isStarted = true;
|
|
12694
|
-
logger$
|
|
12694
|
+
logger$13.debug('node_started', {
|
|
12695
12695
|
node_id: this.id,
|
|
12696
12696
|
sid: this.sid,
|
|
12697
12697
|
path: this.physicalPath,
|
|
@@ -12723,7 +12723,7 @@ class FameNode extends TaskSpawner {
|
|
|
12723
12723
|
await this._serviceManager.stop();
|
|
12724
12724
|
await this.dispatchEvent('onNodeStopped', this);
|
|
12725
12725
|
this._isStarted = false;
|
|
12726
|
-
logger$
|
|
12726
|
+
logger$13.debug('node_stopped', {
|
|
12727
12727
|
node_id: this.id,
|
|
12728
12728
|
});
|
|
12729
12729
|
}
|
|
@@ -12913,20 +12913,20 @@ class FameNode extends TaskSpawner {
|
|
|
12913
12913
|
await this.forwardUpstream(processedEnvelope, context);
|
|
12914
12914
|
}
|
|
12915
12915
|
else {
|
|
12916
|
-
logger$
|
|
12916
|
+
logger$13.error('attempted_upstream_loop', {
|
|
12917
12917
|
envelopeId: processedEnvelope.id,
|
|
12918
12918
|
});
|
|
12919
12919
|
}
|
|
12920
12920
|
return;
|
|
12921
12921
|
}
|
|
12922
12922
|
if (!processedEnvelope.to) {
|
|
12923
|
-
logger$
|
|
12923
|
+
logger$13.error('dropping_envelope_without_destination', {
|
|
12924
12924
|
envelopeId: processedEnvelope.id,
|
|
12925
12925
|
capabilities: processedEnvelope.capabilities ?? [],
|
|
12926
12926
|
});
|
|
12927
12927
|
return;
|
|
12928
12928
|
}
|
|
12929
|
-
logger$
|
|
12929
|
+
logger$13.warning('no_local_handler_for_address', {
|
|
12930
12930
|
address: processedEnvelope.to.toString?.() ?? String(processedEnvelope.to),
|
|
12931
12931
|
originType: context?.originType ?? null,
|
|
12932
12932
|
});
|
|
@@ -13050,7 +13050,7 @@ class FameNode extends TaskSpawner {
|
|
|
13050
13050
|
}
|
|
13051
13051
|
}
|
|
13052
13052
|
catch (error) {
|
|
13053
|
-
logger$
|
|
13053
|
+
logger$13.warning('callback_grant_collection_failed', {
|
|
13054
13054
|
error: error instanceof Error ? error.message : String(error),
|
|
13055
13055
|
});
|
|
13056
13056
|
}
|
|
@@ -13113,7 +13113,7 @@ class FameNode extends TaskSpawner {
|
|
|
13113
13113
|
await store.set('self', record);
|
|
13114
13114
|
}
|
|
13115
13115
|
catch (error) {
|
|
13116
|
-
logger$
|
|
13116
|
+
logger$13.warning('node_meta_persist_failed', {
|
|
13117
13117
|
error: error instanceof Error ? error.message : String(error),
|
|
13118
13118
|
});
|
|
13119
13119
|
}
|
|
@@ -13251,44 +13251,12 @@ class ConnectionRetryPolicyFactory extends AbstractResourceFactory {
|
|
|
13251
13251
|
}
|
|
13252
13252
|
}
|
|
13253
13253
|
|
|
13254
|
-
|
|
13255
|
-
|
|
13256
|
-
|
|
13257
|
-
|
|
13258
|
-
|
|
13259
|
-
|
|
13260
|
-
throw new Error('Failed to create token provider from configuration');
|
|
13261
|
-
}
|
|
13262
|
-
return provider;
|
|
13263
|
-
}
|
|
13264
|
-
let provider = null;
|
|
13265
|
-
try {
|
|
13266
|
-
provider = await createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
13267
|
-
}
|
|
13268
|
-
catch (error) {
|
|
13269
|
-
const message = 'Failed to create default token provider' +
|
|
13270
|
-
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
13271
|
-
throw new Error(message);
|
|
13272
|
-
}
|
|
13273
|
-
if (!provider) {
|
|
13274
|
-
throw new Error('Failed to create default token provider');
|
|
13275
|
-
}
|
|
13276
|
-
return provider;
|
|
13277
|
-
}
|
|
13278
|
-
}
|
|
13279
|
-
|
|
13280
|
-
function isTokenProvider(candidate) {
|
|
13281
|
-
return (typeof candidate === 'object' &&
|
|
13282
|
-
candidate !== null &&
|
|
13283
|
-
typeof candidate.getToken === 'function');
|
|
13284
|
-
}
|
|
13285
|
-
function isIdentityExposingTokenProvider(candidate) {
|
|
13286
|
-
return (isTokenProvider(candidate) &&
|
|
13287
|
-
typeof candidate.getIdentity ===
|
|
13288
|
-
'function');
|
|
13289
|
-
}
|
|
13290
|
-
|
|
13291
|
-
const logger$13 = getLogger('naylence.fame.node.default_node_identity_policy');
|
|
13254
|
+
/**
|
|
13255
|
+
* Default node identity policy that preserves the current node ID.
|
|
13256
|
+
*
|
|
13257
|
+
* This policy does NOT derive identity from tokens or grants.
|
|
13258
|
+
* For token-subject-based identity, use TokenSubjectNodeIdentityPolicy.
|
|
13259
|
+
*/
|
|
13292
13260
|
class DefaultNodeIdentityPolicy {
|
|
13293
13261
|
async resolveInitialNodeId(context) {
|
|
13294
13262
|
if (context.configuredId) {
|
|
@@ -13300,44 +13268,10 @@ class DefaultNodeIdentityPolicy {
|
|
|
13300
13268
|
return await generateIdAsync({ mode: 'fingerprint' });
|
|
13301
13269
|
}
|
|
13302
13270
|
async resolveAdmissionNodeId(context) {
|
|
13303
|
-
|
|
13304
|
-
|
|
13305
|
-
for (const grant of context.grants) {
|
|
13306
|
-
try {
|
|
13307
|
-
const auth = grant.auth;
|
|
13308
|
-
if (!auth) {
|
|
13309
|
-
continue;
|
|
13310
|
-
}
|
|
13311
|
-
const tokenProviderConfig = (auth.tokenProvider ??
|
|
13312
|
-
auth.token_provider);
|
|
13313
|
-
if (!tokenProviderConfig ||
|
|
13314
|
-
typeof tokenProviderConfig.type !== 'string') {
|
|
13315
|
-
continue;
|
|
13316
|
-
}
|
|
13317
|
-
const provider = await TokenProviderFactory.createTokenProvider(tokenProviderConfig);
|
|
13318
|
-
if (isIdentityExposingTokenProvider(provider)) {
|
|
13319
|
-
const identity = await provider.getIdentity();
|
|
13320
|
-
if (identity && identity.subject) {
|
|
13321
|
-
logger$13.debug('identity_extracted_from_grant', {
|
|
13322
|
-
identity_id: identity.subject,
|
|
13323
|
-
grant_type: grant.type,
|
|
13324
|
-
});
|
|
13325
|
-
return identity.subject;
|
|
13326
|
-
}
|
|
13327
|
-
}
|
|
13328
|
-
}
|
|
13329
|
-
catch (error) {
|
|
13330
|
-
logger$13.warning('identity_extraction_failed', {
|
|
13331
|
-
error: error instanceof Error ? error.message : String(error),
|
|
13332
|
-
grant_type: grant.type,
|
|
13333
|
-
});
|
|
13334
|
-
}
|
|
13335
|
-
}
|
|
13336
|
-
}
|
|
13337
|
-
if (!context.currentNodeId) {
|
|
13338
|
-
return await generateIdAsync({ mode: 'fingerprint' });
|
|
13271
|
+
if (context.currentNodeId) {
|
|
13272
|
+
return context.currentNodeId;
|
|
13339
13273
|
}
|
|
13340
|
-
return
|
|
13274
|
+
return await generateIdAsync({ mode: 'fingerprint' });
|
|
13341
13275
|
}
|
|
13342
13276
|
}
|
|
13343
13277
|
|
|
@@ -16104,6 +16038,43 @@ var defaultNodeIdentityPolicyFactory = /*#__PURE__*/Object.freeze({
|
|
|
16104
16038
|
default: DefaultNodeIdentityPolicyFactory
|
|
16105
16039
|
});
|
|
16106
16040
|
|
|
16041
|
+
const TOKEN_PROVIDER_FACTORY_BASE_TYPE = 'TokenProviderFactory';
|
|
16042
|
+
class TokenProviderFactory extends AbstractResourceFactory {
|
|
16043
|
+
static async createTokenProvider(config, options = {}) {
|
|
16044
|
+
if (config) {
|
|
16045
|
+
const provider = await createResource$1(TOKEN_PROVIDER_FACTORY_BASE_TYPE, config, options);
|
|
16046
|
+
if (!provider) {
|
|
16047
|
+
throw new Error('Failed to create token provider from configuration');
|
|
16048
|
+
}
|
|
16049
|
+
return provider;
|
|
16050
|
+
}
|
|
16051
|
+
let provider = null;
|
|
16052
|
+
try {
|
|
16053
|
+
provider = await createDefaultResource(TOKEN_PROVIDER_FACTORY_BASE_TYPE, null, options);
|
|
16054
|
+
}
|
|
16055
|
+
catch (error) {
|
|
16056
|
+
const message = 'Failed to create default token provider' +
|
|
16057
|
+
(error instanceof Error && error.message ? `: ${error.message}` : '');
|
|
16058
|
+
throw new Error(message);
|
|
16059
|
+
}
|
|
16060
|
+
if (!provider) {
|
|
16061
|
+
throw new Error('Failed to create default token provider');
|
|
16062
|
+
}
|
|
16063
|
+
return provider;
|
|
16064
|
+
}
|
|
16065
|
+
}
|
|
16066
|
+
|
|
16067
|
+
function isTokenProvider(candidate) {
|
|
16068
|
+
return (typeof candidate === 'object' &&
|
|
16069
|
+
candidate !== null &&
|
|
16070
|
+
typeof candidate.getToken === 'function');
|
|
16071
|
+
}
|
|
16072
|
+
function isIdentityExposingTokenProvider(candidate) {
|
|
16073
|
+
return (isTokenProvider(candidate) &&
|
|
16074
|
+
typeof candidate.getIdentity ===
|
|
16075
|
+
'function');
|
|
16076
|
+
}
|
|
16077
|
+
|
|
16107
16078
|
const logger$_ = getLogger('naylence.fame.node.token_subject_node_identity_policy');
|
|
16108
16079
|
class TokenSubjectNodeIdentityPolicy {
|
|
16109
16080
|
async resolveInitialNodeId(context) {
|