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.
- package/QUICKSTART.CN.md +4 -2
- package/QUICKSTART.md +4 -2
- package/README.CN.md +129 -33
- package/README.md +116 -15
- package/cdn/request-iframe-react.umd.js +3354 -0
- package/cdn/request-iframe-react.umd.js.map +1 -0
- package/cdn/request-iframe-react.umd.min.js +2 -0
- package/cdn/request-iframe-react.umd.min.js.map +1 -0
- package/cdn/request-iframe.umd.js +19761 -0
- package/cdn/request-iframe.umd.js.map +1 -0
- package/cdn/request-iframe.umd.min.js +4 -0
- package/cdn/request-iframe.umd.min.js.map +1 -0
- package/esm/api/client.js +29 -21
- package/esm/api/endpoint.js +229 -0
- package/esm/api/server.js +16 -8
- package/esm/constants/debug.js +17 -0
- package/esm/constants/index.js +84 -67
- package/esm/constants/log.js +11 -0
- package/esm/constants/messages.js +3 -0
- package/esm/constants/warn-once.js +15 -0
- package/esm/endpoint/facade.js +390 -0
- package/esm/endpoint/heartbeat/heartbeat.js +60 -0
- package/esm/endpoint/heartbeat/ping.js +20 -0
- package/esm/endpoint/index.js +13 -0
- package/esm/endpoint/infra/hub.js +316 -0
- package/esm/endpoint/infra/inbox.js +232 -0
- package/esm/endpoint/infra/outbox.js +408 -0
- package/esm/endpoint/stream/dispatcher.js +58 -0
- package/esm/endpoint/stream/errors.js +27 -0
- package/esm/endpoint/stream/factory.js +76 -0
- package/esm/endpoint/stream/file-auto-resolve.js +34 -0
- package/esm/endpoint/stream/file-writable.js +105 -0
- package/esm/endpoint/stream/handler.js +26 -0
- package/esm/{core → impl}/client.js +240 -317
- package/esm/{core → impl}/response.js +113 -155
- package/esm/impl/server.js +568 -0
- package/esm/index.js +13 -6
- package/esm/message/ack.js +27 -0
- package/esm/message/channel-cache.js +108 -0
- package/esm/message/channel.js +90 -4
- package/esm/message/dispatcher.js +115 -75
- package/esm/stream/error.js +22 -0
- package/esm/stream/index.js +3 -1
- package/esm/stream/readable-stream.js +45 -9
- package/esm/stream/stream-core.js +7 -2
- package/esm/stream/writable-stream.js +97 -26
- package/esm/utils/blob.js +16 -0
- package/esm/utils/cache.js +25 -76
- package/esm/utils/content-type.js +81 -0
- package/esm/utils/debug.js +156 -179
- package/esm/utils/hooks.js +130 -0
- package/esm/utils/id.js +14 -0
- package/esm/utils/iframe.js +20 -0
- package/esm/utils/index.js +11 -163
- package/esm/utils/is.js +3 -0
- package/esm/utils/logger.js +55 -0
- package/esm/utils/promise.js +3 -0
- package/esm/utils/window.js +31 -0
- package/library/api/client.d.ts.map +1 -1
- package/library/api/client.js +30 -22
- package/library/api/endpoint.d.ts +23 -0
- package/library/api/endpoint.d.ts.map +1 -0
- package/library/api/endpoint.js +235 -0
- package/library/api/server.d.ts +4 -1
- package/library/api/server.d.ts.map +1 -1
- package/library/api/server.js +16 -8
- package/library/constants/debug.d.ts +18 -0
- package/library/constants/debug.d.ts.map +1 -0
- package/library/constants/debug.js +23 -0
- package/library/constants/index.d.ts +22 -2
- package/library/constants/index.d.ts.map +1 -1
- package/library/constants/index.js +110 -67
- package/library/constants/log.d.ts +12 -0
- package/library/constants/log.d.ts.map +1 -0
- package/library/constants/log.js +17 -0
- package/library/constants/messages.d.ts +3 -0
- package/library/constants/messages.d.ts.map +1 -1
- package/library/constants/messages.js +3 -0
- package/library/constants/warn-once.d.ts +12 -0
- package/library/constants/warn-once.d.ts.map +1 -0
- package/library/constants/warn-once.js +22 -0
- package/library/endpoint/facade.d.ts +238 -0
- package/library/endpoint/facade.d.ts.map +1 -0
- package/library/endpoint/facade.js +398 -0
- package/library/endpoint/heartbeat/heartbeat.d.ts +34 -0
- package/library/endpoint/heartbeat/heartbeat.d.ts.map +1 -0
- package/library/endpoint/heartbeat/heartbeat.js +67 -0
- package/library/endpoint/heartbeat/ping.d.ts +18 -0
- package/library/endpoint/heartbeat/ping.d.ts.map +1 -0
- package/library/endpoint/heartbeat/ping.js +26 -0
- package/library/endpoint/index.d.ts +16 -0
- package/library/endpoint/index.d.ts.map +1 -0
- package/library/endpoint/index.js +114 -0
- package/library/endpoint/infra/hub.d.ts +170 -0
- package/library/endpoint/infra/hub.d.ts.map +1 -0
- package/library/endpoint/infra/hub.js +323 -0
- package/library/endpoint/infra/inbox.d.ts +73 -0
- package/library/endpoint/infra/inbox.d.ts.map +1 -0
- package/library/endpoint/infra/inbox.js +239 -0
- package/library/endpoint/infra/outbox.d.ts +149 -0
- package/library/endpoint/infra/outbox.d.ts.map +1 -0
- package/library/endpoint/infra/outbox.js +415 -0
- package/library/endpoint/stream/dispatcher.d.ts +33 -0
- package/library/endpoint/stream/dispatcher.d.ts.map +1 -0
- package/library/endpoint/stream/dispatcher.js +66 -0
- package/library/endpoint/stream/errors.d.ts +20 -0
- package/library/endpoint/stream/errors.d.ts.map +1 -0
- package/library/endpoint/stream/errors.js +32 -0
- package/library/endpoint/stream/factory.d.ts +44 -0
- package/library/endpoint/stream/factory.d.ts.map +1 -0
- package/library/endpoint/stream/factory.js +82 -0
- package/library/endpoint/stream/file-auto-resolve.d.ts +26 -0
- package/library/endpoint/stream/file-auto-resolve.d.ts.map +1 -0
- package/library/endpoint/stream/file-auto-resolve.js +41 -0
- package/library/endpoint/stream/file-writable.d.ts +33 -0
- package/library/endpoint/stream/file-writable.d.ts.map +1 -0
- package/library/endpoint/stream/file-writable.js +115 -0
- package/library/endpoint/stream/handler.d.ts +20 -0
- package/library/endpoint/stream/handler.d.ts.map +1 -0
- package/library/endpoint/stream/handler.js +32 -0
- package/library/{core → impl}/client.d.ts +16 -13
- package/library/impl/client.d.ts.map +1 -0
- package/library/{core → impl}/client.js +251 -330
- package/library/{core → impl}/request.d.ts.map +1 -1
- package/library/{core → impl}/response.d.ts +5 -10
- package/library/impl/response.d.ts.map +1 -0
- package/library/{core → impl}/response.js +113 -155
- package/library/{core → impl}/server.d.ts +22 -55
- package/library/impl/server.d.ts.map +1 -0
- package/library/impl/server.js +575 -0
- package/library/index.d.ts +13 -6
- package/library/index.d.ts.map +1 -1
- package/library/index.js +16 -16
- package/library/message/ack.d.ts +15 -0
- package/library/message/ack.d.ts.map +1 -0
- package/library/message/ack.js +33 -0
- package/library/message/channel-cache.d.ts +26 -0
- package/library/message/channel-cache.d.ts.map +1 -0
- package/library/message/channel-cache.js +115 -0
- package/library/message/channel.d.ts +53 -6
- package/library/message/channel.d.ts.map +1 -1
- package/library/message/channel.js +94 -8
- package/library/message/dispatcher.d.ts +7 -0
- package/library/message/dispatcher.d.ts.map +1 -1
- package/library/message/dispatcher.js +116 -76
- package/library/stream/error.d.ts +24 -0
- package/library/stream/error.d.ts.map +1 -0
- package/library/stream/error.js +29 -0
- package/library/stream/index.d.ts +4 -1
- package/library/stream/index.d.ts.map +1 -1
- package/library/stream/index.js +7 -4
- package/library/stream/readable-stream.d.ts.map +1 -1
- package/library/stream/readable-stream.js +46 -10
- package/library/stream/stream-core.d.ts.map +1 -1
- package/library/stream/stream-core.js +6 -1
- package/library/stream/writable-stream.d.ts.map +1 -1
- package/library/stream/writable-stream.js +99 -28
- package/library/types/index.d.ts +15 -19
- package/library/types/index.d.ts.map +1 -1
- package/library/utils/blob.d.ts +3 -0
- package/library/utils/blob.d.ts.map +1 -0
- package/library/utils/blob.js +22 -0
- package/library/utils/cache.d.ts +10 -20
- package/library/utils/cache.d.ts.map +1 -1
- package/library/utils/cache.js +25 -79
- package/library/utils/content-type.d.ts +13 -0
- package/library/utils/content-type.d.ts.map +1 -0
- package/library/utils/content-type.js +87 -0
- package/library/utils/debug.d.ts.map +1 -1
- package/library/utils/debug.js +155 -177
- package/library/utils/hooks.d.ts +30 -0
- package/library/utils/hooks.d.ts.map +1 -0
- package/library/utils/hooks.js +139 -0
- package/library/utils/id.d.ts +9 -0
- package/library/utils/id.d.ts.map +1 -0
- package/library/utils/id.js +21 -0
- package/library/utils/iframe.d.ts +5 -0
- package/library/utils/iframe.d.ts.map +1 -0
- package/library/utils/iframe.js +25 -0
- package/library/utils/index.d.ts +7 -34
- package/library/utils/index.d.ts.map +1 -1
- package/library/utils/index.js +58 -194
- package/library/utils/is.d.ts +2 -0
- package/library/utils/is.d.ts.map +1 -0
- package/library/utils/is.js +9 -0
- package/library/utils/logger.d.ts +13 -0
- package/library/utils/logger.d.ts.map +1 -0
- package/library/utils/logger.js +63 -0
- package/library/utils/promise.d.ts +2 -0
- package/library/utils/promise.d.ts.map +1 -0
- package/library/utils/promise.js +9 -0
- package/library/utils/window.d.ts +2 -0
- package/library/utils/window.d.ts.map +1 -0
- package/library/utils/window.js +38 -0
- package/package.json +49 -2
- package/react/package.json +2 -1
- package/esm/core/client-server.js +0 -294
- package/esm/core/server.js +0 -776
- package/library/core/client-server.d.ts +0 -97
- package/library/core/client-server.d.ts.map +0 -1
- package/library/core/client-server.js +0 -301
- package/library/core/client.d.ts.map +0 -1
- package/library/core/response.d.ts.map +0 -1
- package/library/core/server.d.ts.map +0 -1
- package/library/core/server.js +0 -781
- /package/esm/{core → impl}/request.js +0 -0
- /package/library/{core → impl}/request.d.ts +0 -0
- /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"}
|