@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,423 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InPageListener = void 0;
4
+ exports.getInPageListenerInstance = getInPageListenerInstance;
5
+ const core_1 = require("@naylence/core");
6
+ const transport_listener_js_1 = require("./transport-listener.js");
7
+ const logging_js_1 = require("../util/logging.js");
8
+ const grant_js_1 = require("../grants/grant.js");
9
+ const inpage_connector_js_1 = require("./inpage-connector.js");
10
+ const grant_selection_policy_js_1 = require("./grant-selection-policy.js");
11
+ const inpage_connection_grant_js_1 = require("../grants/inpage-connection-grant.js");
12
+ const bounded_async_queue_js_1 = require("../util/bounded-async-queue.js");
13
+ const logger = (0, logging_js_1.getLogger)('naylence.fame.connector.inpage_listener');
14
+ const DEFAULT_CHANNEL = 'naylence-fabric';
15
+ const DEFAULT_INBOX_CAPACITY = 2048;
16
+ const isBrowserEnvironment = () => typeof window !== 'undefined' &&
17
+ typeof document !== 'undefined' &&
18
+ typeof EventTarget !== 'undefined' &&
19
+ typeof MessageEvent !== 'undefined';
20
+ const ensureBrowserEnvironment = () => {
21
+ if (!isBrowserEnvironment()) {
22
+ throw new Error('InPageListener is browser-only and requires DOM EventTarget support');
23
+ }
24
+ };
25
+ let _lastInPageListenerInstance = null;
26
+ const getSharedBus = () => {
27
+ ensureBrowserEnvironment();
28
+ const globalWithBus = globalThis;
29
+ if (!globalWithBus.__naylence_inpage_bus__) {
30
+ globalWithBus.__naylence_inpage_bus__ = new EventTarget();
31
+ }
32
+ return globalWithBus.__naylence_inpage_bus__;
33
+ };
34
+ const coercePayload = (raw) => {
35
+ if (raw instanceof Uint8Array) {
36
+ return raw;
37
+ }
38
+ if (raw instanceof ArrayBuffer) {
39
+ return new Uint8Array(raw);
40
+ }
41
+ if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(raw)) {
42
+ const view = raw;
43
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
44
+ }
45
+ if (raw && typeof raw === 'object') {
46
+ const candidate = raw;
47
+ if (candidate.constructor?.name === 'Uint8Array') {
48
+ const view = raw;
49
+ return new Uint8Array(view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength));
50
+ }
51
+ }
52
+ if (Array.isArray(raw) && raw.every((item) => typeof item === 'number')) {
53
+ return Uint8Array.from(raw);
54
+ }
55
+ return null;
56
+ };
57
+ const isRoutingNodeLike = (node) => typeof node.createOriginConnector === 'function';
58
+ class InPageListener extends transport_listener_js_1.TransportListener {
59
+ constructor(options) {
60
+ super();
61
+ this._isRunning = false;
62
+ this._initialized = false;
63
+ this._routingNode = null;
64
+ this._bus = null;
65
+ this._busHandler = null;
66
+ this._senderRegistry = new Map();
67
+ this._systemToSender = new Map();
68
+ this._pendingAttachments = new Map();
69
+ ensureBrowserEnvironment();
70
+ const channelCandidate = options?.channelName;
71
+ const inboxCandidate = options?.inboxCapacity;
72
+ this._channelName =
73
+ typeof channelCandidate === 'string' && channelCandidate.trim().length > 0
74
+ ? channelCandidate.trim()
75
+ : DEFAULT_CHANNEL;
76
+ const normalizedCapacity = typeof inboxCandidate === 'number' && Number.isFinite(inboxCandidate) && inboxCandidate > 0
77
+ ? Math.floor(inboxCandidate)
78
+ : DEFAULT_INBOX_CAPACITY;
79
+ this._inboxCapacity = normalizedCapacity;
80
+ _lastInPageListenerInstance = this;
81
+ }
82
+ get channelName() {
83
+ return this._channelName;
84
+ }
85
+ get inboxCapacity() {
86
+ return this._inboxCapacity;
87
+ }
88
+ get isRunning() {
89
+ return this._isRunning;
90
+ }
91
+ get initialized() {
92
+ return this._initialized;
93
+ }
94
+ async onNodeInitialized(node) {
95
+ ensureBrowserEnvironment();
96
+ if (this._initialized) {
97
+ return;
98
+ }
99
+ this._routingNode = isRoutingNodeLike(node) ? node : null;
100
+ this._initialized = true;
101
+ logger.debug('inpage_listener_initialized', {
102
+ channel: this._channelName,
103
+ inbox_capacity: this._inboxCapacity,
104
+ routing_capable: Boolean(this._routingNode),
105
+ });
106
+ }
107
+ async onNodeStarted(node) {
108
+ ensureBrowserEnvironment();
109
+ if (this._isRunning) {
110
+ return;
111
+ }
112
+ if (!this._routingNode && isRoutingNodeLike(node)) {
113
+ this._routingNode = node;
114
+ }
115
+ if (this._routingNode) {
116
+ this._registerBusListener();
117
+ }
118
+ else {
119
+ logger.warning('inpage_listener_missing_routing_capability');
120
+ }
121
+ this._isRunning = true;
122
+ logger.debug('inpage_listener_started', {
123
+ channel: this._channelName,
124
+ });
125
+ }
126
+ async onNodeStopped(_node) {
127
+ if (!this._isRunning) {
128
+ return;
129
+ }
130
+ this._isRunning = false;
131
+ this._unregisterBusListener();
132
+ this._senderRegistry.clear();
133
+ this._systemToSender.clear();
134
+ this._pendingAttachments.clear();
135
+ logger.debug('inpage_listener_stopped', {
136
+ channel: this._channelName,
137
+ });
138
+ }
139
+ getCallbackGrant() {
140
+ return this.withLegacySnakeCaseKeys({
141
+ type: inpage_connection_grant_js_1.INPAGE_CONNECTION_GRANT_TYPE,
142
+ purpose: grant_js_1.GRANT_PURPOSE_NODE_ATTACH,
143
+ channelName: this._channelName,
144
+ inboxCapacity: this._inboxCapacity,
145
+ });
146
+ }
147
+ asCallbackGrant() {
148
+ return this.withLegacySnakeCaseKeys({
149
+ type: inpage_connector_js_1.INPAGE_CONNECTOR_TYPE,
150
+ channelName: this._channelName,
151
+ inboxCapacity: this._inboxCapacity,
152
+ });
153
+ }
154
+ _registerBusListener() {
155
+ if (this._busHandler) {
156
+ return;
157
+ }
158
+ const handler = (event) => {
159
+ void this._handleBusEvent(event);
160
+ };
161
+ const bus = getSharedBus();
162
+ bus.addEventListener(this._channelName, handler);
163
+ this._bus = bus;
164
+ this._busHandler = handler;
165
+ }
166
+ _unregisterBusListener() {
167
+ if (!this._bus || !this._busHandler) {
168
+ return;
169
+ }
170
+ this._bus.removeEventListener(this._channelName, this._busHandler);
171
+ this._bus = null;
172
+ this._busHandler = null;
173
+ }
174
+ async _handleBusEvent(event) {
175
+ if (!this._routingNode) {
176
+ return;
177
+ }
178
+ const normalized = this._parseBusEvent(event);
179
+ if (!normalized) {
180
+ return;
181
+ }
182
+ const { senderId, envelope } = normalized;
183
+ if (this._isNodeAttachFrame(envelope.frame)) {
184
+ await this._handleAttachFrame(senderId, envelope);
185
+ return;
186
+ }
187
+ const entry = this._senderRegistry.get(senderId);
188
+ if (!entry) {
189
+ logger.debug('inpage_listener_no_connector_for_sender', {
190
+ sender_id: senderId,
191
+ frame_type: envelope.frame?.type ?? 'unknown',
192
+ });
193
+ return;
194
+ }
195
+ await this._deliverEnvelope(entry, envelope);
196
+ }
197
+ _parseBusEvent(event) {
198
+ if (!event || typeof event !== 'object') {
199
+ return null;
200
+ }
201
+ const messageEvent = event;
202
+ const payloadContainer = messageEvent?.data;
203
+ if (!payloadContainer || typeof payloadContainer !== 'object') {
204
+ return null;
205
+ }
206
+ const record = payloadContainer;
207
+ const senderId = record.senderId;
208
+ if (typeof senderId !== 'string' || senderId.length === 0) {
209
+ return null;
210
+ }
211
+ const payload = coercePayload(record.payload);
212
+ if (!payload) {
213
+ logger.debug('inpage_listener_ignored_event_without_payload', {
214
+ sender_id: senderId,
215
+ });
216
+ return null;
217
+ }
218
+ let envelope;
219
+ try {
220
+ const decoded = new TextDecoder().decode(payload);
221
+ const parsed = JSON.parse(decoded);
222
+ envelope = (0, core_1.deserializeEnvelope)(parsed);
223
+ }
224
+ catch (error) {
225
+ logger.debug('inpage_listener_envelope_parse_failed', {
226
+ sender_id: senderId,
227
+ error: error instanceof Error ? error.message : String(error),
228
+ });
229
+ return null;
230
+ }
231
+ return { senderId, envelope };
232
+ }
233
+ async _handleAttachFrame(senderId, envelope) {
234
+ const frame = envelope.frame;
235
+ const systemId = frame.systemId;
236
+ if (typeof systemId !== 'string' || systemId.length === 0) {
237
+ logger.warning('inpage_listener_attach_missing_system_id', {
238
+ sender_id: senderId,
239
+ });
240
+ return;
241
+ }
242
+ const normalizedOrigin = frame.originType ?? core_1.DeliveryOriginType.DOWNSTREAM;
243
+ const existingEntry = this._senderRegistry.get(senderId);
244
+ if (existingEntry) {
245
+ await this._deliverEnvelope(existingEntry, envelope);
246
+ return;
247
+ }
248
+ const pending = this._pendingAttachments.get(senderId);
249
+ if (pending) {
250
+ await pending.catch(() => null);
251
+ return;
252
+ }
253
+ const creationPromise = this._createConnectorForAttach({
254
+ senderId,
255
+ frame,
256
+ envelope,
257
+ originType: normalizedOrigin,
258
+ });
259
+ this._pendingAttachments.set(senderId, creationPromise);
260
+ const entry = await creationPromise.catch(() => null);
261
+ this._pendingAttachments.delete(senderId);
262
+ if (!entry) {
263
+ return;
264
+ }
265
+ this._senderRegistry.set(senderId, entry);
266
+ this._systemToSender.set(entry.systemId, senderId);
267
+ await this._deliverEnvelope(entry, envelope);
268
+ }
269
+ async _createConnectorForAttach(params) {
270
+ const routingNode = this._routingNode;
271
+ if (!routingNode) {
272
+ return null;
273
+ }
274
+ const { frame, originType } = params;
275
+ const systemId = frame.systemId;
276
+ let connectorConfig = null;
277
+ try {
278
+ const selectionContext = new grant_selection_policy_js_1.GrantSelectionContext({
279
+ childId: systemId,
280
+ attachFrame: frame,
281
+ callbackGrantType: inpage_connection_grant_js_1.INPAGE_CONNECTION_GRANT_TYPE,
282
+ node: routingNode,
283
+ });
284
+ const selection = grant_selection_policy_js_1.defaultGrantSelectionPolicy.selectCallbackGrant(selectionContext);
285
+ connectorConfig = this._grantToConnectorConfig(selection.grant);
286
+ }
287
+ catch (error) {
288
+ logger.debug('inpage_listener_grant_selection_failed', {
289
+ sender_id: params.senderId,
290
+ system_id: systemId,
291
+ error: error instanceof Error ? error.message : String(error),
292
+ });
293
+ connectorConfig =
294
+ this._extractInPageConnectorConfig(frame) ??
295
+ {
296
+ type: inpage_connector_js_1.INPAGE_CONNECTOR_TYPE,
297
+ channelName: this._channelName,
298
+ inboxCapacity: this._inboxCapacity,
299
+ };
300
+ }
301
+ try {
302
+ const connector = await routingNode.createOriginConnector({
303
+ originType,
304
+ systemId,
305
+ connectorConfig,
306
+ });
307
+ this._monitorConnectorLifecycle(params.senderId, systemId, connector);
308
+ logger.debug('inpage_listener_created_connector', {
309
+ sender_id: params.senderId,
310
+ system_id: systemId,
311
+ origin_type: originType,
312
+ connector_type: connector.constructor?.name ?? 'unknown',
313
+ });
314
+ return { connector, systemId, originType };
315
+ }
316
+ catch (error) {
317
+ logger.error('inpage_listener_connector_creation_failed', {
318
+ sender_id: params.senderId,
319
+ system_id: systemId,
320
+ error: error instanceof Error ? error.message : String(error),
321
+ });
322
+ return null;
323
+ }
324
+ }
325
+ _extractInPageConnectorConfig(frame) {
326
+ const rawGrants = frame.callbackGrants;
327
+ if (!Array.isArray(rawGrants)) {
328
+ return null;
329
+ }
330
+ for (const grant of rawGrants) {
331
+ if (grant &&
332
+ typeof grant === 'object' &&
333
+ (grant.type === inpage_connection_grant_js_1.INPAGE_CONNECTION_GRANT_TYPE ||
334
+ grant.type === inpage_connector_js_1.INPAGE_CONNECTOR_TYPE)) {
335
+ try {
336
+ return (0, inpage_connection_grant_js_1.inPageGrantToConnectorConfig)(grant);
337
+ }
338
+ catch (error) {
339
+ logger.debug('inpage_listener_grant_normalization_failed', {
340
+ error: error instanceof Error ? error.message : String(error),
341
+ });
342
+ }
343
+ }
344
+ }
345
+ return null;
346
+ }
347
+ _grantToConnectorConfig(grant) {
348
+ if (grant.type === inpage_connection_grant_js_1.INPAGE_CONNECTION_GRANT_TYPE) {
349
+ return (0, inpage_connection_grant_js_1.inPageGrantToConnectorConfig)(grant);
350
+ }
351
+ if (typeof grant?.toConnectorConfig === 'function') {
352
+ return grant.toConnectorConfig();
353
+ }
354
+ throw new Error(`Unsupported grant type: ${grant.type}`);
355
+ }
356
+ _monitorConnectorLifecycle(senderId, systemId, connector) {
357
+ const maybeClosable = connector;
358
+ if (typeof maybeClosable.waitUntilClosed !== 'function') {
359
+ return;
360
+ }
361
+ void maybeClosable
362
+ .waitUntilClosed()
363
+ .then(() => {
364
+ this._senderRegistry.delete(senderId);
365
+ if (this._systemToSender.get(systemId) === senderId) {
366
+ this._systemToSender.delete(systemId);
367
+ }
368
+ })
369
+ .catch((error) => {
370
+ logger.debug('inpage_listener_wait_until_closed_failed', {
371
+ sender_id: senderId,
372
+ system_id: systemId,
373
+ error: error instanceof Error ? error.message : String(error),
374
+ });
375
+ this._senderRegistry.delete(senderId);
376
+ if (this._systemToSender.get(systemId) === senderId) {
377
+ this._systemToSender.delete(systemId);
378
+ }
379
+ });
380
+ }
381
+ async _deliverEnvelope(entry, envelope) {
382
+ const message = this._buildChannelMessage({
383
+ envelope,
384
+ connector: entry.connector,
385
+ originType: entry.originType,
386
+ systemId: entry.systemId,
387
+ });
388
+ try {
389
+ await entry.connector.pushToReceive(message);
390
+ }
391
+ catch (error) {
392
+ if (error instanceof bounded_async_queue_js_1.QueueFullError) {
393
+ logger.warning('inpage_listener_receive_queue_full', {
394
+ system_id: entry.systemId,
395
+ });
396
+ return;
397
+ }
398
+ logger.error('inpage_listener_push_failed', {
399
+ system_id: entry.systemId,
400
+ error: error instanceof Error ? error.message : String(error),
401
+ });
402
+ }
403
+ }
404
+ _buildChannelMessage(params) {
405
+ const context = {
406
+ originType: params.originType,
407
+ fromConnector: params.connector,
408
+ fromSystemId: params.systemId,
409
+ expectedResponseType: core_1.FameResponseType.NONE,
410
+ };
411
+ return new core_1.FameChannelMessage(params.envelope, context);
412
+ }
413
+ _isNodeAttachFrame(frame) {
414
+ return Boolean(frame &&
415
+ typeof frame === 'object' &&
416
+ frame.type === 'NodeAttach');
417
+ }
418
+ }
419
+ exports.InPageListener = InPageListener;
420
+ function getInPageListenerInstance() {
421
+ return _lastInPageListenerInstance;
422
+ }
423
+ //# 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":";;;AAukBA,8DAEC;AAzkBD,yCASwB;AAExB,mEAA4D;AAG5D,mDAA+C;AAC/C,iDAA+D;AAC/D,+DAA8D;AAE9D,2EAGqC;AAErC,qFAI8C;AAC9C,2EAAgE;AAEhE,MAAM,MAAM,GAAG,IAAA,sBAAS,EAAC,yCAAyC,CAAC,CAAC;AAEpE,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,MAAM,oBAAoB,GAAG,GAAY,EAAE,CACzC,OAAO,MAAM,KAAK,WAAW;IAC7B,OAAO,QAAQ,KAAK,WAAW;IAC/B,OAAO,WAAW,KAAK,WAAW;IAClC,OAAO,YAAY,KAAK,WAAW,CAAC;AAEtC,MAAM,wBAAwB,GAAG,GAAS,EAAE;IAC1C,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC,CAAC;AAOF,IAAI,2BAA2B,GAA0B,IAAI,CAAC;AAQ9D,MAAM,YAAY,GAAG,GAAgB,EAAE;IACrC,wBAAwB,EAAE,CAAC;IAE3B,MAAM,aAAa,GAAG,UAErB,CAAC;IAEF,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC;QAC3C,aAAa,CAAC,uBAAuB,GAAG,IAAI,WAAW,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO,aAAa,CAAC,uBAAsC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAY,EAAqB,EAAE;IACxD,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,GAAsB,CAAC;QACpC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,GAA0C,CAAC;QAC7D,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,GAAgD,CAAC;YAC9D,OAAO,IAAI,UAAU,CACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QACxE,OAAO,UAAU,CAAC,IAAI,CAAC,GAAe,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAA2B,EAAE,CACpE,OAAQ,IAAwB,CAAC,qBAAqB,KAAK,UAAU,CAAC;AAExE,MAAa,cAAe,SAAQ,yCAAiB;IAenD,YAAY,OAA+B;QACzC,KAAK,EAAE,CAAC;QAbF,eAAU,GAAG,KAAK,CAAC;QACnB,iBAAY,GAAG,KAAK,CAAC;QACrB,iBAAY,GAA2B,IAAI,CAAC;QAC5C,SAAI,GAAuB,IAAI,CAAC;QAChC,gBAAW,GAAoC,IAAI,CAAC;QAC3C,oBAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;QACpD,oBAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,wBAAmB,GAAG,IAAI,GAAG,EAG3C,CAAC;QAIF,wBAAwB,EAAE,CAAC;QAE3B,MAAM,gBAAgB,GAAG,OAAO,EAAE,WAAW,CAAC;QAC9C,MAAM,cAAc,GAAG,OAAO,EAAE,aAAa,CAAC;QAE9C,IAAI,CAAC,YAAY;YACf,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBACxE,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE;gBACzB,CAAC,CAAC,eAAe,CAAC;QAEtB,MAAM,kBAAkB,GACtB,OAAO,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC;YACzF,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;YAC5B,CAAC,CAAC,sBAAsB,CAAC;QAE7B,IAAI,CAAC,cAAc,GAAG,kBAAkB,CAAC;QAEzC,2BAA2B,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAc;QACpC,wBAAwB,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAc;QAChC,wBAAwB,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACtC,OAAO,EAAE,IAAI,CAAC,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAe;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAEjC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACtC,OAAO,EAAE,IAAI,CAAC,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IAEQ,gBAAgB;QACvB,OAAO,IAAI,CAAC,uBAAuB,CAAC;YAClC,IAAI,EAAE,yDAA4B;YAClC,OAAO,EAAE,oCAAyB;YAClC,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,aAAa,EAAE,IAAI,CAAC,cAAc;SACnC,CAAC,CAAC;IACL,CAAC;IAEQ,eAAe;QACtB,OAAO,IAAI,CAAC,uBAAuB,CAAC;YAClC,IAAI,EAAE,2CAAqB;YAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,aAAa,EAAE,IAAI,CAAC,cAAc;SACnC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;YACrC,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,OAAwB,CAAC,CAAC;QAElE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC3B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,WAA4B,CAClC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,KAAY;QACxC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;QAE1C,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE;gBACtD,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,SAAS;aAC9C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,cAAc,CACpB,KAAY;QAEZ,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,KAA8B,CAAC;QACpD,MAAM,gBAAgB,GAAG,YAAY,EAAE,IAAI,CAAC;QAC5C,IAAI,CAAC,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,gBAA6D,CAAC;QAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;gBAC5D,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,QAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC9D,QAAQ,GAAG,IAAA,0BAAmB,EAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;gBACpD,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,QAAgB,EAChB,QAAsB;QAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAwB,CAAC;QAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,0CAA0C,EAAE;gBACzD,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,IAAI,yBAAkB,CAAC,UAAU,CAAC;QAE3E,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC;YACrD,QAAQ;YACR,KAAK;YACL,QAAQ;YACR,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,MAKvC;QACC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEhC,IAAI,eAAe,GAA2B,IAAI,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,iDAAqB,CAAC;gBACjD,OAAO,EAAE,QAAQ;gBACjB,WAAW,EAAE,KAAK;gBAClB,iBAAiB,EAAE,yDAA4B;gBAC/C,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,SAAS,GACb,uDAA2B,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;YACpE,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE;gBACrD,SAAS,EAAE,MAAM,CAAC,QAAQ;gBAC1B,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YAEH,eAAe;gBACb,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;oBACxC;wBACC,IAAI,EAAE,2CAAqB;wBAC3B,WAAW,EAAE,IAAI,CAAC,YAAY;wBAC9B,aAAa,EAAE,IAAI,CAAC,cAAc;qBACR,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,qBAAqB,CAAC;gBACxD,UAAU;gBACV,QAAQ;gBACR,eAAe;aAChB,CAAC,CAAC;YAEH,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAEtE,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBAChD,SAAS,EAAE,MAAM,CAAC,QAAQ;gBAC1B,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,UAAU;gBACvB,cAAc,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,IAAI,SAAS;aACzD,CAAC,CAAC;YAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;gBACxD,SAAS,EAAE,MAAM,CAAC,QAAQ;gBAC1B,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,6BAA6B,CACnC,KAAsB;QAEtB,MAAM,SAAS,GAAG,KAAK,CAAC,cAEX,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IACE,KAAK;gBACL,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,KAAK,CAAC,IAAI,KAAK,yDAA4B;oBAC1C,KAAK,CAAC,IAAI,KAAK,2CAAqB,CAAC,EACvC,CAAC;gBACD,IAAI,CAAC;oBACH,OAAO,IAAA,yDAA4B,EAAC,KAAK,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;wBACzD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,uBAAuB,CAAC,KAAsB;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,yDAA4B,EAAE,CAAC;YAChD,OAAO,IAAA,yDAA4B,EAAC,KAAkC,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,OAAQ,KAAuD,EAAE,iBAAiB,KAAK,UAAU,EAAE,CAAC;YACtG,OAAQ,KAAsD,CAAC,iBAAiB,EAAE,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,0BAA0B,CAChC,QAAgB,EAChB,QAAgB,EAChB,SAAwB;QAExB,MAAM,aAAa,GAAG,SAErB,CAAC;QAEF,IAAI,OAAO,aAAa,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,KAAK,aAAa;aACf,eAAe,EAAE;aACjB,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACpD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;gBACvD,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACpD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,KAAqB,EACrB,QAAsB;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACxC,QAAQ;YACR,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,uCAAc,EAAE,CAAC;gBACpC,MAAM,CAAC,OAAO,CAAC,oCAAoC,EAAE;oBACnD,SAAS,EAAE,KAAK,CAAC,QAAQ;iBAC1B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC1C,SAAS,EAAE,KAAK,CAAC,QAAQ;gBACzB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,MAK5B;QACC,MAAM,OAAO,GAAwB;YACnC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,aAAa,EAAE,MAAM,CAAC,SAAS;YAC/B,YAAY,EAAE,MAAM,CAAC,QAAQ;YAC7B,oBAAoB,EAAE,uBAAgB,CAAC,IAAI;SAC5C,CAAC;QAEF,OAAO,IAAI,yBAAkB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAEO,kBAAkB,CACxB,KAA4B;QAE5B,OAAO,OAAO,CACZ,KAAK;YACH,OAAO,KAAK,KAAK,QAAQ;YACxB,KAA2B,CAAC,IAAI,KAAK,YAAY,CACrD,CAAC;IACJ,CAAC;CACF;AAzdD,wCAydC;AAED,SAAgB,yBAAyB;IACvC,OAAO,2BAA2B,CAAC;AACrC,CAAC"}
@@ -148,6 +148,13 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
148
148
  this.replyFutures = new Map();
149
149
  this.ackDoneSince = new Map();
150
150
  this.replyDoneSince = new Map();
151
+ this.pendingAckDispatches = new Set();
152
+ this.recentlyHandled = new Map();
153
+ this.recentlyHandledOrder = [];
154
+ this.recentlyHandledTtlMs = 60000;
155
+ this.isPreparingToStop = false;
156
+ this.shutdownRequestedAtMs = null;
157
+ this.shutdownRetryGraceMs = 1000;
151
158
  this.futuresSweeper = null;
152
159
  this.streamQueues = new Map();
153
160
  this.streamDone = new Map();
@@ -174,6 +181,8 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
174
181
  }
175
182
  async onNodeStarted(node) {
176
183
  this.node = node;
184
+ this.isPreparingToStop = false;
185
+ this.shutdownRequestedAtMs = null;
177
186
  if (!this.futuresSweeper) {
178
187
  this.shutdownSignal = createDeferred();
179
188
  this.futuresSweeper = this.spawn((signal) => this.sweepFuturesLoop(signal), {
@@ -183,9 +192,14 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
183
192
  await this.recoverPending();
184
193
  }
185
194
  async onNodePreparingToStop(_node) {
195
+ this.isPreparingToStop = true;
196
+ this.shutdownRequestedAtMs = Date.now();
197
+ await this.waitForPendingAckDispatches();
186
198
  await this.waitForPendingAcks();
187
199
  }
188
200
  async onNodeStopped(_node) {
201
+ this.isPreparingToStop = false;
202
+ this.shutdownRequestedAtMs = null;
189
203
  await this.cleanup();
190
204
  await this.shutdownTasks();
191
205
  }
@@ -373,6 +387,22 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
373
387
  }
374
388
  }
375
389
  else {
390
+ const wasRecentlyHandled = await this.lock.runExclusive(async () => this.wasRecentlyHandled(envelope.id));
391
+ if (wasRecentlyHandled) {
392
+ logger.debug('tracker_duplicate_envelope_recently_handled', {
393
+ envp_id: envelope.id,
394
+ });
395
+ return new tracked_envelope_js_1.TrackedEnvelope({
396
+ timeoutAtMs: 0,
397
+ overallTimeoutAtMs: 0,
398
+ expectedResponseType: envelope.rtype ?? core_1.FameResponseType.NONE,
399
+ createdAtMs: Date.now(),
400
+ status: tracked_envelope_js_1.EnvelopeStatus.HANDLED,
401
+ mailboxType: tracked_envelope_js_1.MailboxType.INBOX,
402
+ originalEnvelope: envelope,
403
+ serviceName: inboxName,
404
+ });
405
+ }
376
406
  tracked = new tracked_envelope_js_1.TrackedEnvelope({
377
407
  timeoutAtMs: 0,
378
408
  overallTimeoutAtMs: 0,
@@ -395,6 +425,11 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
395
425
  const inbox = this.ensureInbox();
396
426
  envelope.status = tracked_envelope_js_1.EnvelopeStatus.HANDLED;
397
427
  await inbox.delete(envelope.originalEnvelope.id);
428
+ await this.lock.runExclusive(async () => {
429
+ this.markRecentlyHandled(envelope.originalEnvelope.id);
430
+ });
431
+ // Preserve handled envelope to prevent duplicate redelivery during shutdown drains.
432
+ // await inbox.set(envelope.originalEnvelope.id, envelope);
398
433
  }
399
434
  async onEnvelopeHandleFailed(inboxName, envelope, context, error, isFinalFailure = false) {
400
435
  void context;
@@ -451,11 +486,30 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
451
486
  throw new Error('Ack frame must include refId');
452
487
  }
453
488
  const outbox = this.ensureOutbox();
454
- const tracked = await outbox.get(envelope.frame.refId);
489
+ const refId = envelope.frame.refId;
490
+ const tracked = await outbox.get(refId);
455
491
  if (!tracked) {
492
+ let handledViaFuture = false;
493
+ await this.lock.runExclusive(async () => {
494
+ const pendingFuture = this.ackFutures.get(refId);
495
+ if (pendingFuture && !pendingFuture.done && pendingFuture.resolve) {
496
+ pendingFuture.resolve(envelope);
497
+ handledViaFuture = true;
498
+ }
499
+ });
500
+ if (handledViaFuture) {
501
+ await this.markDoneSince(this.ackFutures, refId, this.ackDoneSince);
502
+ await this.clearTimer(refId);
503
+ logger.debug('tracker_ack_resolved_without_tracked_envelope', {
504
+ envp_id: envelope.id,
505
+ ref_id: refId,
506
+ corr_id: envelope.corrId,
507
+ });
508
+ return;
509
+ }
456
510
  logger.debug('tracker_ack_for_unknown_envelope', {
457
511
  envp_id: envelope.id,
458
- ref_id: envelope.frame.refId,
512
+ ref_id: refId,
459
513
  corr_id: envelope.corrId,
460
514
  });
461
515
  return;
@@ -746,6 +800,8 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
746
800
  }
747
801
  this.streamDone.clear();
748
802
  this.correlationToEnvelope.clear();
803
+ this.recentlyHandled.clear();
804
+ this.recentlyHandledOrder.length = 0;
749
805
  return values;
750
806
  });
751
807
  for (const timer of timers) {
@@ -824,14 +880,14 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
824
880
  const pending = [];
825
881
  await this.lock.runExclusive(async () => {
826
882
  for (const [envelopeId, future] of this.ackFutures.entries()) {
827
- if (future.promise && typeof future.promise.then === 'function') {
828
- const isDone = await Promise.race([
829
- future.promise.then(() => true, () => true),
830
- Promise.resolve(false),
831
- ]);
832
- if (!isDone) {
833
- pending.push({ envelopeId, future });
834
- }
883
+ if (!future || typeof future.promise?.then !== 'function') {
884
+ continue;
885
+ }
886
+ if (!future.done) {
887
+ logger.debug('tracker_pending_ack_future_detected', {
888
+ envelope_id: envelopeId,
889
+ });
890
+ pending.push({ envelopeId, future });
835
891
  }
836
892
  }
837
893
  });
@@ -884,6 +940,15 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
884
940
  }
885
941
  logger.debug('tracker_finished_waiting_for_pending_acks');
886
942
  }
943
+ async waitForPendingAckDispatches() {
944
+ while (this.pendingAckDispatches.size > 0) {
945
+ const pending = Array.from(this.pendingAckDispatches);
946
+ await Promise.allSettled(pending);
947
+ for (const promise of pending) {
948
+ this.pendingAckDispatches.delete(promise);
949
+ }
950
+ }
951
+ }
887
952
  async scheduleTimer(tracked, retryPolicy, retryHandler) {
888
953
  const outbox = this.ensureOutbox();
889
954
  const node = this.node;
@@ -938,6 +1003,18 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
938
1003
  }
939
1004
  if (retryPolicy &&
940
1005
  currentTracked.attempt < retryPolicy.maxRetries) {
1006
+ const shutdownDeferMs = this.getShutdownRetryDeferDelay(currentNowMs);
1007
+ if (shutdownDeferMs !== null) {
1008
+ const nextTimeoutAt = Math.min(currentTracked.overallTimeoutAtMs, currentNowMs + shutdownDeferMs);
1009
+ currentTracked.timeoutAtMs = nextTimeoutAt;
1010
+ await outbox.set(tracked.originalEnvelope.id, currentTracked);
1011
+ await this.scheduleTimer(currentTracked, retryPolicy, retryHandler);
1012
+ logger.debug('tracker_retry_deferred_during_shutdown', {
1013
+ envp_id: tracked.originalEnvelope.id,
1014
+ defer_ms: shutdownDeferMs,
1015
+ });
1016
+ return;
1017
+ }
941
1018
  currentTracked.attempt += 1;
942
1019
  const nextDelayMs = retryPolicy.nextDelayMs(currentTracked.attempt);
943
1020
  const nextRetryTime = currentNowMs + nextDelayMs;
@@ -1288,7 +1365,66 @@ class DefaultDeliveryTracker extends task_spawner_js_1.TaskSpawner {
1288
1365
  corrId: envelope.corrId,
1289
1366
  traceId: envelope.traceId ?? undefined,
1290
1367
  });
1291
- await node.send(ackEnvelope);
1368
+ const ackDispatch = node
1369
+ .send(ackEnvelope)
1370
+ .then(() => undefined)
1371
+ .catch((error) => {
1372
+ logger.error('tracker_ack_dispatch_failed', {
1373
+ envp_id: envelope.id,
1374
+ error: error instanceof Error ? error.message : String(error),
1375
+ });
1376
+ throw error;
1377
+ });
1378
+ this.pendingAckDispatches.add(ackDispatch);
1379
+ try {
1380
+ await ackDispatch;
1381
+ }
1382
+ finally {
1383
+ this.pendingAckDispatches.delete(ackDispatch);
1384
+ }
1385
+ }
1386
+ markRecentlyHandled(envelopeId) {
1387
+ const now = Date.now();
1388
+ this.recentlyHandled.set(envelopeId, now);
1389
+ this.recentlyHandledOrder.push(envelopeId);
1390
+ this.trimRecentlyHandled(now);
1391
+ }
1392
+ wasRecentlyHandled(envelopeId) {
1393
+ const now = Date.now();
1394
+ const timestamp = this.recentlyHandled.get(envelopeId);
1395
+ if (timestamp === undefined) {
1396
+ return false;
1397
+ }
1398
+ if (now - timestamp > this.recentlyHandledTtlMs) {
1399
+ this.recentlyHandled.delete(envelopeId);
1400
+ return false;
1401
+ }
1402
+ return true;
1403
+ }
1404
+ trimRecentlyHandled(now) {
1405
+ while (this.recentlyHandledOrder.length > 0) {
1406
+ const candidate = this.recentlyHandledOrder[0];
1407
+ const timestamp = this.recentlyHandled.get(candidate);
1408
+ if (timestamp === undefined) {
1409
+ this.recentlyHandledOrder.shift();
1410
+ continue;
1411
+ }
1412
+ if (now - timestamp <= this.recentlyHandledTtlMs) {
1413
+ break;
1414
+ }
1415
+ this.recentlyHandled.delete(candidate);
1416
+ this.recentlyHandledOrder.shift();
1417
+ }
1418
+ }
1419
+ getShutdownRetryDeferDelay(nowMs) {
1420
+ if (!this.isPreparingToStop || this.shutdownRequestedAtMs === null) {
1421
+ return null;
1422
+ }
1423
+ const elapsed = nowMs - this.shutdownRequestedAtMs;
1424
+ if (elapsed >= this.shutdownRetryGraceMs) {
1425
+ return null;
1426
+ }
1427
+ return Math.max(0, this.shutdownRetryGraceMs - elapsed);
1292
1428
  }
1293
1429
  }
1294
1430
  exports.DefaultDeliveryTracker = DefaultDeliveryTracker;