@naylence/runtime 0.3.5-test.943 → 0.3.5-test.945

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.
@@ -98,12 +98,12 @@ installProcessEnvShim();
98
98
  // --- END ENV SHIM ---
99
99
 
100
100
  // This file is auto-generated during build - do not edit manually
101
- // Generated from package.json version: 0.3.5-test.943
101
+ // Generated from package.json version: 0.3.5-test.945
102
102
  /**
103
103
  * The package version, injected at build time.
104
104
  * @internal
105
105
  */
106
- const VERSION = '0.3.5-test.943';
106
+ const VERSION = '0.3.5-test.945';
107
107
 
108
108
  /**
109
109
  * Fame protocol specific error classes with WebSocket close codes and proper inheritance.
@@ -29460,6 +29460,7 @@ class InPageListener extends TransportListener {
29460
29460
  this._busHandler = null;
29461
29461
  this._senderRegistry = new Map();
29462
29462
  this._systemToSender = new Map();
29463
+ this._flowIdToSender = new Map();
29463
29464
  this._pendingAttachments = new Map();
29464
29465
  ensureBrowserEnvironment$1();
29465
29466
  const channelCandidate = options?.channelName;
@@ -29526,6 +29527,7 @@ class InPageListener extends TransportListener {
29526
29527
  this._unregisterBusListener();
29527
29528
  this._senderRegistry.clear();
29528
29529
  this._systemToSender.clear();
29530
+ this._flowIdToSender.clear();
29529
29531
  this._pendingAttachments.clear();
29530
29532
  logger$p.debug('inpage_listener_stopped', {
29531
29533
  channel: this._channelName,
@@ -29579,10 +29581,25 @@ class InPageListener extends TransportListener {
29579
29581
  await this._handleAttachFrame(senderId, envelope);
29580
29582
  return;
29581
29583
  }
29582
- const entry = this._senderRegistry.get(senderId);
29584
+ // Try to find connector by sender ID first
29585
+ let entry = this._senderRegistry.get(senderId);
29586
+ // If not found and we have a flowId, try to route based on flow
29587
+ if (!entry && envelope.flowId) {
29588
+ const originalSenderId = this._flowIdToSender.get(envelope.flowId);
29589
+ if (originalSenderId) {
29590
+ entry = this._senderRegistry.get(originalSenderId);
29591
+ logger$p.debug('inpage_listener_routed_by_flow_id', {
29592
+ sender_id: senderId,
29593
+ original_sender_id: originalSenderId,
29594
+ flow_id: envelope.flowId,
29595
+ frame_type: envelope.frame?.type ?? 'unknown',
29596
+ });
29597
+ }
29598
+ }
29583
29599
  if (!entry) {
29584
29600
  logger$p.debug('inpage_listener_no_connector_for_sender', {
29585
29601
  sender_id: senderId,
29602
+ flow_id: envelope.flowId,
29586
29603
  frame_type: envelope.frame?.type ?? 'unknown',
29587
29604
  });
29588
29605
  return;
@@ -29659,6 +29676,15 @@ class InPageListener extends TransportListener {
29659
29676
  }
29660
29677
  this._senderRegistry.set(senderId, entry);
29661
29678
  this._systemToSender.set(entry.systemId, senderId);
29679
+ // Track the flowId if present so we can route responses back
29680
+ if (envelope.flowId) {
29681
+ this._flowIdToSender.set(envelope.flowId, senderId);
29682
+ logger$p.debug('inpage_listener_registered_flow_id', {
29683
+ sender_id: senderId,
29684
+ system_id: entry.systemId,
29685
+ flow_id: envelope.flowId,
29686
+ });
29687
+ }
29662
29688
  await this._deliverEnvelope(entry, envelope);
29663
29689
  }
29664
29690
  async _createConnectorForAttach(params) {
@@ -29706,7 +29732,7 @@ class InPageListener extends TransportListener {
29706
29732
  origin_type: originType,
29707
29733
  connector_type: connector.constructor?.name ?? 'unknown',
29708
29734
  });
29709
- return { connector, systemId, originType };
29735
+ return { connector, systemId, originType, senderId: params.senderId };
29710
29736
  }
29711
29737
  catch (error) {
29712
29738
  logger$p.error('inpage_listener_connector_creation_failed', {
@@ -29760,6 +29786,12 @@ class InPageListener extends TransportListener {
29760
29786
  if (this._systemToSender.get(systemId) === senderId) {
29761
29787
  this._systemToSender.delete(systemId);
29762
29788
  }
29789
+ // Clean up flowId mappings for this sender
29790
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
29791
+ if (sid === senderId) {
29792
+ this._flowIdToSender.delete(flowId);
29793
+ }
29794
+ }
29763
29795
  })
29764
29796
  .catch((error) => {
29765
29797
  logger$p.debug('inpage_listener_wait_until_closed_failed', {
@@ -29771,9 +29803,24 @@ class InPageListener extends TransportListener {
29771
29803
  if (this._systemToSender.get(systemId) === senderId) {
29772
29804
  this._systemToSender.delete(systemId);
29773
29805
  }
29806
+ // Clean up flowId mappings for this sender
29807
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
29808
+ if (sid === senderId) {
29809
+ this._flowIdToSender.delete(flowId);
29810
+ }
29811
+ }
29774
29812
  });
29775
29813
  }
29776
29814
  async _deliverEnvelope(entry, envelope) {
29815
+ // Track flowId for routing responses back
29816
+ if (envelope.flowId && !this._flowIdToSender.has(envelope.flowId)) {
29817
+ this._flowIdToSender.set(envelope.flowId, entry.senderId);
29818
+ logger$p.debug('inpage_listener_registered_flow_id_on_delivery', {
29819
+ sender_id: entry.senderId,
29820
+ system_id: entry.systemId,
29821
+ flow_id: envelope.flowId,
29822
+ });
29823
+ }
29777
29824
  const message = this._buildChannelMessage({
29778
29825
  envelope,
29779
29826
  connector: entry.connector,
@@ -30216,6 +30263,29 @@ class BroadcastChannelListener extends TransportListener {
30216
30263
  inboxCapacity: this._inboxCapacity,
30217
30264
  };
30218
30265
  }
30266
+ // Automatically configure transport frame multiplexing:
30267
+ // Use node IDs (not connector IDs) for node-to-node targeting
30268
+ const broadcastConfig = connectorConfig;
30269
+ if (!broadcastConfig.localNodeId) {
30270
+ broadcastConfig.localNodeId = routingNode.id;
30271
+ }
30272
+ if (!broadcastConfig.remoteNodeId) {
30273
+ broadcastConfig.remoteNodeId = systemId;
30274
+ logger$o.debug('broadcast_channel_listener_auto_configured_remote_node_id', {
30275
+ sender_id: params.senderId,
30276
+ system_id: systemId,
30277
+ remote_node_id: systemId,
30278
+ local_node_id: broadcastConfig.localNodeId,
30279
+ });
30280
+ }
30281
+ else {
30282
+ logger$o.debug('broadcast_channel_listener_using_provided_remote_node_id', {
30283
+ sender_id: params.senderId,
30284
+ system_id: systemId,
30285
+ remote_node_id: broadcastConfig.remoteNodeId,
30286
+ local_node_id: broadcastConfig.localNodeId,
30287
+ });
30288
+ }
30219
30289
  try {
30220
30290
  const connector = await routingNode.createOriginConnector({
30221
30291
  originType,
@@ -30285,6 +30355,21 @@ class BroadcastChannelListener extends TransportListener {
30285
30355
  inboxCandidate > 0) {
30286
30356
  config.inboxCapacity = Math.floor(inboxCandidate);
30287
30357
  }
30358
+ // Extract transport frame multiplexing node IDs
30359
+ const localNodeIdCandidate = candidate.localNodeId ?? candidate['local_node_id'];
30360
+ if (typeof localNodeIdCandidate === 'string' && localNodeIdCandidate.trim().length > 0) {
30361
+ config.localNodeId = localNodeIdCandidate.trim();
30362
+ logger$o.debug('broadcast_channel_listener_extracted_local_node_id', {
30363
+ local_node_id: config.localNodeId,
30364
+ });
30365
+ }
30366
+ const remoteNodeIdCandidate = candidate.remoteNodeId ?? candidate['remote_node_id'];
30367
+ if (typeof remoteNodeIdCandidate === 'string' && remoteNodeIdCandidate.trim().length > 0) {
30368
+ config.remoteNodeId = remoteNodeIdCandidate.trim();
30369
+ logger$o.debug('broadcast_channel_listener_extracted_remote_node_id', {
30370
+ remote_node_id: config.remoteNodeId,
30371
+ });
30372
+ }
30288
30373
  return config;
30289
30374
  }
30290
30375
  _monitorConnectorLifecycle(senderId, systemId, connector) {
@@ -96,12 +96,12 @@ installProcessEnvShim();
96
96
  // --- END ENV SHIM ---
97
97
 
98
98
  // This file is auto-generated during build - do not edit manually
99
- // Generated from package.json version: 0.3.5-test.943
99
+ // Generated from package.json version: 0.3.5-test.945
100
100
  /**
101
101
  * The package version, injected at build time.
102
102
  * @internal
103
103
  */
104
- const VERSION = '0.3.5-test.943';
104
+ const VERSION = '0.3.5-test.945';
105
105
 
106
106
  /**
107
107
  * Fame protocol specific error classes with WebSocket close codes and proper inheritance.
@@ -29458,6 +29458,7 @@ class InPageListener extends TransportListener {
29458
29458
  this._busHandler = null;
29459
29459
  this._senderRegistry = new Map();
29460
29460
  this._systemToSender = new Map();
29461
+ this._flowIdToSender = new Map();
29461
29462
  this._pendingAttachments = new Map();
29462
29463
  ensureBrowserEnvironment$1();
29463
29464
  const channelCandidate = options?.channelName;
@@ -29524,6 +29525,7 @@ class InPageListener extends TransportListener {
29524
29525
  this._unregisterBusListener();
29525
29526
  this._senderRegistry.clear();
29526
29527
  this._systemToSender.clear();
29528
+ this._flowIdToSender.clear();
29527
29529
  this._pendingAttachments.clear();
29528
29530
  logger$p.debug('inpage_listener_stopped', {
29529
29531
  channel: this._channelName,
@@ -29577,10 +29579,25 @@ class InPageListener extends TransportListener {
29577
29579
  await this._handleAttachFrame(senderId, envelope);
29578
29580
  return;
29579
29581
  }
29580
- const entry = this._senderRegistry.get(senderId);
29582
+ // Try to find connector by sender ID first
29583
+ let entry = this._senderRegistry.get(senderId);
29584
+ // If not found and we have a flowId, try to route based on flow
29585
+ if (!entry && envelope.flowId) {
29586
+ const originalSenderId = this._flowIdToSender.get(envelope.flowId);
29587
+ if (originalSenderId) {
29588
+ entry = this._senderRegistry.get(originalSenderId);
29589
+ logger$p.debug('inpage_listener_routed_by_flow_id', {
29590
+ sender_id: senderId,
29591
+ original_sender_id: originalSenderId,
29592
+ flow_id: envelope.flowId,
29593
+ frame_type: envelope.frame?.type ?? 'unknown',
29594
+ });
29595
+ }
29596
+ }
29581
29597
  if (!entry) {
29582
29598
  logger$p.debug('inpage_listener_no_connector_for_sender', {
29583
29599
  sender_id: senderId,
29600
+ flow_id: envelope.flowId,
29584
29601
  frame_type: envelope.frame?.type ?? 'unknown',
29585
29602
  });
29586
29603
  return;
@@ -29657,6 +29674,15 @@ class InPageListener extends TransportListener {
29657
29674
  }
29658
29675
  this._senderRegistry.set(senderId, entry);
29659
29676
  this._systemToSender.set(entry.systemId, senderId);
29677
+ // Track the flowId if present so we can route responses back
29678
+ if (envelope.flowId) {
29679
+ this._flowIdToSender.set(envelope.flowId, senderId);
29680
+ logger$p.debug('inpage_listener_registered_flow_id', {
29681
+ sender_id: senderId,
29682
+ system_id: entry.systemId,
29683
+ flow_id: envelope.flowId,
29684
+ });
29685
+ }
29660
29686
  await this._deliverEnvelope(entry, envelope);
29661
29687
  }
29662
29688
  async _createConnectorForAttach(params) {
@@ -29704,7 +29730,7 @@ class InPageListener extends TransportListener {
29704
29730
  origin_type: originType,
29705
29731
  connector_type: connector.constructor?.name ?? 'unknown',
29706
29732
  });
29707
- return { connector, systemId, originType };
29733
+ return { connector, systemId, originType, senderId: params.senderId };
29708
29734
  }
29709
29735
  catch (error) {
29710
29736
  logger$p.error('inpage_listener_connector_creation_failed', {
@@ -29758,6 +29784,12 @@ class InPageListener extends TransportListener {
29758
29784
  if (this._systemToSender.get(systemId) === senderId) {
29759
29785
  this._systemToSender.delete(systemId);
29760
29786
  }
29787
+ // Clean up flowId mappings for this sender
29788
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
29789
+ if (sid === senderId) {
29790
+ this._flowIdToSender.delete(flowId);
29791
+ }
29792
+ }
29761
29793
  })
29762
29794
  .catch((error) => {
29763
29795
  logger$p.debug('inpage_listener_wait_until_closed_failed', {
@@ -29769,9 +29801,24 @@ class InPageListener extends TransportListener {
29769
29801
  if (this._systemToSender.get(systemId) === senderId) {
29770
29802
  this._systemToSender.delete(systemId);
29771
29803
  }
29804
+ // Clean up flowId mappings for this sender
29805
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
29806
+ if (sid === senderId) {
29807
+ this._flowIdToSender.delete(flowId);
29808
+ }
29809
+ }
29772
29810
  });
29773
29811
  }
29774
29812
  async _deliverEnvelope(entry, envelope) {
29813
+ // Track flowId for routing responses back
29814
+ if (envelope.flowId && !this._flowIdToSender.has(envelope.flowId)) {
29815
+ this._flowIdToSender.set(envelope.flowId, entry.senderId);
29816
+ logger$p.debug('inpage_listener_registered_flow_id_on_delivery', {
29817
+ sender_id: entry.senderId,
29818
+ system_id: entry.systemId,
29819
+ flow_id: envelope.flowId,
29820
+ });
29821
+ }
29775
29822
  const message = this._buildChannelMessage({
29776
29823
  envelope,
29777
29824
  connector: entry.connector,
@@ -30214,6 +30261,29 @@ class BroadcastChannelListener extends TransportListener {
30214
30261
  inboxCapacity: this._inboxCapacity,
30215
30262
  };
30216
30263
  }
30264
+ // Automatically configure transport frame multiplexing:
30265
+ // Use node IDs (not connector IDs) for node-to-node targeting
30266
+ const broadcastConfig = connectorConfig;
30267
+ if (!broadcastConfig.localNodeId) {
30268
+ broadcastConfig.localNodeId = routingNode.id;
30269
+ }
30270
+ if (!broadcastConfig.remoteNodeId) {
30271
+ broadcastConfig.remoteNodeId = systemId;
30272
+ logger$o.debug('broadcast_channel_listener_auto_configured_remote_node_id', {
30273
+ sender_id: params.senderId,
30274
+ system_id: systemId,
30275
+ remote_node_id: systemId,
30276
+ local_node_id: broadcastConfig.localNodeId,
30277
+ });
30278
+ }
30279
+ else {
30280
+ logger$o.debug('broadcast_channel_listener_using_provided_remote_node_id', {
30281
+ sender_id: params.senderId,
30282
+ system_id: systemId,
30283
+ remote_node_id: broadcastConfig.remoteNodeId,
30284
+ local_node_id: broadcastConfig.localNodeId,
30285
+ });
30286
+ }
30217
30287
  try {
30218
30288
  const connector = await routingNode.createOriginConnector({
30219
30289
  originType,
@@ -30283,6 +30353,21 @@ class BroadcastChannelListener extends TransportListener {
30283
30353
  inboxCandidate > 0) {
30284
30354
  config.inboxCapacity = Math.floor(inboxCandidate);
30285
30355
  }
30356
+ // Extract transport frame multiplexing node IDs
30357
+ const localNodeIdCandidate = candidate.localNodeId ?? candidate['local_node_id'];
30358
+ if (typeof localNodeIdCandidate === 'string' && localNodeIdCandidate.trim().length > 0) {
30359
+ config.localNodeId = localNodeIdCandidate.trim();
30360
+ logger$o.debug('broadcast_channel_listener_extracted_local_node_id', {
30361
+ local_node_id: config.localNodeId,
30362
+ });
30363
+ }
30364
+ const remoteNodeIdCandidate = candidate.remoteNodeId ?? candidate['remote_node_id'];
30365
+ if (typeof remoteNodeIdCandidate === 'string' && remoteNodeIdCandidate.trim().length > 0) {
30366
+ config.remoteNodeId = remoteNodeIdCandidate.trim();
30367
+ logger$o.debug('broadcast_channel_listener_extracted_remote_node_id', {
30368
+ remote_node_id: config.remoteNodeId,
30369
+ });
30370
+ }
30286
30371
  return config;
30287
30372
  }
30288
30373
  _monitorConnectorLifecycle(senderId, systemId, connector) {
@@ -344,6 +344,29 @@ class BroadcastChannelListener extends transport_listener_js_1.TransportListener
344
344
  inboxCapacity: this._inboxCapacity,
345
345
  };
346
346
  }
347
+ // Automatically configure transport frame multiplexing:
348
+ // Use node IDs (not connector IDs) for node-to-node targeting
349
+ const broadcastConfig = connectorConfig;
350
+ if (!broadcastConfig.localNodeId) {
351
+ broadcastConfig.localNodeId = routingNode.id;
352
+ }
353
+ if (!broadcastConfig.remoteNodeId) {
354
+ broadcastConfig.remoteNodeId = systemId;
355
+ logger.debug('broadcast_channel_listener_auto_configured_remote_node_id', {
356
+ sender_id: params.senderId,
357
+ system_id: systemId,
358
+ remote_node_id: systemId,
359
+ local_node_id: broadcastConfig.localNodeId,
360
+ });
361
+ }
362
+ else {
363
+ logger.debug('broadcast_channel_listener_using_provided_remote_node_id', {
364
+ sender_id: params.senderId,
365
+ system_id: systemId,
366
+ remote_node_id: broadcastConfig.remoteNodeId,
367
+ local_node_id: broadcastConfig.localNodeId,
368
+ });
369
+ }
347
370
  try {
348
371
  const connector = await routingNode.createOriginConnector({
349
372
  originType,
@@ -413,6 +436,21 @@ class BroadcastChannelListener extends transport_listener_js_1.TransportListener
413
436
  inboxCandidate > 0) {
414
437
  config.inboxCapacity = Math.floor(inboxCandidate);
415
438
  }
439
+ // Extract transport frame multiplexing node IDs
440
+ const localNodeIdCandidate = candidate.localNodeId ?? candidate['local_node_id'];
441
+ if (typeof localNodeIdCandidate === 'string' && localNodeIdCandidate.trim().length > 0) {
442
+ config.localNodeId = localNodeIdCandidate.trim();
443
+ logger.debug('broadcast_channel_listener_extracted_local_node_id', {
444
+ local_node_id: config.localNodeId,
445
+ });
446
+ }
447
+ const remoteNodeIdCandidate = candidate.remoteNodeId ?? candidate['remote_node_id'];
448
+ if (typeof remoteNodeIdCandidate === 'string' && remoteNodeIdCandidate.trim().length > 0) {
449
+ config.remoteNodeId = remoteNodeIdCandidate.trim();
450
+ logger.debug('broadcast_channel_listener_extracted_remote_node_id', {
451
+ remote_node_id: config.remoteNodeId,
452
+ });
453
+ }
416
454
  return config;
417
455
  }
418
456
  _monitorConnectorLifecycle(senderId, systemId, connector) {
@@ -65,6 +65,7 @@ class InPageListener extends transport_listener_js_1.TransportListener {
65
65
  this._busHandler = null;
66
66
  this._senderRegistry = new Map();
67
67
  this._systemToSender = new Map();
68
+ this._flowIdToSender = new Map();
68
69
  this._pendingAttachments = new Map();
69
70
  ensureBrowserEnvironment();
70
71
  const channelCandidate = options?.channelName;
@@ -131,6 +132,7 @@ class InPageListener extends transport_listener_js_1.TransportListener {
131
132
  this._unregisterBusListener();
132
133
  this._senderRegistry.clear();
133
134
  this._systemToSender.clear();
135
+ this._flowIdToSender.clear();
134
136
  this._pendingAttachments.clear();
135
137
  logger.debug('inpage_listener_stopped', {
136
138
  channel: this._channelName,
@@ -184,10 +186,25 @@ class InPageListener extends transport_listener_js_1.TransportListener {
184
186
  await this._handleAttachFrame(senderId, envelope);
185
187
  return;
186
188
  }
187
- const entry = this._senderRegistry.get(senderId);
189
+ // Try to find connector by sender ID first
190
+ let entry = this._senderRegistry.get(senderId);
191
+ // If not found and we have a flowId, try to route based on flow
192
+ if (!entry && envelope.flowId) {
193
+ const originalSenderId = this._flowIdToSender.get(envelope.flowId);
194
+ if (originalSenderId) {
195
+ entry = this._senderRegistry.get(originalSenderId);
196
+ logger.debug('inpage_listener_routed_by_flow_id', {
197
+ sender_id: senderId,
198
+ original_sender_id: originalSenderId,
199
+ flow_id: envelope.flowId,
200
+ frame_type: envelope.frame?.type ?? 'unknown',
201
+ });
202
+ }
203
+ }
188
204
  if (!entry) {
189
205
  logger.debug('inpage_listener_no_connector_for_sender', {
190
206
  sender_id: senderId,
207
+ flow_id: envelope.flowId,
191
208
  frame_type: envelope.frame?.type ?? 'unknown',
192
209
  });
193
210
  return;
@@ -264,6 +281,15 @@ class InPageListener extends transport_listener_js_1.TransportListener {
264
281
  }
265
282
  this._senderRegistry.set(senderId, entry);
266
283
  this._systemToSender.set(entry.systemId, senderId);
284
+ // Track the flowId if present so we can route responses back
285
+ if (envelope.flowId) {
286
+ this._flowIdToSender.set(envelope.flowId, senderId);
287
+ logger.debug('inpage_listener_registered_flow_id', {
288
+ sender_id: senderId,
289
+ system_id: entry.systemId,
290
+ flow_id: envelope.flowId,
291
+ });
292
+ }
267
293
  await this._deliverEnvelope(entry, envelope);
268
294
  }
269
295
  async _createConnectorForAttach(params) {
@@ -311,7 +337,7 @@ class InPageListener extends transport_listener_js_1.TransportListener {
311
337
  origin_type: originType,
312
338
  connector_type: connector.constructor?.name ?? 'unknown',
313
339
  });
314
- return { connector, systemId, originType };
340
+ return { connector, systemId, originType, senderId: params.senderId };
315
341
  }
316
342
  catch (error) {
317
343
  logger.error('inpage_listener_connector_creation_failed', {
@@ -365,6 +391,12 @@ class InPageListener extends transport_listener_js_1.TransportListener {
365
391
  if (this._systemToSender.get(systemId) === senderId) {
366
392
  this._systemToSender.delete(systemId);
367
393
  }
394
+ // Clean up flowId mappings for this sender
395
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
396
+ if (sid === senderId) {
397
+ this._flowIdToSender.delete(flowId);
398
+ }
399
+ }
368
400
  })
369
401
  .catch((error) => {
370
402
  logger.debug('inpage_listener_wait_until_closed_failed', {
@@ -376,9 +408,24 @@ class InPageListener extends transport_listener_js_1.TransportListener {
376
408
  if (this._systemToSender.get(systemId) === senderId) {
377
409
  this._systemToSender.delete(systemId);
378
410
  }
411
+ // Clean up flowId mappings for this sender
412
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
413
+ if (sid === senderId) {
414
+ this._flowIdToSender.delete(flowId);
415
+ }
416
+ }
379
417
  });
380
418
  }
381
419
  async _deliverEnvelope(entry, envelope) {
420
+ // Track flowId for routing responses back
421
+ if (envelope.flowId && !this._flowIdToSender.has(envelope.flowId)) {
422
+ this._flowIdToSender.set(envelope.flowId, entry.senderId);
423
+ logger.debug('inpage_listener_registered_flow_id_on_delivery', {
424
+ sender_id: entry.senderId,
425
+ system_id: entry.systemId,
426
+ flow_id: envelope.flowId,
427
+ });
428
+ }
382
429
  const message = this._buildChannelMessage({
383
430
  envelope,
384
431
  connector: entry.connector,
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  // This file is auto-generated during build - do not edit manually
3
- // Generated from package.json version: 0.3.5-test.943
3
+ // Generated from package.json version: 0.3.5-test.945
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.VERSION = void 0;
6
6
  /**
7
7
  * The package version, injected at build time.
8
8
  * @internal
9
9
  */
10
- exports.VERSION = '0.3.5-test.943';
10
+ exports.VERSION = '0.3.5-test.945';
@@ -340,6 +340,29 @@ export class BroadcastChannelListener extends TransportListener {
340
340
  inboxCapacity: this._inboxCapacity,
341
341
  };
342
342
  }
343
+ // Automatically configure transport frame multiplexing:
344
+ // Use node IDs (not connector IDs) for node-to-node targeting
345
+ const broadcastConfig = connectorConfig;
346
+ if (!broadcastConfig.localNodeId) {
347
+ broadcastConfig.localNodeId = routingNode.id;
348
+ }
349
+ if (!broadcastConfig.remoteNodeId) {
350
+ broadcastConfig.remoteNodeId = systemId;
351
+ logger.debug('broadcast_channel_listener_auto_configured_remote_node_id', {
352
+ sender_id: params.senderId,
353
+ system_id: systemId,
354
+ remote_node_id: systemId,
355
+ local_node_id: broadcastConfig.localNodeId,
356
+ });
357
+ }
358
+ else {
359
+ logger.debug('broadcast_channel_listener_using_provided_remote_node_id', {
360
+ sender_id: params.senderId,
361
+ system_id: systemId,
362
+ remote_node_id: broadcastConfig.remoteNodeId,
363
+ local_node_id: broadcastConfig.localNodeId,
364
+ });
365
+ }
343
366
  try {
344
367
  const connector = await routingNode.createOriginConnector({
345
368
  originType,
@@ -409,6 +432,21 @@ export class BroadcastChannelListener extends TransportListener {
409
432
  inboxCandidate > 0) {
410
433
  config.inboxCapacity = Math.floor(inboxCandidate);
411
434
  }
435
+ // Extract transport frame multiplexing node IDs
436
+ const localNodeIdCandidate = candidate.localNodeId ?? candidate['local_node_id'];
437
+ if (typeof localNodeIdCandidate === 'string' && localNodeIdCandidate.trim().length > 0) {
438
+ config.localNodeId = localNodeIdCandidate.trim();
439
+ logger.debug('broadcast_channel_listener_extracted_local_node_id', {
440
+ local_node_id: config.localNodeId,
441
+ });
442
+ }
443
+ const remoteNodeIdCandidate = candidate.remoteNodeId ?? candidate['remote_node_id'];
444
+ if (typeof remoteNodeIdCandidate === 'string' && remoteNodeIdCandidate.trim().length > 0) {
445
+ config.remoteNodeId = remoteNodeIdCandidate.trim();
446
+ logger.debug('broadcast_channel_listener_extracted_remote_node_id', {
447
+ remote_node_id: config.remoteNodeId,
448
+ });
449
+ }
412
450
  return config;
413
451
  }
414
452
  _monitorConnectorLifecycle(senderId, systemId, connector) {
@@ -61,6 +61,7 @@ export class InPageListener extends TransportListener {
61
61
  this._busHandler = null;
62
62
  this._senderRegistry = new Map();
63
63
  this._systemToSender = new Map();
64
+ this._flowIdToSender = new Map();
64
65
  this._pendingAttachments = new Map();
65
66
  ensureBrowserEnvironment();
66
67
  const channelCandidate = options?.channelName;
@@ -127,6 +128,7 @@ export class InPageListener extends TransportListener {
127
128
  this._unregisterBusListener();
128
129
  this._senderRegistry.clear();
129
130
  this._systemToSender.clear();
131
+ this._flowIdToSender.clear();
130
132
  this._pendingAttachments.clear();
131
133
  logger.debug('inpage_listener_stopped', {
132
134
  channel: this._channelName,
@@ -180,10 +182,25 @@ export class InPageListener extends TransportListener {
180
182
  await this._handleAttachFrame(senderId, envelope);
181
183
  return;
182
184
  }
183
- const entry = this._senderRegistry.get(senderId);
185
+ // Try to find connector by sender ID first
186
+ let entry = this._senderRegistry.get(senderId);
187
+ // If not found and we have a flowId, try to route based on flow
188
+ if (!entry && envelope.flowId) {
189
+ const originalSenderId = this._flowIdToSender.get(envelope.flowId);
190
+ if (originalSenderId) {
191
+ entry = this._senderRegistry.get(originalSenderId);
192
+ logger.debug('inpage_listener_routed_by_flow_id', {
193
+ sender_id: senderId,
194
+ original_sender_id: originalSenderId,
195
+ flow_id: envelope.flowId,
196
+ frame_type: envelope.frame?.type ?? 'unknown',
197
+ });
198
+ }
199
+ }
184
200
  if (!entry) {
185
201
  logger.debug('inpage_listener_no_connector_for_sender', {
186
202
  sender_id: senderId,
203
+ flow_id: envelope.flowId,
187
204
  frame_type: envelope.frame?.type ?? 'unknown',
188
205
  });
189
206
  return;
@@ -260,6 +277,15 @@ export class InPageListener extends TransportListener {
260
277
  }
261
278
  this._senderRegistry.set(senderId, entry);
262
279
  this._systemToSender.set(entry.systemId, senderId);
280
+ // Track the flowId if present so we can route responses back
281
+ if (envelope.flowId) {
282
+ this._flowIdToSender.set(envelope.flowId, senderId);
283
+ logger.debug('inpage_listener_registered_flow_id', {
284
+ sender_id: senderId,
285
+ system_id: entry.systemId,
286
+ flow_id: envelope.flowId,
287
+ });
288
+ }
263
289
  await this._deliverEnvelope(entry, envelope);
264
290
  }
265
291
  async _createConnectorForAttach(params) {
@@ -307,7 +333,7 @@ export class InPageListener extends TransportListener {
307
333
  origin_type: originType,
308
334
  connector_type: connector.constructor?.name ?? 'unknown',
309
335
  });
310
- return { connector, systemId, originType };
336
+ return { connector, systemId, originType, senderId: params.senderId };
311
337
  }
312
338
  catch (error) {
313
339
  logger.error('inpage_listener_connector_creation_failed', {
@@ -361,6 +387,12 @@ export class InPageListener extends TransportListener {
361
387
  if (this._systemToSender.get(systemId) === senderId) {
362
388
  this._systemToSender.delete(systemId);
363
389
  }
390
+ // Clean up flowId mappings for this sender
391
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
392
+ if (sid === senderId) {
393
+ this._flowIdToSender.delete(flowId);
394
+ }
395
+ }
364
396
  })
365
397
  .catch((error) => {
366
398
  logger.debug('inpage_listener_wait_until_closed_failed', {
@@ -372,9 +404,24 @@ export class InPageListener extends TransportListener {
372
404
  if (this._systemToSender.get(systemId) === senderId) {
373
405
  this._systemToSender.delete(systemId);
374
406
  }
407
+ // Clean up flowId mappings for this sender
408
+ for (const [flowId, sid] of this._flowIdToSender.entries()) {
409
+ if (sid === senderId) {
410
+ this._flowIdToSender.delete(flowId);
411
+ }
412
+ }
375
413
  });
376
414
  }
377
415
  async _deliverEnvelope(entry, envelope) {
416
+ // Track flowId for routing responses back
417
+ if (envelope.flowId && !this._flowIdToSender.has(envelope.flowId)) {
418
+ this._flowIdToSender.set(envelope.flowId, entry.senderId);
419
+ logger.debug('inpage_listener_registered_flow_id_on_delivery', {
420
+ sender_id: entry.senderId,
421
+ system_id: entry.systemId,
422
+ flow_id: envelope.flowId,
423
+ });
424
+ }
378
425
  const message = this._buildChannelMessage({
379
426
  envelope,
380
427
  connector: entry.connector,
@@ -1,7 +1,7 @@
1
1
  // This file is auto-generated during build - do not edit manually
2
- // Generated from package.json version: 0.3.5-test.943
2
+ // Generated from package.json version: 0.3.5-test.945
3
3
  /**
4
4
  * The package version, injected at build time.
5
5
  * @internal
6
6
  */
7
- export const VERSION = '0.3.5-test.943';
7
+ export const VERSION = '0.3.5-test.945';