request-iframe 0.1.1 → 0.2.1

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 (208) hide show
  1. package/QUICKSTART.CN.md +4 -2
  2. package/QUICKSTART.md +4 -2
  3. package/README.CN.md +129 -33
  4. package/README.md +116 -15
  5. package/cdn/request-iframe-react.umd.js +3354 -0
  6. package/cdn/request-iframe-react.umd.js.map +1 -0
  7. package/cdn/request-iframe-react.umd.min.js +2 -0
  8. package/cdn/request-iframe-react.umd.min.js.map +1 -0
  9. package/cdn/request-iframe.umd.js +19761 -0
  10. package/cdn/request-iframe.umd.js.map +1 -0
  11. package/cdn/request-iframe.umd.min.js +4 -0
  12. package/cdn/request-iframe.umd.min.js.map +1 -0
  13. package/esm/api/client.js +29 -21
  14. package/esm/api/endpoint.js +229 -0
  15. package/esm/api/server.js +16 -8
  16. package/esm/constants/debug.js +17 -0
  17. package/esm/constants/index.js +84 -67
  18. package/esm/constants/log.js +11 -0
  19. package/esm/constants/messages.js +3 -0
  20. package/esm/constants/warn-once.js +15 -0
  21. package/esm/endpoint/facade.js +390 -0
  22. package/esm/endpoint/heartbeat/heartbeat.js +60 -0
  23. package/esm/endpoint/heartbeat/ping.js +20 -0
  24. package/esm/endpoint/index.js +13 -0
  25. package/esm/endpoint/infra/hub.js +316 -0
  26. package/esm/endpoint/infra/inbox.js +232 -0
  27. package/esm/endpoint/infra/outbox.js +408 -0
  28. package/esm/endpoint/stream/dispatcher.js +58 -0
  29. package/esm/endpoint/stream/errors.js +27 -0
  30. package/esm/endpoint/stream/factory.js +76 -0
  31. package/esm/endpoint/stream/file-auto-resolve.js +34 -0
  32. package/esm/endpoint/stream/file-writable.js +105 -0
  33. package/esm/endpoint/stream/handler.js +26 -0
  34. package/esm/{core → impl}/client.js +240 -317
  35. package/esm/{core → impl}/response.js +113 -155
  36. package/esm/impl/server.js +568 -0
  37. package/esm/index.js +13 -6
  38. package/esm/message/ack.js +27 -0
  39. package/esm/message/channel-cache.js +108 -0
  40. package/esm/message/channel.js +90 -4
  41. package/esm/message/dispatcher.js +115 -75
  42. package/esm/stream/error.js +22 -0
  43. package/esm/stream/index.js +3 -1
  44. package/esm/stream/readable-stream.js +45 -9
  45. package/esm/stream/stream-core.js +7 -2
  46. package/esm/stream/writable-stream.js +97 -26
  47. package/esm/utils/blob.js +16 -0
  48. package/esm/utils/cache.js +25 -76
  49. package/esm/utils/content-type.js +81 -0
  50. package/esm/utils/debug.js +156 -179
  51. package/esm/utils/hooks.js +130 -0
  52. package/esm/utils/id.js +14 -0
  53. package/esm/utils/iframe.js +20 -0
  54. package/esm/utils/index.js +11 -163
  55. package/esm/utils/is.js +3 -0
  56. package/esm/utils/logger.js +55 -0
  57. package/esm/utils/promise.js +3 -0
  58. package/esm/utils/window.js +31 -0
  59. package/library/api/client.d.ts.map +1 -1
  60. package/library/api/client.js +30 -22
  61. package/library/api/endpoint.d.ts +23 -0
  62. package/library/api/endpoint.d.ts.map +1 -0
  63. package/library/api/endpoint.js +235 -0
  64. package/library/api/server.d.ts +4 -1
  65. package/library/api/server.d.ts.map +1 -1
  66. package/library/api/server.js +16 -8
  67. package/library/constants/debug.d.ts +18 -0
  68. package/library/constants/debug.d.ts.map +1 -0
  69. package/library/constants/debug.js +23 -0
  70. package/library/constants/index.d.ts +22 -2
  71. package/library/constants/index.d.ts.map +1 -1
  72. package/library/constants/index.js +110 -67
  73. package/library/constants/log.d.ts +12 -0
  74. package/library/constants/log.d.ts.map +1 -0
  75. package/library/constants/log.js +17 -0
  76. package/library/constants/messages.d.ts +3 -0
  77. package/library/constants/messages.d.ts.map +1 -1
  78. package/library/constants/messages.js +3 -0
  79. package/library/constants/warn-once.d.ts +12 -0
  80. package/library/constants/warn-once.d.ts.map +1 -0
  81. package/library/constants/warn-once.js +22 -0
  82. package/library/endpoint/facade.d.ts +238 -0
  83. package/library/endpoint/facade.d.ts.map +1 -0
  84. package/library/endpoint/facade.js +398 -0
  85. package/library/endpoint/heartbeat/heartbeat.d.ts +34 -0
  86. package/library/endpoint/heartbeat/heartbeat.d.ts.map +1 -0
  87. package/library/endpoint/heartbeat/heartbeat.js +67 -0
  88. package/library/endpoint/heartbeat/ping.d.ts +18 -0
  89. package/library/endpoint/heartbeat/ping.d.ts.map +1 -0
  90. package/library/endpoint/heartbeat/ping.js +26 -0
  91. package/library/endpoint/index.d.ts +16 -0
  92. package/library/endpoint/index.d.ts.map +1 -0
  93. package/library/endpoint/index.js +114 -0
  94. package/library/endpoint/infra/hub.d.ts +170 -0
  95. package/library/endpoint/infra/hub.d.ts.map +1 -0
  96. package/library/endpoint/infra/hub.js +323 -0
  97. package/library/endpoint/infra/inbox.d.ts +73 -0
  98. package/library/endpoint/infra/inbox.d.ts.map +1 -0
  99. package/library/endpoint/infra/inbox.js +239 -0
  100. package/library/endpoint/infra/outbox.d.ts +149 -0
  101. package/library/endpoint/infra/outbox.d.ts.map +1 -0
  102. package/library/endpoint/infra/outbox.js +415 -0
  103. package/library/endpoint/stream/dispatcher.d.ts +33 -0
  104. package/library/endpoint/stream/dispatcher.d.ts.map +1 -0
  105. package/library/endpoint/stream/dispatcher.js +66 -0
  106. package/library/endpoint/stream/errors.d.ts +20 -0
  107. package/library/endpoint/stream/errors.d.ts.map +1 -0
  108. package/library/endpoint/stream/errors.js +32 -0
  109. package/library/endpoint/stream/factory.d.ts +44 -0
  110. package/library/endpoint/stream/factory.d.ts.map +1 -0
  111. package/library/endpoint/stream/factory.js +82 -0
  112. package/library/endpoint/stream/file-auto-resolve.d.ts +26 -0
  113. package/library/endpoint/stream/file-auto-resolve.d.ts.map +1 -0
  114. package/library/endpoint/stream/file-auto-resolve.js +41 -0
  115. package/library/endpoint/stream/file-writable.d.ts +33 -0
  116. package/library/endpoint/stream/file-writable.d.ts.map +1 -0
  117. package/library/endpoint/stream/file-writable.js +115 -0
  118. package/library/endpoint/stream/handler.d.ts +20 -0
  119. package/library/endpoint/stream/handler.d.ts.map +1 -0
  120. package/library/endpoint/stream/handler.js +32 -0
  121. package/library/{core → impl}/client.d.ts +16 -13
  122. package/library/impl/client.d.ts.map +1 -0
  123. package/library/{core → impl}/client.js +251 -330
  124. package/library/{core → impl}/request.d.ts.map +1 -1
  125. package/library/{core → impl}/response.d.ts +5 -10
  126. package/library/impl/response.d.ts.map +1 -0
  127. package/library/{core → impl}/response.js +113 -155
  128. package/library/{core → impl}/server.d.ts +22 -55
  129. package/library/impl/server.d.ts.map +1 -0
  130. package/library/impl/server.js +575 -0
  131. package/library/index.d.ts +13 -6
  132. package/library/index.d.ts.map +1 -1
  133. package/library/index.js +16 -16
  134. package/library/message/ack.d.ts +15 -0
  135. package/library/message/ack.d.ts.map +1 -0
  136. package/library/message/ack.js +33 -0
  137. package/library/message/channel-cache.d.ts +26 -0
  138. package/library/message/channel-cache.d.ts.map +1 -0
  139. package/library/message/channel-cache.js +115 -0
  140. package/library/message/channel.d.ts +53 -6
  141. package/library/message/channel.d.ts.map +1 -1
  142. package/library/message/channel.js +94 -8
  143. package/library/message/dispatcher.d.ts +7 -0
  144. package/library/message/dispatcher.d.ts.map +1 -1
  145. package/library/message/dispatcher.js +116 -76
  146. package/library/stream/error.d.ts +24 -0
  147. package/library/stream/error.d.ts.map +1 -0
  148. package/library/stream/error.js +29 -0
  149. package/library/stream/index.d.ts +4 -1
  150. package/library/stream/index.d.ts.map +1 -1
  151. package/library/stream/index.js +7 -4
  152. package/library/stream/readable-stream.d.ts.map +1 -1
  153. package/library/stream/readable-stream.js +46 -10
  154. package/library/stream/stream-core.d.ts.map +1 -1
  155. package/library/stream/stream-core.js +6 -1
  156. package/library/stream/writable-stream.d.ts.map +1 -1
  157. package/library/stream/writable-stream.js +99 -28
  158. package/library/types/index.d.ts +15 -19
  159. package/library/types/index.d.ts.map +1 -1
  160. package/library/utils/blob.d.ts +3 -0
  161. package/library/utils/blob.d.ts.map +1 -0
  162. package/library/utils/blob.js +22 -0
  163. package/library/utils/cache.d.ts +10 -20
  164. package/library/utils/cache.d.ts.map +1 -1
  165. package/library/utils/cache.js +25 -79
  166. package/library/utils/content-type.d.ts +13 -0
  167. package/library/utils/content-type.d.ts.map +1 -0
  168. package/library/utils/content-type.js +87 -0
  169. package/library/utils/debug.d.ts.map +1 -1
  170. package/library/utils/debug.js +155 -177
  171. package/library/utils/hooks.d.ts +30 -0
  172. package/library/utils/hooks.d.ts.map +1 -0
  173. package/library/utils/hooks.js +139 -0
  174. package/library/utils/id.d.ts +9 -0
  175. package/library/utils/id.d.ts.map +1 -0
  176. package/library/utils/id.js +21 -0
  177. package/library/utils/iframe.d.ts +5 -0
  178. package/library/utils/iframe.d.ts.map +1 -0
  179. package/library/utils/iframe.js +25 -0
  180. package/library/utils/index.d.ts +7 -34
  181. package/library/utils/index.d.ts.map +1 -1
  182. package/library/utils/index.js +58 -194
  183. package/library/utils/is.d.ts +2 -0
  184. package/library/utils/is.d.ts.map +1 -0
  185. package/library/utils/is.js +9 -0
  186. package/library/utils/logger.d.ts +13 -0
  187. package/library/utils/logger.d.ts.map +1 -0
  188. package/library/utils/logger.js +63 -0
  189. package/library/utils/promise.d.ts +2 -0
  190. package/library/utils/promise.d.ts.map +1 -0
  191. package/library/utils/promise.js +9 -0
  192. package/library/utils/window.d.ts +2 -0
  193. package/library/utils/window.d.ts.map +1 -0
  194. package/library/utils/window.js +38 -0
  195. package/package.json +49 -2
  196. package/react/package.json +2 -1
  197. package/esm/core/client-server.js +0 -294
  198. package/esm/core/server.js +0 -776
  199. package/library/core/client-server.d.ts +0 -97
  200. package/library/core/client-server.d.ts.map +0 -1
  201. package/library/core/client-server.js +0 -301
  202. package/library/core/client.d.ts.map +0 -1
  203. package/library/core/response.d.ts.map +0 -1
  204. package/library/core/server.d.ts.map +0 -1
  205. package/library/core/server.js +0 -781
  206. /package/esm/{core → impl}/request.js +0 -0
  207. /package/library/{core → impl}/request.d.ts +0 -0
  208. /package/library/{core → impl}/request.js +0 -0
@@ -0,0 +1,238 @@
1
+ import type { OriginMatcher, OriginValidator, PostMessageData } from '../types';
2
+ import type { HandlerOptions, MessageContext, VersionValidator } from '../message';
3
+ import type { MessageRoleValue } from '../constants';
4
+ import { RequestIframeEndpointHub } from './infra/hub';
5
+ import { RequestIframeEndpointInbox } from './infra/inbox';
6
+ import { RequestIframeStreamDispatcher } from './stream/dispatcher';
7
+ import { RequestIframeEndpointHeartbeat } from './heartbeat/heartbeat';
8
+ import type { RequestIframeEndpointOutbox } from './infra/outbox';
9
+ /**
10
+ * RequestIframeEndpointFacade
11
+ *
12
+ * Centralizes the common "composition/assembly logic" for endpoints so client/server can reuse it as thin wrappers:
13
+ * - hub (MessageDispatcher lifecycle + shared infra)
14
+ * - inbox (inbound message handling: ACK/ASYNC/RESPONSE/ERROR/PING/PONG/STREAM_START, optional)
15
+ * - streamDispatcher (dispatch `stream_*` frames)
16
+ * - heartbeat (ping -> wait pong helper, optional)
17
+ * - originValidator (unified construction for allowedOrigins/validateOrigin)
18
+ */
19
+ export declare class RequestIframeEndpointFacade {
20
+ readonly hub: RequestIframeEndpointHub;
21
+ readonly streamDispatcher: RequestIframeStreamDispatcher;
22
+ readonly inbox?: RequestIframeEndpointInbox;
23
+ readonly heartbeat?: RequestIframeEndpointHeartbeat;
24
+ readonly originValidator?: (origin: string, data: PostMessageData, context: MessageContext) => boolean;
25
+ private readonly openHooks;
26
+ constructor(params: {
27
+ role: MessageRoleValue;
28
+ instanceId: string;
29
+ secretKey?: string;
30
+ versionValidator?: VersionValidator;
31
+ autoAckMaxMetaLength?: number;
32
+ autoAckMaxIdLength?: number;
33
+ /**
34
+ * Custom handler registration logic (typically for server: REQUEST/ACK/STREAM_START, etc.).
35
+ * If inbox is provided, prefer inbox.registerHandlers.
36
+ */
37
+ registerHandlers?: () => void;
38
+ /**
39
+ * Whether to create inbox (typically for client: inbound handling + pending driving).
40
+ */
41
+ inbox?: {
42
+ versionValidator?: VersionValidator;
43
+ };
44
+ /**
45
+ * streamDispatcher handledBy (default: instanceId).
46
+ */
47
+ streamDispatcher?: {
48
+ handledBy?: string;
49
+ };
50
+ /**
51
+ * Whether to create heartbeat (typically for server: pingPeer/handlePong).
52
+ */
53
+ heartbeat?: {
54
+ pendingBucket: string;
55
+ handledBy: string;
56
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
57
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
58
+ };
59
+ originValidator?: {
60
+ allowedOrigins?: OriginMatcher;
61
+ validateOrigin?: OriginValidator;
62
+ };
63
+ });
64
+ /**
65
+ * Add a handler registration hook that will run on core.open().
66
+ */
67
+ onOpen(fn: () => void): void;
68
+ private isOriginAllowedByValidator;
69
+ /**
70
+ * Register client-side stream callback handlers:
71
+ * - stream_* (except stream_start) -> core.getStreamCallback()
72
+ *
73
+ * This makes stream dispatching pluggable and owned by the facade.
74
+ */
75
+ registerClientStreamCallbackHandlers(params: {
76
+ handlerOptions: HandlerOptions;
77
+ }): void;
78
+ /**
79
+ * Enable default stream dispatching: dispatch stream_* messages to streamDispatcher.
80
+ */
81
+ enableStreamDispatcherCallback(params?: {
82
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
83
+ }): void;
84
+ disableStreamDispatcherCallback(): void;
85
+ /**
86
+ * Register server-side base handlers:
87
+ * - PING/PONG (heartbeat)
88
+ * - ACK (receipt confirmation waiter)
89
+ * - STREAM_START + stream_* routing (request-body stream)
90
+ *
91
+ * Server wrapper should still register REQUEST handler itself.
92
+ */
93
+ registerServerBaseHandlers(params: {
94
+ handlerOptions: HandlerOptions;
95
+ handledBy: string;
96
+ includeTargetIdInPong?: boolean;
97
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
98
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
99
+ pendingAckBucket: string;
100
+ pendingStreamStartBucket: string;
101
+ expectedStreamStartRole: MessageRoleValue;
102
+ }): void;
103
+ /**
104
+ * Register PING responder (reply PONG).
105
+ */
106
+ registerPingResponderHandler(params: {
107
+ handlerOptions: HandlerOptions;
108
+ handledBy: string;
109
+ includeTargetIdInPong?: boolean;
110
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
111
+ }): void;
112
+ /**
113
+ * Register PONG handler for heartbeat waiter (if heartbeat is configured).
114
+ */
115
+ registerHeartbeatPongHandler(params: {
116
+ handlerOptions: HandlerOptions;
117
+ }): void;
118
+ /**
119
+ * Register ACK handler for receipt confirmation waiters.
120
+ */
121
+ registerAckWaiterHandler(params: {
122
+ handlerOptions: HandlerOptions;
123
+ pendingBucket: string;
124
+ handledBy: string;
125
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
126
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
127
+ }): void;
128
+ /**
129
+ * Register stream handlers (STREAM_START + stream_* routing).
130
+ */
131
+ registerStreamHandlers(params: {
132
+ handlerOptions: HandlerOptions;
133
+ expectedRole: MessageRoleValue;
134
+ pendingBucket: string;
135
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
136
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
137
+ }): void;
138
+ /**
139
+ * Server-side: register a waiter for an incoming stream_start (request-body stream handshake).
140
+ *
141
+ * This centralizes:
142
+ * - pending map bookkeeping
143
+ * - timeout cleanup
144
+ * - STREAM_START_TIMEOUT error response hook
145
+ */
146
+ registerIncomingStreamStartWaiter(params: {
147
+ pendingBucket: string;
148
+ requestId: string;
149
+ streamId: string;
150
+ timeoutMs: number;
151
+ targetWindow: Window;
152
+ targetOrigin: string;
153
+ onTimeout: () => void;
154
+ continue: (payload: {
155
+ stream: any;
156
+ info: any;
157
+ data: PostMessageData;
158
+ context: MessageContext;
159
+ }) => void;
160
+ }): void;
161
+ /**
162
+ * Handle incoming PING and reply PONG.
163
+ *
164
+ * This is a base infrastructure capability for all endpoints.
165
+ */
166
+ handlePing(data: PostMessageData, context: MessageContext, params: {
167
+ handledBy: string;
168
+ includeTargetId?: boolean;
169
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
170
+ }): void;
171
+ /**
172
+ * Handle incoming PONG for facade heartbeat waiter (if configured).
173
+ */
174
+ handlePong(data: PostMessageData, context: MessageContext): void;
175
+ /**
176
+ * Ping a peer and resolve true when PONG arrives (requires heartbeat configured).
177
+ */
178
+ pingPeer(targetWindow: Window, targetOrigin: string, timeoutMs: number, targetId?: string): Promise<boolean>;
179
+ /**
180
+ * Client-side "isConnect" ping helper (requires inbox configured).
181
+ *
182
+ * - Sends PING(requireAck=true)
183
+ * - Resolves true when ACK or PONG arrives, false on timeout
184
+ */
185
+ pingIsConnect(params: {
186
+ peer: RequestIframeEndpointOutbox;
187
+ timeoutMs: number;
188
+ targetOrigin: string;
189
+ targetId?: string;
190
+ onPeerId?: (peerId?: string) => void;
191
+ }): Promise<boolean>;
192
+ /**
193
+ * Pending ACK waiter bucket entry.
194
+ */
195
+ private static readonly DEFAULT_PENDING_ACKS_BUCKET;
196
+ /**
197
+ * Register an ACK waiter (used by server response requireAck).
198
+ */
199
+ registerPendingAck(params: {
200
+ requestId: string;
201
+ timeoutMs: number;
202
+ pendingBucket?: string;
203
+ resolve: (received: boolean, ack?: any) => void;
204
+ }): void;
205
+ /**
206
+ * Handle incoming ACK for a registered waiter.
207
+ */
208
+ handleAck(params: {
209
+ data: PostMessageData;
210
+ context: MessageContext;
211
+ pendingBucket?: string;
212
+ handledBy: string;
213
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
214
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
215
+ }): void;
216
+ /**
217
+ * Dispatch incoming stream_* messages (stream_data/stream_end/...) to bound handler.
218
+ */
219
+ dispatchStreamMessage(data: PostMessageData, context: MessageContext, params?: {
220
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
221
+ }): void;
222
+ /**
223
+ * Pending stream_start waiter entry.
224
+ *
225
+ * Server stores this entry when it receives a REQUEST that declares a streamId.
226
+ * When stream_start arrives, facade creates a ReadableStream and calls `continue`.
227
+ */
228
+ handleStreamStart(params: {
229
+ data: PostMessageData;
230
+ context: MessageContext;
231
+ expectedRole?: MessageRoleValue;
232
+ pendingBucket: string;
233
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
234
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
235
+ }): void;
236
+ private static buildOriginValidator;
237
+ }
238
+ //# sourceMappingURL=facade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/endpoint/facade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,398 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.RequestIframeEndpointFacade = void 0;
8
+ require("core-js/modules/es.promise.js");
9
+ require("core-js/modules/es.string.starts-with.js");
10
+ require("core-js/modules/web.dom-collections.for-each.js");
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _constants = require("../constants");
13
+ var _origin = require("../utils/origin");
14
+ var _hub = require("./infra/hub");
15
+ var _inbox = require("./infra/inbox");
16
+ var _dispatcher = require("./stream/dispatcher");
17
+ var _heartbeat = require("./heartbeat/heartbeat");
18
+ var _ping = require("./heartbeat/ping");
19
+ var _factory = require("./stream/factory");
20
+ var _handler = require("./stream/handler");
21
+ /**
22
+ * RequestIframeEndpointFacade
23
+ *
24
+ * Centralizes the common "composition/assembly logic" for endpoints so client/server can reuse it as thin wrappers:
25
+ * - hub (MessageDispatcher lifecycle + shared infra)
26
+ * - inbox (inbound message handling: ACK/ASYNC/RESPONSE/ERROR/PING/PONG/STREAM_START, optional)
27
+ * - streamDispatcher (dispatch `stream_*` frames)
28
+ * - heartbeat (ping -> wait pong helper, optional)
29
+ * - originValidator (unified construction for allowedOrigins/validateOrigin)
30
+ */
31
+ class RequestIframeEndpointFacade {
32
+ constructor(params) {
33
+ var _params$streamDispatc, _params$streamDispatc2;
34
+ (0, _defineProperty2.default)(this, "openHooks", []);
35
+ this.hub = new _hub.RequestIframeEndpointHub(params.role, params.instanceId, {
36
+ secretKey: params.secretKey,
37
+ versionValidator: params.versionValidator,
38
+ autoAckMaxMetaLength: params.autoAckMaxMetaLength,
39
+ autoAckMaxIdLength: params.autoAckMaxIdLength
40
+ });
41
+ this.streamDispatcher = new _dispatcher.RequestIframeStreamDispatcher({
42
+ handledBy: (_params$streamDispatc = (_params$streamDispatc2 = params.streamDispatcher) === null || _params$streamDispatc2 === void 0 ? void 0 : _params$streamDispatc2.handledBy) !== null && _params$streamDispatc !== void 0 ? _params$streamDispatc : params.instanceId
43
+ });
44
+ this.originValidator = RequestIframeEndpointFacade.buildOriginValidator(params.originValidator);
45
+
46
+ /**
47
+ * Facade is the infrastructure owner: always register handlers via facade hooks.
48
+ */
49
+ this.hub.setRegisterHandlers(() => {
50
+ this.openHooks.forEach(fn => fn());
51
+ });
52
+ if (params.heartbeat) {
53
+ this.heartbeat = new _heartbeat.RequestIframeEndpointHeartbeat({
54
+ hub: this.hub,
55
+ pendingBucket: params.heartbeat.pendingBucket,
56
+ handledBy: params.heartbeat.handledBy,
57
+ isOriginAllowed: params.heartbeat.isOriginAllowed,
58
+ warnMissingPendingWhenClosed: params.heartbeat.warnMissingPendingWhenClosed
59
+ });
60
+ }
61
+ if (params.inbox) {
62
+ this.inbox = new _inbox.RequestIframeEndpointInbox(this.hub, params.inbox.versionValidator);
63
+ }
64
+ if (params.registerHandlers) {
65
+ this.onOpen(params.registerHandlers);
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Add a handler registration hook that will run on core.open().
71
+ */
72
+ onOpen(fn) {
73
+ this.openHooks.push(fn);
74
+ }
75
+ isOriginAllowedByValidator(origin, data, context) {
76
+ if (!this.originValidator) return true;
77
+ try {
78
+ return this.originValidator(origin, data, context);
79
+ } catch (_unused) {
80
+ return false;
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Register client-side stream callback handlers:
86
+ * - stream_* (except stream_start) -> core.getStreamCallback()
87
+ *
88
+ * This makes stream dispatching pluggable and owned by the facade.
89
+ */
90
+ registerClientStreamCallbackHandlers(params) {
91
+ this.onOpen(() => {
92
+ this.hub.registerHandler(type => type.startsWith('stream_') && type !== _constants.MessageType.STREAM_START, (data, context) => {
93
+ var _this$hub$getStreamCa;
94
+ return (_this$hub$getStreamCa = this.hub.getStreamCallback()) === null || _this$hub$getStreamCa === void 0 ? void 0 : _this$hub$getStreamCa(data, context);
95
+ }, params.handlerOptions);
96
+ });
97
+ }
98
+
99
+ /**
100
+ * Enable default stream dispatching: dispatch stream_* messages to streamDispatcher.
101
+ */
102
+ enableStreamDispatcherCallback(params) {
103
+ this.hub.setStreamCallback((data, context) => {
104
+ this.dispatchStreamMessage(data, context, {
105
+ isOriginAllowed: params === null || params === void 0 ? void 0 : params.isOriginAllowed
106
+ });
107
+ });
108
+ }
109
+ disableStreamDispatcherCallback() {
110
+ this.hub.setStreamCallback(undefined);
111
+ }
112
+
113
+ /**
114
+ * Register server-side base handlers:
115
+ * - PING/PONG (heartbeat)
116
+ * - ACK (receipt confirmation waiter)
117
+ * - STREAM_START + stream_* routing (request-body stream)
118
+ *
119
+ * Server wrapper should still register REQUEST handler itself.
120
+ */
121
+ registerServerBaseHandlers(params) {
122
+ this.registerPingResponderHandler({
123
+ handlerOptions: params.handlerOptions,
124
+ handledBy: params.handledBy,
125
+ includeTargetIdInPong: params.includeTargetIdInPong,
126
+ isOriginAllowed: params.isOriginAllowed
127
+ });
128
+ this.registerHeartbeatPongHandler({
129
+ handlerOptions: params.handlerOptions
130
+ });
131
+ this.registerAckWaiterHandler({
132
+ handlerOptions: params.handlerOptions,
133
+ pendingBucket: params.pendingAckBucket,
134
+ handledBy: params.handledBy,
135
+ isOriginAllowed: params.isOriginAllowed,
136
+ warnMissingPendingWhenClosed: params.warnMissingPendingWhenClosed
137
+ });
138
+ this.registerStreamHandlers({
139
+ handlerOptions: params.handlerOptions,
140
+ expectedRole: params.expectedStreamStartRole,
141
+ pendingBucket: params.pendingStreamStartBucket,
142
+ isOriginAllowed: params.isOriginAllowed,
143
+ warnMissingPendingWhenClosed: params.warnMissingPendingWhenClosed
144
+ });
145
+ }
146
+
147
+ /**
148
+ * Register PING responder (reply PONG).
149
+ */
150
+ registerPingResponderHandler(params) {
151
+ this.onOpen(() => {
152
+ this.hub.registerHandler(_constants.MessageType.PING, (data, context) => {
153
+ this.handlePing(data, context, {
154
+ handledBy: params.handledBy,
155
+ includeTargetId: params.includeTargetIdInPong,
156
+ isOriginAllowed: params.isOriginAllowed
157
+ });
158
+ }, params.handlerOptions);
159
+ });
160
+ }
161
+
162
+ /**
163
+ * Register PONG handler for heartbeat waiter (if heartbeat is configured).
164
+ */
165
+ registerHeartbeatPongHandler(params) {
166
+ this.onOpen(() => {
167
+ this.hub.registerHandler(_constants.MessageType.PONG, (data, context) => {
168
+ this.handlePong(data, context);
169
+ }, params.handlerOptions);
170
+ });
171
+ }
172
+
173
+ /**
174
+ * Register ACK handler for receipt confirmation waiters.
175
+ */
176
+ registerAckWaiterHandler(params) {
177
+ this.onOpen(() => {
178
+ this.hub.registerHandler(_constants.MessageType.ACK, (data, context) => {
179
+ this.handleAck({
180
+ data,
181
+ context,
182
+ pendingBucket: params.pendingBucket,
183
+ handledBy: params.handledBy,
184
+ isOriginAllowed: params.isOriginAllowed,
185
+ warnMissingPendingWhenClosed: params.warnMissingPendingWhenClosed
186
+ });
187
+ }, params.handlerOptions);
188
+ });
189
+ }
190
+
191
+ /**
192
+ * Register stream handlers (STREAM_START + stream_* routing).
193
+ */
194
+ registerStreamHandlers(params) {
195
+ this.onOpen(() => {
196
+ var isOriginAllowed = params.isOriginAllowed;
197
+ this.hub.registerHandler(_constants.MessageType.STREAM_START, (data, context) => {
198
+ this.handleStreamStart({
199
+ data,
200
+ context,
201
+ expectedRole: params.expectedRole,
202
+ pendingBucket: params.pendingBucket,
203
+ isOriginAllowed,
204
+ warnMissingPendingWhenClosed: params.warnMissingPendingWhenClosed
205
+ });
206
+ }, params.handlerOptions);
207
+ this.hub.registerHandler(type => type.startsWith('stream_') && type !== _constants.MessageType.STREAM_START, (data, context) => {
208
+ this.dispatchStreamMessage(data, context, {
209
+ isOriginAllowed
210
+ });
211
+ }, params.handlerOptions);
212
+ });
213
+ }
214
+
215
+ /**
216
+ * Server-side: register a waiter for an incoming stream_start (request-body stream handshake).
217
+ *
218
+ * This centralizes:
219
+ * - pending map bookkeeping
220
+ * - timeout cleanup
221
+ * - STREAM_START_TIMEOUT error response hook
222
+ */
223
+ registerIncomingStreamStartWaiter(params) {
224
+ var timeoutId = this.hub.pending.setTimeout(() => {
225
+ var pending = this.hub.pending.get(params.pendingBucket, params.requestId);
226
+ if (!pending) return;
227
+ this.hub.pending.delete(params.pendingBucket, params.requestId);
228
+ params.onTimeout();
229
+ }, params.timeoutMs);
230
+ this.hub.pending.set(params.pendingBucket, params.requestId, {
231
+ streamId: params.streamId,
232
+ timeoutId,
233
+ targetWindow: params.targetWindow,
234
+ targetOrigin: params.targetOrigin,
235
+ continue: params.continue
236
+ });
237
+ }
238
+
239
+ /**
240
+ * Handle incoming PING and reply PONG.
241
+ *
242
+ * This is a base infrastructure capability for all endpoints.
243
+ */
244
+ handlePing(data, context, params) {
245
+ if (!context.source) return;
246
+ if (params.isOriginAllowed && !params.isOriginAllowed(data, context)) return;
247
+ (0, _ping.createPingResponder)({
248
+ hub: this.hub,
249
+ handledBy: params.handledBy,
250
+ includeTargetId: params.includeTargetId
251
+ })(data, context);
252
+ }
253
+
254
+ /**
255
+ * Handle incoming PONG for facade heartbeat waiter (if configured).
256
+ */
257
+ handlePong(data, context) {
258
+ var _this$heartbeat;
259
+ (_this$heartbeat = this.heartbeat) === null || _this$heartbeat === void 0 || _this$heartbeat.handlePong(data, context);
260
+ }
261
+
262
+ /**
263
+ * Ping a peer and resolve true when PONG arrives (requires heartbeat configured).
264
+ */
265
+ pingPeer(targetWindow, targetOrigin, timeoutMs, targetId) {
266
+ if (!this.heartbeat) {
267
+ return Promise.resolve(false);
268
+ }
269
+ var peer = this.hub.createOutbox(targetWindow, targetOrigin, targetId);
270
+ return this.heartbeat.ping(peer, timeoutMs, targetId);
271
+ }
272
+
273
+ /**
274
+ * Client-side "isConnect" ping helper (requires inbox configured).
275
+ *
276
+ * - Sends PING(requireAck=true)
277
+ * - Resolves true when ACK or PONG arrives, false on timeout
278
+ */
279
+ pingIsConnect(params) {
280
+ var inbox = this.inbox;
281
+ if (!inbox) return Promise.resolve(false);
282
+ return inbox.pingIsConnect({
283
+ peer: params.peer,
284
+ timeoutMs: params.timeoutMs,
285
+ targetOrigin: params.targetOrigin,
286
+ targetId: params.targetId,
287
+ onPeerId: params.onPeerId,
288
+ originValidator: this.originValidator
289
+ });
290
+ }
291
+
292
+ /**
293
+ * Pending ACK waiter bucket entry.
294
+ */
295
+
296
+ /**
297
+ * Register an ACK waiter (used by server response requireAck).
298
+ */
299
+ registerPendingAck(params) {
300
+ var _params$pendingBucket;
301
+ var bucket = (_params$pendingBucket = params.pendingBucket) !== null && _params$pendingBucket !== void 0 ? _params$pendingBucket : RequestIframeEndpointFacade.DEFAULT_PENDING_ACKS_BUCKET;
302
+ var timeoutId = this.hub.pending.setTimeout(() => {
303
+ this.hub.pending.delete(bucket, params.requestId);
304
+ params.resolve(false);
305
+ }, params.timeoutMs);
306
+ this.hub.pending.set(bucket, params.requestId, {
307
+ resolve: params.resolve,
308
+ timeoutId
309
+ });
310
+ }
311
+
312
+ /**
313
+ * Handle incoming ACK for a registered waiter.
314
+ */
315
+ handleAck(params) {
316
+ var _params$pendingBucket2;
317
+ var bucket = (_params$pendingBucket2 = params.pendingBucket) !== null && _params$pendingBucket2 !== void 0 ? _params$pendingBucket2 : RequestIframeEndpointFacade.DEFAULT_PENDING_ACKS_BUCKET;
318
+ if (params.isOriginAllowed && !params.isOriginAllowed(params.data, params.context)) return;
319
+ var pending = this.hub.pending.get(bucket, params.data.requestId);
320
+ if (!pending) {
321
+ if (!this.hub.isOpen) {
322
+ var _params$warnMissingPe;
323
+ (_params$warnMissingPe = params.warnMissingPendingWhenClosed) === null || _params$warnMissingPe === void 0 || _params$warnMissingPe.call(params, params.data);
324
+ }
325
+ return;
326
+ }
327
+ params.context.markHandledBy(params.handledBy);
328
+ this.hub.pending.clearTimeout(pending.timeoutId);
329
+ this.hub.pending.delete(bucket, params.data.requestId);
330
+ pending.resolve(true, params.data.ack);
331
+ }
332
+
333
+ /**
334
+ * Dispatch incoming stream_* messages (stream_data/stream_end/...) to bound handler.
335
+ */
336
+ dispatchStreamMessage(data, context, params) {
337
+ if (params !== null && params !== void 0 && params.isOriginAllowed && !params.isOriginAllowed(data, context)) return;
338
+ this.streamDispatcher.dispatch(data, context);
339
+ }
340
+
341
+ /**
342
+ * Pending stream_start waiter entry.
343
+ *
344
+ * Server stores this entry when it receives a REQUEST that declares a streamId.
345
+ * When stream_start arrives, facade creates a ReadableStream and calls `continue`.
346
+ */
347
+ handleStreamStart(params) {
348
+ var data = params.data,
349
+ context = params.context;
350
+ if (params.expectedRole && data.role !== params.expectedRole) return;
351
+ if (params.isOriginAllowed && !params.isOriginAllowed(data, context)) return;
352
+ var body = data.body;
353
+ if (!(body !== null && body !== void 0 && body.streamId)) return;
354
+ var pending = this.hub.pending.get(params.pendingBucket, data.requestId);
355
+ if (!pending) {
356
+ if (!this.hub.isOpen) {
357
+ var _params$warnMissingPe2;
358
+ (_params$warnMissingPe2 = params.warnMissingPendingWhenClosed) === null || _params$warnMissingPe2 === void 0 || _params$warnMissingPe2.call(params, data);
359
+ }
360
+ return;
361
+ }
362
+ if (pending.streamId !== body.streamId) return;
363
+ this.hub.pending.clearTimeout(pending.timeoutId);
364
+ this.hub.pending.delete(params.pendingBucket, data.requestId);
365
+ var streamHandler = (0, _handler.createStreamMessageHandler)({
366
+ dispatcher: this.streamDispatcher,
367
+ postMessage: message => {
368
+ this.hub.messageDispatcher.send(pending.targetWindow, message, pending.targetOrigin);
369
+ }
370
+ });
371
+ var created = (0, _factory.createReadableStreamFromStart)({
372
+ requestId: data.requestId,
373
+ data,
374
+ handler: streamHandler,
375
+ secretKey: data.secretKey
376
+ });
377
+ if (!created) return;
378
+ pending.continue({
379
+ stream: created.stream,
380
+ info: created.info,
381
+ data,
382
+ context
383
+ });
384
+ }
385
+ static buildOriginValidator(input) {
386
+ if (!input) return undefined;
387
+ if (input.validateOrigin) {
388
+ return (origin, data, context) => input.validateOrigin(origin, data, context);
389
+ }
390
+ if (input.allowedOrigins) {
391
+ var matcher = input.allowedOrigins;
392
+ return origin => (0, _origin.matchOrigin)(origin, matcher);
393
+ }
394
+ return undefined;
395
+ }
396
+ }
397
+ exports.RequestIframeEndpointFacade = RequestIframeEndpointFacade;
398
+ (0, _defineProperty2.default)(RequestIframeEndpointFacade, "DEFAULT_PENDING_ACKS_BUCKET", 'endpoint:pendingAcks');
@@ -0,0 +1,34 @@
1
+ import type { PostMessageData } from '../../types';
2
+ import type { MessageContext } from '../../message';
3
+ import type { RequestIframeEndpointHub } from '../infra/hub';
4
+ import type { RequestIframeEndpointOutbox } from '../infra/outbox';
5
+ /**
6
+ * RequestIframeEndpointHeartbeat
7
+ *
8
+ * Shared "ping -> wait pong" helper.
9
+ * - Works for both server and client endpoints
10
+ * - Uses core.pending for timeout management
11
+ */
12
+ export declare class RequestIframeEndpointHeartbeat {
13
+ readonly hub: RequestIframeEndpointHub;
14
+ private readonly pendingBucket;
15
+ private readonly handledBy;
16
+ private readonly isOriginAllowed?;
17
+ private readonly warnMissingPendingWhenClosed?;
18
+ constructor(params: {
19
+ hub: RequestIframeEndpointHub;
20
+ pendingBucket: string;
21
+ handledBy: string;
22
+ isOriginAllowed?: (data: PostMessageData, context: MessageContext) => boolean;
23
+ warnMissingPendingWhenClosed?: (data: PostMessageData) => void;
24
+ });
25
+ /**
26
+ * Send PING and resolve true when PONG arrives, false on timeout.
27
+ */
28
+ ping(peer: RequestIframeEndpointOutbox, timeoutMs: number, targetId?: string): Promise<boolean>;
29
+ /**
30
+ * Handle incoming PONG for ping() waiter.
31
+ */
32
+ handlePong(data: PostMessageData, context: MessageContext): void;
33
+ }
34
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/endpoint/heartbeat/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;;GAMG;AACH,qBAAa,8BAA8B;IACzC,SAAgB,GAAG,EAAE,wBAAwB,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA8D;IAC/F,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAkC;gBAE7D,MAAM,EAAE;QACzB,GAAG,EAAE,wBAAwB,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;QAC9E,4BAA4B,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;KAChE;IAQD;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYtG;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;CAgBxE"}