@naylence/runtime 0.3.5-test.908 → 0.3.5-test.909

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.
Files changed (209) hide show
  1. package/dist/browser/index.cjs +8873 -8303
  2. package/dist/browser/index.cjs.map +1 -1
  3. package/dist/browser/index.mjs +8865 -8300
  4. package/dist/browser/index.mjs.map +1 -1
  5. package/dist/cjs/browser.js +24 -0
  6. package/dist/cjs/browser.js.map +1 -1
  7. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector-factory.js +161 -0
  8. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector-factory.js.map +1 -0
  9. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector.browser.js +318 -0
  10. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector.browser.js.map +1 -0
  11. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector.js +16 -0
  12. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector.js.map +1 -0
  13. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector.node.js +27 -0
  14. package/dist/cjs/naylence/fame/connector/broadcast-channel-connector.node.js.map +1 -0
  15. package/dist/cjs/naylence/fame/connector/broadcast-channel-listener-factory.js +96 -0
  16. package/dist/cjs/naylence/fame/connector/broadcast-channel-listener-factory.js.map +1 -0
  17. package/dist/cjs/naylence/fame/connector/broadcast-channel-listener.js +485 -0
  18. package/dist/cjs/naylence/fame/connector/broadcast-channel-listener.js.map +1 -0
  19. package/dist/cjs/naylence/fame/connector/grant-selection-policy.js +86 -1
  20. package/dist/cjs/naylence/fame/connector/grant-selection-policy.js.map +1 -1
  21. package/dist/cjs/naylence/fame/connector/http-listener.js +2 -2
  22. package/dist/cjs/naylence/fame/connector/http-listener.js.map +1 -1
  23. package/dist/cjs/naylence/fame/connector/http-stateless-connector.js +5 -60
  24. package/dist/cjs/naylence/fame/connector/http-stateless-connector.js.map +1 -1
  25. package/dist/cjs/naylence/fame/connector/index.js +20 -2
  26. package/dist/cjs/naylence/fame/connector/index.js.map +1 -1
  27. package/dist/cjs/naylence/fame/connector/inpage-connector-factory.js +163 -0
  28. package/dist/cjs/naylence/fame/connector/inpage-connector-factory.js.map +1 -0
  29. package/dist/cjs/naylence/fame/connector/inpage-connector.js +219 -0
  30. package/dist/cjs/naylence/fame/connector/inpage-connector.js.map +1 -0
  31. package/dist/cjs/naylence/fame/connector/inpage-listener-factory.js +96 -0
  32. package/dist/cjs/naylence/fame/connector/inpage-listener-factory.js.map +1 -0
  33. package/dist/cjs/naylence/fame/connector/inpage-listener.js +423 -0
  34. package/dist/cjs/naylence/fame/connector/inpage-listener.js.map +1 -0
  35. package/dist/cjs/naylence/fame/delivery/default-delivery-tracker.js +147 -11
  36. package/dist/cjs/naylence/fame/delivery/default-delivery-tracker.js.map +1 -1
  37. package/dist/cjs/naylence/fame/fabric/in-process-fame-fabric.js +2 -19
  38. package/dist/cjs/naylence/fame/fabric/in-process-fame-fabric.js.map +1 -1
  39. package/dist/cjs/naylence/fame/factory-manifest.js +4 -1
  40. package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
  41. package/dist/cjs/naylence/fame/grants/broadcast-channel-connection-grant.js +76 -0
  42. package/dist/cjs/naylence/fame/grants/broadcast-channel-connection-grant.js.map +1 -0
  43. package/dist/cjs/naylence/fame/grants/index.js +11 -1
  44. package/dist/cjs/naylence/fame/grants/index.js.map +1 -1
  45. package/dist/cjs/naylence/fame/grants/inpage-connection-grant.js +76 -0
  46. package/dist/cjs/naylence/fame/grants/inpage-connection-grant.js.map +1 -0
  47. package/dist/cjs/naylence/fame/node/admission/admission-profile-factory.js +20 -0
  48. package/dist/cjs/naylence/fame/node/admission/admission-profile-factory.js.map +1 -1
  49. package/dist/cjs/naylence/fame/node/envelope-listener-manager.js +22 -0
  50. package/dist/cjs/naylence/fame/node/envelope-listener-manager.js.map +1 -1
  51. package/dist/cjs/naylence/fame/node/index.js +0 -1
  52. package/dist/cjs/naylence/fame/node/index.js.map +1 -1
  53. package/dist/cjs/naylence/fame/node/node.js +0 -9
  54. package/dist/cjs/naylence/fame/node/node.js.map +1 -1
  55. package/dist/cjs/naylence/fame/node/upstream-session-manager.js +56 -0
  56. package/dist/cjs/naylence/fame/node/upstream-session-manager.js.map +1 -1
  57. package/dist/cjs/naylence/fame/placement/static-node-placement-strategy-factory.js +2 -13
  58. package/dist/cjs/naylence/fame/placement/static-node-placement-strategy-factory.js.map +1 -1
  59. package/dist/cjs/naylence/fame/util/bounded-async-queue.js +66 -0
  60. package/dist/cjs/naylence/fame/util/bounded-async-queue.js.map +1 -0
  61. package/dist/cjs/node.js +3 -1
  62. package/dist/cjs/node.js.map +1 -1
  63. package/dist/cjs/runtime-isomorphic.js +4 -1
  64. package/dist/cjs/runtime-isomorphic.js.map +1 -1
  65. package/dist/cjs/version.js +2 -2
  66. package/dist/esm/browser.js +9 -0
  67. package/dist/esm/browser.js.map +1 -1
  68. package/dist/esm/naylence/fame/connector/broadcast-channel-connector-factory.js +157 -0
  69. package/dist/esm/naylence/fame/connector/broadcast-channel-connector-factory.js.map +1 -0
  70. package/dist/esm/naylence/fame/connector/broadcast-channel-connector.browser.js +314 -0
  71. package/dist/esm/naylence/fame/connector/broadcast-channel-connector.browser.js.map +1 -0
  72. package/dist/esm/naylence/fame/connector/broadcast-channel-connector.js +12 -0
  73. package/dist/esm/naylence/fame/connector/broadcast-channel-connector.js.map +1 -0
  74. package/dist/esm/naylence/fame/connector/broadcast-channel-connector.node.js +23 -0
  75. package/dist/esm/naylence/fame/connector/broadcast-channel-connector.node.js.map +1 -0
  76. package/dist/esm/naylence/fame/connector/broadcast-channel-listener-factory.js +59 -0
  77. package/dist/esm/naylence/fame/connector/broadcast-channel-listener-factory.js.map +1 -0
  78. package/dist/esm/naylence/fame/connector/broadcast-channel-listener.js +480 -0
  79. package/dist/esm/naylence/fame/connector/broadcast-channel-listener.js.map +1 -0
  80. package/dist/esm/naylence/fame/connector/grant-selection-policy.js +86 -1
  81. package/dist/esm/naylence/fame/connector/grant-selection-policy.js.map +1 -1
  82. package/dist/esm/naylence/fame/connector/http-listener.js +1 -1
  83. package/dist/esm/naylence/fame/connector/http-listener.js.map +1 -1
  84. package/dist/esm/naylence/fame/connector/http-stateless-connector.js +2 -57
  85. package/dist/esm/naylence/fame/connector/http-stateless-connector.js.map +1 -1
  86. package/dist/esm/naylence/fame/connector/index.js +10 -1
  87. package/dist/esm/naylence/fame/connector/index.js.map +1 -1
  88. package/dist/esm/naylence/fame/connector/inpage-connector-factory.js +159 -0
  89. package/dist/esm/naylence/fame/connector/inpage-connector-factory.js.map +1 -0
  90. package/dist/esm/naylence/fame/connector/inpage-connector.js +215 -0
  91. package/dist/esm/naylence/fame/connector/inpage-connector.js.map +1 -0
  92. package/dist/esm/naylence/fame/connector/inpage-listener-factory.js +59 -0
  93. package/dist/esm/naylence/fame/connector/inpage-listener-factory.js.map +1 -0
  94. package/dist/esm/naylence/fame/connector/inpage-listener.js +418 -0
  95. package/dist/esm/naylence/fame/connector/inpage-listener.js.map +1 -0
  96. package/dist/esm/naylence/fame/delivery/default-delivery-tracker.js +147 -11
  97. package/dist/esm/naylence/fame/delivery/default-delivery-tracker.js.map +1 -1
  98. package/dist/esm/naylence/fame/fabric/in-process-fame-fabric.js +2 -19
  99. package/dist/esm/naylence/fame/fabric/in-process-fame-fabric.js.map +1 -1
  100. package/dist/esm/naylence/fame/factory-manifest.js +4 -1
  101. package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
  102. package/dist/esm/naylence/fame/grants/broadcast-channel-connection-grant.js +70 -0
  103. package/dist/esm/naylence/fame/grants/broadcast-channel-connection-grant.js.map +1 -0
  104. package/dist/esm/naylence/fame/grants/index.js +2 -0
  105. package/dist/esm/naylence/fame/grants/index.js.map +1 -1
  106. package/dist/esm/naylence/fame/grants/inpage-connection-grant.js +70 -0
  107. package/dist/esm/naylence/fame/grants/inpage-connection-grant.js.map +1 -0
  108. package/dist/esm/naylence/fame/node/admission/admission-profile-factory.js +20 -0
  109. package/dist/esm/naylence/fame/node/admission/admission-profile-factory.js.map +1 -1
  110. package/dist/esm/naylence/fame/node/envelope-listener-manager.js +22 -0
  111. package/dist/esm/naylence/fame/node/envelope-listener-manager.js.map +1 -1
  112. package/dist/esm/naylence/fame/node/index.js +0 -1
  113. package/dist/esm/naylence/fame/node/index.js.map +1 -1
  114. package/dist/esm/naylence/fame/node/node.js +0 -9
  115. package/dist/esm/naylence/fame/node/node.js.map +1 -1
  116. package/dist/esm/naylence/fame/node/upstream-session-manager.js +56 -0
  117. package/dist/esm/naylence/fame/node/upstream-session-manager.js.map +1 -1
  118. package/dist/esm/naylence/fame/placement/static-node-placement-strategy-factory.js +2 -13
  119. package/dist/esm/naylence/fame/placement/static-node-placement-strategy-factory.js.map +1 -1
  120. package/dist/esm/naylence/fame/util/bounded-async-queue.js +61 -0
  121. package/dist/esm/naylence/fame/util/bounded-async-queue.js.map +1 -0
  122. package/dist/esm/node.js +1 -1
  123. package/dist/esm/node.js.map +1 -1
  124. package/dist/esm/runtime-isomorphic.js +1 -0
  125. package/dist/esm/runtime-isomorphic.js.map +1 -1
  126. package/dist/esm/version.js +2 -2
  127. package/dist/node/index.cjs +8873 -8303
  128. package/dist/node/index.cjs.map +1 -1
  129. package/dist/node/index.mjs +8865 -8300
  130. package/dist/node/index.mjs.map +1 -1
  131. package/dist/node/node.cjs +5317 -3086
  132. package/dist/node/node.cjs.map +1 -1
  133. package/dist/node/node.mjs +5304 -3080
  134. package/dist/node/node.mjs.map +1 -1
  135. package/dist/types/browser.d.ts +8 -0
  136. package/dist/types/browser.d.ts.map +1 -1
  137. package/dist/types/naylence/fame/connector/broadcast-channel-connector-factory.d.ts +28 -0
  138. package/dist/types/naylence/fame/connector/broadcast-channel-connector-factory.d.ts.map +1 -0
  139. package/dist/types/naylence/fame/connector/broadcast-channel-connector.browser.d.ts +40 -0
  140. package/dist/types/naylence/fame/connector/broadcast-channel-connector.browser.d.ts.map +1 -0
  141. package/dist/types/naylence/fame/connector/broadcast-channel-connector.d.ts +9 -0
  142. package/dist/types/naylence/fame/connector/broadcast-channel-connector.d.ts.map +1 -0
  143. package/dist/types/naylence/fame/connector/broadcast-channel-connector.node.d.ts +17 -0
  144. package/dist/types/naylence/fame/connector/broadcast-channel-connector.node.d.ts.map +1 -0
  145. package/dist/types/naylence/fame/connector/broadcast-channel-listener-factory.d.ts +22 -0
  146. package/dist/types/naylence/fame/connector/broadcast-channel-listener-factory.d.ts.map +1 -0
  147. package/dist/types/naylence/fame/connector/broadcast-channel-listener.d.ts +42 -0
  148. package/dist/types/naylence/fame/connector/broadcast-channel-listener.d.ts.map +1 -0
  149. package/dist/types/naylence/fame/connector/grant-selection-policy.d.ts.map +1 -1
  150. package/dist/types/naylence/fame/connector/http-stateless-connector.d.ts +1 -4
  151. package/dist/types/naylence/fame/connector/http-stateless-connector.d.ts.map +1 -1
  152. package/dist/types/naylence/fame/connector/index.d.ts +10 -1
  153. package/dist/types/naylence/fame/connector/index.d.ts.map +1 -1
  154. package/dist/types/naylence/fame/connector/inpage-connector-factory.d.ts +31 -0
  155. package/dist/types/naylence/fame/connector/inpage-connector-factory.d.ts.map +1 -0
  156. package/dist/types/naylence/fame/connector/inpage-connector.d.ts +31 -0
  157. package/dist/types/naylence/fame/connector/inpage-connector.d.ts.map +1 -0
  158. package/dist/types/naylence/fame/connector/inpage-listener-factory.d.ts +22 -0
  159. package/dist/types/naylence/fame/connector/inpage-listener-factory.d.ts.map +1 -0
  160. package/dist/types/naylence/fame/connector/inpage-listener.d.ts +42 -0
  161. package/dist/types/naylence/fame/connector/inpage-listener.d.ts.map +1 -0
  162. package/dist/types/naylence/fame/delivery/default-delivery-tracker.d.ts +12 -0
  163. package/dist/types/naylence/fame/delivery/default-delivery-tracker.d.ts.map +1 -1
  164. package/dist/types/naylence/fame/fabric/in-process-fame-fabric.d.ts +0 -1
  165. package/dist/types/naylence/fame/fabric/in-process-fame-fabric.d.ts.map +1 -1
  166. package/dist/types/naylence/fame/factory-manifest.d.ts +1 -1
  167. package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
  168. package/dist/types/naylence/fame/grants/broadcast-channel-connection-grant.d.ts +21 -0
  169. package/dist/types/naylence/fame/grants/broadcast-channel-connection-grant.d.ts.map +1 -0
  170. package/dist/types/naylence/fame/grants/index.d.ts +2 -0
  171. package/dist/types/naylence/fame/grants/index.d.ts.map +1 -1
  172. package/dist/types/naylence/fame/grants/inpage-connection-grant.d.ts +25 -0
  173. package/dist/types/naylence/fame/grants/inpage-connection-grant.d.ts.map +1 -0
  174. package/dist/types/naylence/fame/node/admission/admission-profile-factory.d.ts.map +1 -1
  175. package/dist/types/naylence/fame/node/envelope-listener-manager.d.ts.map +1 -1
  176. package/dist/types/naylence/fame/node/index.d.ts +0 -1
  177. package/dist/types/naylence/fame/node/index.d.ts.map +1 -1
  178. package/dist/types/naylence/fame/node/node.d.ts +0 -1
  179. package/dist/types/naylence/fame/node/node.d.ts.map +1 -1
  180. package/dist/types/naylence/fame/node/upstream-session-manager.d.ts +2 -0
  181. package/dist/types/naylence/fame/node/upstream-session-manager.d.ts.map +1 -1
  182. package/dist/types/naylence/fame/placement/static-node-placement-strategy-factory.d.ts +1 -1
  183. package/dist/types/naylence/fame/placement/static-node-placement-strategy-factory.d.ts.map +1 -1
  184. package/dist/types/naylence/fame/util/bounded-async-queue.d.ts +19 -0
  185. package/dist/types/naylence/fame/util/bounded-async-queue.d.ts.map +1 -0
  186. package/dist/types/node.d.ts +1 -1
  187. package/dist/types/node.d.ts.map +1 -1
  188. package/dist/types/runtime-isomorphic.d.ts +1 -0
  189. package/dist/types/runtime-isomorphic.d.ts.map +1 -1
  190. package/dist/types/version.d.ts +1 -1
  191. package/package.json +13 -2
  192. package/dist/cjs/naylence/fame/node/node-context-stack.js +0 -57
  193. package/dist/cjs/naylence/fame/node/node-context-stack.js.map +0 -1
  194. package/dist/cjs/naylence/fame/placement/websocket-node-placement-strategy-factory.js +0 -66
  195. package/dist/cjs/naylence/fame/placement/websocket-node-placement-strategy-factory.js.map +0 -1
  196. package/dist/cjs/naylence/fame/placement/websocket-node-placement-strategy.js +0 -25
  197. package/dist/cjs/naylence/fame/placement/websocket-node-placement-strategy.js.map +0 -1
  198. package/dist/esm/naylence/fame/node/node-context-stack.js +0 -50
  199. package/dist/esm/naylence/fame/node/node-context-stack.js.map +0 -1
  200. package/dist/esm/naylence/fame/placement/websocket-node-placement-strategy-factory.js +0 -62
  201. package/dist/esm/naylence/fame/placement/websocket-node-placement-strategy-factory.js.map +0 -1
  202. package/dist/esm/naylence/fame/placement/websocket-node-placement-strategy.js +0 -21
  203. package/dist/esm/naylence/fame/placement/websocket-node-placement-strategy.js.map +0 -1
  204. package/dist/types/naylence/fame/node/node-context-stack.d.ts +0 -7
  205. package/dist/types/naylence/fame/node/node-context-stack.d.ts.map +0 -1
  206. package/dist/types/naylence/fame/placement/websocket-node-placement-strategy-factory.d.ts +0 -18
  207. package/dist/types/naylence/fame/placement/websocket-node-placement-strategy-factory.d.ts.map +0 -1
  208. package/dist/types/naylence/fame/placement/websocket-node-placement-strategy.d.ts +0 -15
  209. package/dist/types/naylence/fame/placement/websocket-node-placement-strategy.d.ts.map +0 -1
@@ -0,0 +1,418 @@
1
+ import { DeliveryOriginType, FameChannelMessage, FameResponseType, deserializeEnvelope, } from '@naylence/core';
2
+ import { TransportListener } from './transport-listener.js';
3
+ import { getLogger } from '../util/logging.js';
4
+ import { GRANT_PURPOSE_NODE_ATTACH } from '../grants/grant.js';
5
+ import { INPAGE_CONNECTOR_TYPE } from './inpage-connector.js';
6
+ import { GrantSelectionContext, defaultGrantSelectionPolicy, } from './grant-selection-policy.js';
7
+ import { INPAGE_CONNECTION_GRANT_TYPE, inPageGrantToConnectorConfig, } from '../grants/inpage-connection-grant.js';
8
+ import { QueueFullError } from '../util/bounded-async-queue.js';
9
+ const logger = getLogger('naylence.fame.connector.inpage_listener');
10
+ const DEFAULT_CHANNEL = 'naylence-fabric';
11
+ const DEFAULT_INBOX_CAPACITY = 2048;
12
+ const isBrowserEnvironment = () => typeof window !== 'undefined' &&
13
+ typeof document !== 'undefined' &&
14
+ typeof EventTarget !== 'undefined' &&
15
+ typeof MessageEvent !== 'undefined';
16
+ const ensureBrowserEnvironment = () => {
17
+ if (!isBrowserEnvironment()) {
18
+ throw new Error('InPageListener is browser-only and requires DOM EventTarget support');
19
+ }
20
+ };
21
+ let _lastInPageListenerInstance = null;
22
+ const getSharedBus = () => {
23
+ ensureBrowserEnvironment();
24
+ const globalWithBus = globalThis;
25
+ if (!globalWithBus.__naylence_inpage_bus__) {
26
+ globalWithBus.__naylence_inpage_bus__ = new EventTarget();
27
+ }
28
+ return globalWithBus.__naylence_inpage_bus__;
29
+ };
30
+ const coercePayload = (raw) => {
31
+ if (raw instanceof Uint8Array) {
32
+ return raw;
33
+ }
34
+ if (raw instanceof ArrayBuffer) {
35
+ return new Uint8Array(raw);
36
+ }
37
+ if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(raw)) {
38
+ const view = raw;
39
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
40
+ }
41
+ if (raw && typeof raw === 'object') {
42
+ const candidate = raw;
43
+ if (candidate.constructor?.name === 'Uint8Array') {
44
+ const view = raw;
45
+ return new Uint8Array(view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength));
46
+ }
47
+ }
48
+ if (Array.isArray(raw) && raw.every((item) => typeof item === 'number')) {
49
+ return Uint8Array.from(raw);
50
+ }
51
+ return null;
52
+ };
53
+ const isRoutingNodeLike = (node) => typeof node.createOriginConnector === 'function';
54
+ export class InPageListener extends TransportListener {
55
+ constructor(options) {
56
+ super();
57
+ this._isRunning = false;
58
+ this._initialized = false;
59
+ this._routingNode = null;
60
+ this._bus = null;
61
+ this._busHandler = null;
62
+ this._senderRegistry = new Map();
63
+ this._systemToSender = new Map();
64
+ this._pendingAttachments = new Map();
65
+ ensureBrowserEnvironment();
66
+ const channelCandidate = options?.channelName;
67
+ const inboxCandidate = options?.inboxCapacity;
68
+ this._channelName =
69
+ typeof channelCandidate === 'string' && channelCandidate.trim().length > 0
70
+ ? channelCandidate.trim()
71
+ : DEFAULT_CHANNEL;
72
+ const normalizedCapacity = typeof inboxCandidate === 'number' && Number.isFinite(inboxCandidate) && inboxCandidate > 0
73
+ ? Math.floor(inboxCandidate)
74
+ : DEFAULT_INBOX_CAPACITY;
75
+ this._inboxCapacity = normalizedCapacity;
76
+ _lastInPageListenerInstance = this;
77
+ }
78
+ get channelName() {
79
+ return this._channelName;
80
+ }
81
+ get inboxCapacity() {
82
+ return this._inboxCapacity;
83
+ }
84
+ get isRunning() {
85
+ return this._isRunning;
86
+ }
87
+ get initialized() {
88
+ return this._initialized;
89
+ }
90
+ async onNodeInitialized(node) {
91
+ ensureBrowserEnvironment();
92
+ if (this._initialized) {
93
+ return;
94
+ }
95
+ this._routingNode = isRoutingNodeLike(node) ? node : null;
96
+ this._initialized = true;
97
+ logger.debug('inpage_listener_initialized', {
98
+ channel: this._channelName,
99
+ inbox_capacity: this._inboxCapacity,
100
+ routing_capable: Boolean(this._routingNode),
101
+ });
102
+ }
103
+ async onNodeStarted(node) {
104
+ ensureBrowserEnvironment();
105
+ if (this._isRunning) {
106
+ return;
107
+ }
108
+ if (!this._routingNode && isRoutingNodeLike(node)) {
109
+ this._routingNode = node;
110
+ }
111
+ if (this._routingNode) {
112
+ this._registerBusListener();
113
+ }
114
+ else {
115
+ logger.warning('inpage_listener_missing_routing_capability');
116
+ }
117
+ this._isRunning = true;
118
+ logger.debug('inpage_listener_started', {
119
+ channel: this._channelName,
120
+ });
121
+ }
122
+ async onNodeStopped(_node) {
123
+ if (!this._isRunning) {
124
+ return;
125
+ }
126
+ this._isRunning = false;
127
+ this._unregisterBusListener();
128
+ this._senderRegistry.clear();
129
+ this._systemToSender.clear();
130
+ this._pendingAttachments.clear();
131
+ logger.debug('inpage_listener_stopped', {
132
+ channel: this._channelName,
133
+ });
134
+ }
135
+ getCallbackGrant() {
136
+ return this.withLegacySnakeCaseKeys({
137
+ type: INPAGE_CONNECTION_GRANT_TYPE,
138
+ purpose: GRANT_PURPOSE_NODE_ATTACH,
139
+ channelName: this._channelName,
140
+ inboxCapacity: this._inboxCapacity,
141
+ });
142
+ }
143
+ asCallbackGrant() {
144
+ return this.withLegacySnakeCaseKeys({
145
+ type: INPAGE_CONNECTOR_TYPE,
146
+ channelName: this._channelName,
147
+ inboxCapacity: this._inboxCapacity,
148
+ });
149
+ }
150
+ _registerBusListener() {
151
+ if (this._busHandler) {
152
+ return;
153
+ }
154
+ const handler = (event) => {
155
+ void this._handleBusEvent(event);
156
+ };
157
+ const bus = getSharedBus();
158
+ bus.addEventListener(this._channelName, handler);
159
+ this._bus = bus;
160
+ this._busHandler = handler;
161
+ }
162
+ _unregisterBusListener() {
163
+ if (!this._bus || !this._busHandler) {
164
+ return;
165
+ }
166
+ this._bus.removeEventListener(this._channelName, this._busHandler);
167
+ this._bus = null;
168
+ this._busHandler = null;
169
+ }
170
+ async _handleBusEvent(event) {
171
+ if (!this._routingNode) {
172
+ return;
173
+ }
174
+ const normalized = this._parseBusEvent(event);
175
+ if (!normalized) {
176
+ return;
177
+ }
178
+ const { senderId, envelope } = normalized;
179
+ if (this._isNodeAttachFrame(envelope.frame)) {
180
+ await this._handleAttachFrame(senderId, envelope);
181
+ return;
182
+ }
183
+ const entry = this._senderRegistry.get(senderId);
184
+ if (!entry) {
185
+ logger.debug('inpage_listener_no_connector_for_sender', {
186
+ sender_id: senderId,
187
+ frame_type: envelope.frame?.type ?? 'unknown',
188
+ });
189
+ return;
190
+ }
191
+ await this._deliverEnvelope(entry, envelope);
192
+ }
193
+ _parseBusEvent(event) {
194
+ if (!event || typeof event !== 'object') {
195
+ return null;
196
+ }
197
+ const messageEvent = event;
198
+ const payloadContainer = messageEvent?.data;
199
+ if (!payloadContainer || typeof payloadContainer !== 'object') {
200
+ return null;
201
+ }
202
+ const record = payloadContainer;
203
+ const senderId = record.senderId;
204
+ if (typeof senderId !== 'string' || senderId.length === 0) {
205
+ return null;
206
+ }
207
+ const payload = coercePayload(record.payload);
208
+ if (!payload) {
209
+ logger.debug('inpage_listener_ignored_event_without_payload', {
210
+ sender_id: senderId,
211
+ });
212
+ return null;
213
+ }
214
+ let envelope;
215
+ try {
216
+ const decoded = new TextDecoder().decode(payload);
217
+ const parsed = JSON.parse(decoded);
218
+ envelope = deserializeEnvelope(parsed);
219
+ }
220
+ catch (error) {
221
+ logger.debug('inpage_listener_envelope_parse_failed', {
222
+ sender_id: senderId,
223
+ error: error instanceof Error ? error.message : String(error),
224
+ });
225
+ return null;
226
+ }
227
+ return { senderId, envelope };
228
+ }
229
+ async _handleAttachFrame(senderId, envelope) {
230
+ const frame = envelope.frame;
231
+ const systemId = frame.systemId;
232
+ if (typeof systemId !== 'string' || systemId.length === 0) {
233
+ logger.warning('inpage_listener_attach_missing_system_id', {
234
+ sender_id: senderId,
235
+ });
236
+ return;
237
+ }
238
+ const normalizedOrigin = frame.originType ?? DeliveryOriginType.DOWNSTREAM;
239
+ const existingEntry = this._senderRegistry.get(senderId);
240
+ if (existingEntry) {
241
+ await this._deliverEnvelope(existingEntry, envelope);
242
+ return;
243
+ }
244
+ const pending = this._pendingAttachments.get(senderId);
245
+ if (pending) {
246
+ await pending.catch(() => null);
247
+ return;
248
+ }
249
+ const creationPromise = this._createConnectorForAttach({
250
+ senderId,
251
+ frame,
252
+ envelope,
253
+ originType: normalizedOrigin,
254
+ });
255
+ this._pendingAttachments.set(senderId, creationPromise);
256
+ const entry = await creationPromise.catch(() => null);
257
+ this._pendingAttachments.delete(senderId);
258
+ if (!entry) {
259
+ return;
260
+ }
261
+ this._senderRegistry.set(senderId, entry);
262
+ this._systemToSender.set(entry.systemId, senderId);
263
+ await this._deliverEnvelope(entry, envelope);
264
+ }
265
+ async _createConnectorForAttach(params) {
266
+ const routingNode = this._routingNode;
267
+ if (!routingNode) {
268
+ return null;
269
+ }
270
+ const { frame, originType } = params;
271
+ const systemId = frame.systemId;
272
+ let connectorConfig = null;
273
+ try {
274
+ const selectionContext = new GrantSelectionContext({
275
+ childId: systemId,
276
+ attachFrame: frame,
277
+ callbackGrantType: INPAGE_CONNECTION_GRANT_TYPE,
278
+ node: routingNode,
279
+ });
280
+ const selection = defaultGrantSelectionPolicy.selectCallbackGrant(selectionContext);
281
+ connectorConfig = this._grantToConnectorConfig(selection.grant);
282
+ }
283
+ catch (error) {
284
+ logger.debug('inpage_listener_grant_selection_failed', {
285
+ sender_id: params.senderId,
286
+ system_id: systemId,
287
+ error: error instanceof Error ? error.message : String(error),
288
+ });
289
+ connectorConfig =
290
+ this._extractInPageConnectorConfig(frame) ??
291
+ {
292
+ type: INPAGE_CONNECTOR_TYPE,
293
+ channelName: this._channelName,
294
+ inboxCapacity: this._inboxCapacity,
295
+ };
296
+ }
297
+ try {
298
+ const connector = await routingNode.createOriginConnector({
299
+ originType,
300
+ systemId,
301
+ connectorConfig,
302
+ });
303
+ this._monitorConnectorLifecycle(params.senderId, systemId, connector);
304
+ logger.debug('inpage_listener_created_connector', {
305
+ sender_id: params.senderId,
306
+ system_id: systemId,
307
+ origin_type: originType,
308
+ connector_type: connector.constructor?.name ?? 'unknown',
309
+ });
310
+ return { connector, systemId, originType };
311
+ }
312
+ catch (error) {
313
+ logger.error('inpage_listener_connector_creation_failed', {
314
+ sender_id: params.senderId,
315
+ system_id: systemId,
316
+ error: error instanceof Error ? error.message : String(error),
317
+ });
318
+ return null;
319
+ }
320
+ }
321
+ _extractInPageConnectorConfig(frame) {
322
+ const rawGrants = frame.callbackGrants;
323
+ if (!Array.isArray(rawGrants)) {
324
+ return null;
325
+ }
326
+ for (const grant of rawGrants) {
327
+ if (grant &&
328
+ typeof grant === 'object' &&
329
+ (grant.type === INPAGE_CONNECTION_GRANT_TYPE ||
330
+ grant.type === INPAGE_CONNECTOR_TYPE)) {
331
+ try {
332
+ return inPageGrantToConnectorConfig(grant);
333
+ }
334
+ catch (error) {
335
+ logger.debug('inpage_listener_grant_normalization_failed', {
336
+ error: error instanceof Error ? error.message : String(error),
337
+ });
338
+ }
339
+ }
340
+ }
341
+ return null;
342
+ }
343
+ _grantToConnectorConfig(grant) {
344
+ if (grant.type === INPAGE_CONNECTION_GRANT_TYPE) {
345
+ return inPageGrantToConnectorConfig(grant);
346
+ }
347
+ if (typeof grant?.toConnectorConfig === 'function') {
348
+ return grant.toConnectorConfig();
349
+ }
350
+ throw new Error(`Unsupported grant type: ${grant.type}`);
351
+ }
352
+ _monitorConnectorLifecycle(senderId, systemId, connector) {
353
+ const maybeClosable = connector;
354
+ if (typeof maybeClosable.waitUntilClosed !== 'function') {
355
+ return;
356
+ }
357
+ void maybeClosable
358
+ .waitUntilClosed()
359
+ .then(() => {
360
+ this._senderRegistry.delete(senderId);
361
+ if (this._systemToSender.get(systemId) === senderId) {
362
+ this._systemToSender.delete(systemId);
363
+ }
364
+ })
365
+ .catch((error) => {
366
+ logger.debug('inpage_listener_wait_until_closed_failed', {
367
+ sender_id: senderId,
368
+ system_id: systemId,
369
+ error: error instanceof Error ? error.message : String(error),
370
+ });
371
+ this._senderRegistry.delete(senderId);
372
+ if (this._systemToSender.get(systemId) === senderId) {
373
+ this._systemToSender.delete(systemId);
374
+ }
375
+ });
376
+ }
377
+ async _deliverEnvelope(entry, envelope) {
378
+ const message = this._buildChannelMessage({
379
+ envelope,
380
+ connector: entry.connector,
381
+ originType: entry.originType,
382
+ systemId: entry.systemId,
383
+ });
384
+ try {
385
+ await entry.connector.pushToReceive(message);
386
+ }
387
+ catch (error) {
388
+ if (error instanceof QueueFullError) {
389
+ logger.warning('inpage_listener_receive_queue_full', {
390
+ system_id: entry.systemId,
391
+ });
392
+ return;
393
+ }
394
+ logger.error('inpage_listener_push_failed', {
395
+ system_id: entry.systemId,
396
+ error: error instanceof Error ? error.message : String(error),
397
+ });
398
+ }
399
+ }
400
+ _buildChannelMessage(params) {
401
+ const context = {
402
+ originType: params.originType,
403
+ fromConnector: params.connector,
404
+ fromSystemId: params.systemId,
405
+ expectedResponseType: FameResponseType.NONE,
406
+ };
407
+ return new FameChannelMessage(params.envelope, context);
408
+ }
409
+ _isNodeAttachFrame(frame) {
410
+ return Boolean(frame &&
411
+ typeof frame === 'object' &&
412
+ frame.type === 'NodeAttach');
413
+ }
414
+ }
415
+ export function getInPageListenerInstance() {
416
+ return _lastInPageListenerInstance;
417
+ }
418
+ //# sourceMappingURL=inpage-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inpage-listener.js","sourceRoot":"","sources":["../../../../../src/naylence/fame/connector/inpage-listener.ts"],"names":[],"mappings":"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"}
@@ -145,6 +145,13 @@ export class DefaultDeliveryTracker extends TaskSpawner {
145
145
  this.replyFutures = new Map();
146
146
  this.ackDoneSince = new Map();
147
147
  this.replyDoneSince = new Map();
148
+ this.pendingAckDispatches = new Set();
149
+ this.recentlyHandled = new Map();
150
+ this.recentlyHandledOrder = [];
151
+ this.recentlyHandledTtlMs = 60000;
152
+ this.isPreparingToStop = false;
153
+ this.shutdownRequestedAtMs = null;
154
+ this.shutdownRetryGraceMs = 1000;
148
155
  this.futuresSweeper = null;
149
156
  this.streamQueues = new Map();
150
157
  this.streamDone = new Map();
@@ -171,6 +178,8 @@ export class DefaultDeliveryTracker extends TaskSpawner {
171
178
  }
172
179
  async onNodeStarted(node) {
173
180
  this.node = node;
181
+ this.isPreparingToStop = false;
182
+ this.shutdownRequestedAtMs = null;
174
183
  if (!this.futuresSweeper) {
175
184
  this.shutdownSignal = createDeferred();
176
185
  this.futuresSweeper = this.spawn((signal) => this.sweepFuturesLoop(signal), {
@@ -180,9 +189,14 @@ export class DefaultDeliveryTracker extends TaskSpawner {
180
189
  await this.recoverPending();
181
190
  }
182
191
  async onNodePreparingToStop(_node) {
192
+ this.isPreparingToStop = true;
193
+ this.shutdownRequestedAtMs = Date.now();
194
+ await this.waitForPendingAckDispatches();
183
195
  await this.waitForPendingAcks();
184
196
  }
185
197
  async onNodeStopped(_node) {
198
+ this.isPreparingToStop = false;
199
+ this.shutdownRequestedAtMs = null;
186
200
  await this.cleanup();
187
201
  await this.shutdownTasks();
188
202
  }
@@ -370,6 +384,22 @@ export class DefaultDeliveryTracker extends TaskSpawner {
370
384
  }
371
385
  }
372
386
  else {
387
+ const wasRecentlyHandled = await this.lock.runExclusive(async () => this.wasRecentlyHandled(envelope.id));
388
+ if (wasRecentlyHandled) {
389
+ logger.debug('tracker_duplicate_envelope_recently_handled', {
390
+ envp_id: envelope.id,
391
+ });
392
+ return new TrackedEnvelope({
393
+ timeoutAtMs: 0,
394
+ overallTimeoutAtMs: 0,
395
+ expectedResponseType: envelope.rtype ?? FameResponseType.NONE,
396
+ createdAtMs: Date.now(),
397
+ status: EnvelopeStatus.HANDLED,
398
+ mailboxType: MailboxType.INBOX,
399
+ originalEnvelope: envelope,
400
+ serviceName: inboxName,
401
+ });
402
+ }
373
403
  tracked = new TrackedEnvelope({
374
404
  timeoutAtMs: 0,
375
405
  overallTimeoutAtMs: 0,
@@ -392,6 +422,11 @@ export class DefaultDeliveryTracker extends TaskSpawner {
392
422
  const inbox = this.ensureInbox();
393
423
  envelope.status = EnvelopeStatus.HANDLED;
394
424
  await inbox.delete(envelope.originalEnvelope.id);
425
+ await this.lock.runExclusive(async () => {
426
+ this.markRecentlyHandled(envelope.originalEnvelope.id);
427
+ });
428
+ // Preserve handled envelope to prevent duplicate redelivery during shutdown drains.
429
+ // await inbox.set(envelope.originalEnvelope.id, envelope);
395
430
  }
396
431
  async onEnvelopeHandleFailed(inboxName, envelope, context, error, isFinalFailure = false) {
397
432
  void context;
@@ -448,11 +483,30 @@ export class DefaultDeliveryTracker extends TaskSpawner {
448
483
  throw new Error('Ack frame must include refId');
449
484
  }
450
485
  const outbox = this.ensureOutbox();
451
- const tracked = await outbox.get(envelope.frame.refId);
486
+ const refId = envelope.frame.refId;
487
+ const tracked = await outbox.get(refId);
452
488
  if (!tracked) {
489
+ let handledViaFuture = false;
490
+ await this.lock.runExclusive(async () => {
491
+ const pendingFuture = this.ackFutures.get(refId);
492
+ if (pendingFuture && !pendingFuture.done && pendingFuture.resolve) {
493
+ pendingFuture.resolve(envelope);
494
+ handledViaFuture = true;
495
+ }
496
+ });
497
+ if (handledViaFuture) {
498
+ await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
499
+ await this.clearTimer(refId);
500
+ logger.debug('tracker_ack_resolved_without_tracked_envelope', {
501
+ envp_id: envelope.id,
502
+ ref_id: refId,
503
+ corr_id: envelope.corrId,
504
+ });
505
+ return;
506
+ }
453
507
  logger.debug('tracker_ack_for_unknown_envelope', {
454
508
  envp_id: envelope.id,
455
- ref_id: envelope.frame.refId,
509
+ ref_id: refId,
456
510
  corr_id: envelope.corrId,
457
511
  });
458
512
  return;
@@ -743,6 +797,8 @@ export class DefaultDeliveryTracker extends TaskSpawner {
743
797
  }
744
798
  this.streamDone.clear();
745
799
  this.correlationToEnvelope.clear();
800
+ this.recentlyHandled.clear();
801
+ this.recentlyHandledOrder.length = 0;
746
802
  return values;
747
803
  });
748
804
  for (const timer of timers) {
@@ -821,14 +877,14 @@ export class DefaultDeliveryTracker extends TaskSpawner {
821
877
  const pending = [];
822
878
  await this.lock.runExclusive(async () => {
823
879
  for (const [envelopeId, future] of this.ackFutures.entries()) {
824
- if (future.promise && typeof future.promise.then === 'function') {
825
- const isDone = await Promise.race([
826
- future.promise.then(() => true, () => true),
827
- Promise.resolve(false),
828
- ]);
829
- if (!isDone) {
830
- pending.push({ envelopeId, future });
831
- }
880
+ if (!future || typeof future.promise?.then !== 'function') {
881
+ continue;
882
+ }
883
+ if (!future.done) {
884
+ logger.debug('tracker_pending_ack_future_detected', {
885
+ envelope_id: envelopeId,
886
+ });
887
+ pending.push({ envelopeId, future });
832
888
  }
833
889
  }
834
890
  });
@@ -881,6 +937,15 @@ export class DefaultDeliveryTracker extends TaskSpawner {
881
937
  }
882
938
  logger.debug('tracker_finished_waiting_for_pending_acks');
883
939
  }
940
+ async waitForPendingAckDispatches() {
941
+ while (this.pendingAckDispatches.size > 0) {
942
+ const pending = Array.from(this.pendingAckDispatches);
943
+ await Promise.allSettled(pending);
944
+ for (const promise of pending) {
945
+ this.pendingAckDispatches.delete(promise);
946
+ }
947
+ }
948
+ }
884
949
  async scheduleTimer(tracked, retryPolicy, retryHandler) {
885
950
  const outbox = this.ensureOutbox();
886
951
  const node = this.node;
@@ -935,6 +1000,18 @@ export class DefaultDeliveryTracker extends TaskSpawner {
935
1000
  }
936
1001
  if (retryPolicy &&
937
1002
  currentTracked.attempt < retryPolicy.maxRetries) {
1003
+ const shutdownDeferMs = this.getShutdownRetryDeferDelay(currentNowMs);
1004
+ if (shutdownDeferMs !== null) {
1005
+ const nextTimeoutAt = Math.min(currentTracked.overallTimeoutAtMs, currentNowMs + shutdownDeferMs);
1006
+ currentTracked.timeoutAtMs = nextTimeoutAt;
1007
+ await outbox.set(tracked.originalEnvelope.id, currentTracked);
1008
+ await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
1009
+ logger.debug('tracker_retry_deferred_during_shutdown', {
1010
+ envp_id: tracked.originalEnvelope.id,
1011
+ defer_ms: shutdownDeferMs,
1012
+ });
1013
+ return;
1014
+ }
938
1015
  currentTracked.attempt += 1;
939
1016
  const nextDelayMs = retryPolicy.nextDelayMs(currentTracked.attempt);
940
1017
  const nextRetryTime = currentNowMs + nextDelayMs;
@@ -1285,7 +1362,66 @@ export class DefaultDeliveryTracker extends TaskSpawner {
1285
1362
  corrId: envelope.corrId,
1286
1363
  traceId: envelope.traceId ?? undefined,
1287
1364
  });
1288
- await node.send(ackEnvelope);
1365
+ const ackDispatch = node
1366
+ .send(ackEnvelope)
1367
+ .then(() => undefined)
1368
+ .catch((error) => {
1369
+ logger.error('tracker_ack_dispatch_failed', {
1370
+ envp_id: envelope.id,
1371
+ error: error instanceof Error ? error.message : String(error),
1372
+ });
1373
+ throw error;
1374
+ });
1375
+ this.pendingAckDispatches.add(ackDispatch);
1376
+ try {
1377
+ await ackDispatch;
1378
+ }
1379
+ finally {
1380
+ this.pendingAckDispatches.delete(ackDispatch);
1381
+ }
1382
+ }
1383
+ markRecentlyHandled(envelopeId) {
1384
+ const now = Date.now();
1385
+ this.recentlyHandled.set(envelopeId, now);
1386
+ this.recentlyHandledOrder.push(envelopeId);
1387
+ this.trimRecentlyHandled(now);
1388
+ }
1389
+ wasRecentlyHandled(envelopeId) {
1390
+ const now = Date.now();
1391
+ const timestamp = this.recentlyHandled.get(envelopeId);
1392
+ if (timestamp === undefined) {
1393
+ return false;
1394
+ }
1395
+ if (now - timestamp > this.recentlyHandledTtlMs) {
1396
+ this.recentlyHandled.delete(envelopeId);
1397
+ return false;
1398
+ }
1399
+ return true;
1400
+ }
1401
+ trimRecentlyHandled(now) {
1402
+ while (this.recentlyHandledOrder.length > 0) {
1403
+ const candidate = this.recentlyHandledOrder[0];
1404
+ const timestamp = this.recentlyHandled.get(candidate);
1405
+ if (timestamp === undefined) {
1406
+ this.recentlyHandledOrder.shift();
1407
+ continue;
1408
+ }
1409
+ if (now - timestamp <= this.recentlyHandledTtlMs) {
1410
+ break;
1411
+ }
1412
+ this.recentlyHandled.delete(candidate);
1413
+ this.recentlyHandledOrder.shift();
1414
+ }
1415
+ }
1416
+ getShutdownRetryDeferDelay(nowMs) {
1417
+ if (!this.isPreparingToStop || this.shutdownRequestedAtMs === null) {
1418
+ return null;
1419
+ }
1420
+ const elapsed = nowMs - this.shutdownRequestedAtMs;
1421
+ if (elapsed >= this.shutdownRetryGraceMs) {
1422
+ return null;
1423
+ }
1424
+ return Math.max(0, this.shutdownRetryGraceMs - elapsed);
1289
1425
  }
1290
1426
  }
1291
1427
  //# sourceMappingURL=default-delivery-tracker.js.map