request-iframe 0.0.4 → 0.0.6

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 (88) hide show
  1. package/README.CN.md +8 -1
  2. package/README.md +8 -1
  3. package/library/constants/index.d.ts +2 -0
  4. package/library/constants/index.d.ts.map +1 -1
  5. package/library/constants/index.js +3 -1
  6. package/library/constants/messages.d.ts +1 -0
  7. package/library/constants/messages.d.ts.map +1 -1
  8. package/library/constants/messages.js +1 -0
  9. package/library/core/client.d.ts +5 -0
  10. package/library/core/client.d.ts.map +1 -1
  11. package/library/core/client.js +54 -18
  12. package/library/core/response.d.ts.map +1 -1
  13. package/library/core/response.js +51 -32
  14. package/library/core/server.d.ts.map +1 -1
  15. package/library/core/server.js +10 -0
  16. package/library/index.d.ts +1 -1
  17. package/library/index.d.ts.map +1 -1
  18. package/library/index.js +7 -0
  19. package/library/message/channel.d.ts +2 -2
  20. package/library/message/channel.d.ts.map +1 -1
  21. package/library/message/channel.js +5 -1
  22. package/library/message/dispatcher.d.ts +2 -2
  23. package/library/message/dispatcher.d.ts.map +1 -1
  24. package/library/message/dispatcher.js +2 -2
  25. package/library/stream/writable-stream.d.ts.map +1 -1
  26. package/library/stream/writable-stream.js +81 -39
  27. package/library/types/index.d.ts +3 -1
  28. package/library/types/index.d.ts.map +1 -1
  29. package/library/utils/debug.d.ts.map +1 -1
  30. package/library/utils/debug.js +6 -2
  31. package/library/utils/error.d.ts +21 -0
  32. package/library/utils/error.d.ts.map +1 -0
  33. package/library/utils/error.js +34 -0
  34. package/library/utils/index.d.ts +7 -0
  35. package/library/utils/index.d.ts.map +1 -1
  36. package/library/utils/index.js +42 -1
  37. package/package.json +5 -4
  38. package/react/library/index.d.ts.map +1 -1
  39. package/react/library/index.js +4 -1
  40. package/library/__tests__/channel.test.ts +0 -420
  41. package/library/__tests__/coverage-branches.test.ts +0 -356
  42. package/library/__tests__/debug.test.ts +0 -588
  43. package/library/__tests__/dispatcher.test.ts +0 -481
  44. package/library/__tests__/interceptors.test.ts +0 -146
  45. package/library/__tests__/requestIframe.test.ts +0 -5384
  46. package/library/__tests__/server.test.ts +0 -738
  47. package/library/__tests__/stream.test.ts +0 -681
  48. package/library/__tests__/utils.test.ts +0 -433
  49. package/library/api/client.d.js +0 -5
  50. package/library/api/server.d.js +0 -5
  51. package/library/constants/index.d.js +0 -36
  52. package/library/constants/messages.d.js +0 -5
  53. package/library/core/client.d.js +0 -5
  54. package/library/core/message-handler.d.ts +0 -110
  55. package/library/core/message-handler.d.ts.map +0 -1
  56. package/library/core/message-handler.js +0 -320
  57. package/library/core/request-response.d.ts +0 -59
  58. package/library/core/request-response.d.ts.map +0 -1
  59. package/library/core/request-response.js +0 -337
  60. package/library/core/request.d.js +0 -5
  61. package/library/core/response.d.js +0 -5
  62. package/library/core/server-base.d.ts +0 -86
  63. package/library/core/server-base.d.ts.map +0 -1
  64. package/library/core/server-base.js +0 -257
  65. package/library/core/server-client.d.js +0 -5
  66. package/library/core/server-client.d.ts +0 -101
  67. package/library/core/server-client.d.ts.map +0 -1
  68. package/library/core/server-client.js +0 -266
  69. package/library/core/server.d.js +0 -5
  70. package/library/interceptors/index.d.js +0 -5
  71. package/library/message/channel.d.js +0 -5
  72. package/library/message/dispatcher.d.js +0 -5
  73. package/library/message/index.d.js +0 -25
  74. package/library/stream/file-stream.d.js +0 -4
  75. package/library/stream/index.d.js +0 -58
  76. package/library/stream/readable-stream.d.js +0 -5
  77. package/library/stream/types.d.js +0 -5
  78. package/library/stream/writable-stream.d.js +0 -5
  79. package/library/types/index.d.js +0 -5
  80. package/library/utils/cache.d.js +0 -5
  81. package/library/utils/cookie.d.js +0 -5
  82. package/library/utils/debug.d.js +0 -5
  83. package/library/utils/index.d.js +0 -94
  84. package/library/utils/path-match.d.js +0 -5
  85. package/library/utils/protocol.d.js +0 -5
  86. package/react/library/__tests__/index.test.d.ts +0 -2
  87. package/react/library/__tests__/index.test.d.ts.map +0 -1
  88. package/react/library/__tests__/index.test.tsx +0 -792
@@ -1,337 +0,0 @@
1
- "use strict";
2
-
3
- require("core-js/modules/es.array.filter.js");
4
- require("core-js/modules/es.object.get-own-property-descriptors.js");
5
- require("core-js/modules/web.dom-collections.for-each.js");
6
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports.ServerResponseImpl = exports.ServerRequestImpl = void 0;
11
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
- require("core-js/modules/es.array.includes.js");
16
- require("core-js/modules/es.array.iterator.js");
17
- require("core-js/modules/es.object.entries.js");
18
- require("core-js/modules/es.promise.js");
19
- require("core-js/modules/es.string.includes.js");
20
- require("core-js/modules/web.dom-collections.iterator.js");
21
- var _utils = require("../utils");
22
- var _constants = require("../constants");
23
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
24
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25
- /**
26
- * ServerRequest 实现
27
- */
28
- class ServerRequestImpl {
29
- constructor(data, event, response) {
30
- this.body = data.body;
31
- // headers 可能包含数组值(如 Set-Cookie),这里简化为 string
32
- this.headers = {};
33
- if (data.headers) {
34
- for (var _i = 0, _Object$entries = Object.entries(data.headers); _i < _Object$entries.length; _i++) {
35
- var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
36
- key = _Object$entries$_i[0],
37
- value = _Object$entries$_i[1];
38
- this.headers[key] = Array.isArray(value) ? value.join(', ') : value;
39
- }
40
- }
41
- this.cookies = data.cookies || {};
42
- this.path = data.path || '';
43
- this.requestId = data.requestId;
44
- this.origin = event.origin;
45
- this.source = event.source;
46
- this.res = response;
47
- }
48
- }
49
-
50
- /**
51
- * 等待客户端确认收到的回调
52
- */
53
- exports.ServerRequestImpl = ServerRequestImpl;
54
- /**
55
- * ServerResponse 实现
56
- */
57
- class ServerResponseImpl {
58
- constructor(requestId, path, uniqueKey, targetWindow, targetOrigin) {
59
- (0, _defineProperty2.default)(this, "statusCode", _constants.HttpStatus.OK);
60
- (0, _defineProperty2.default)(this, "headers", {});
61
- (0, _defineProperty2.default)(this, "_sent", false);
62
- this.requestId = requestId;
63
- this.path = path;
64
- this.uniqueKey = uniqueKey;
65
- this.targetWindow = targetWindow;
66
- this.targetOrigin = targetOrigin;
67
- }
68
-
69
- /**
70
- * 设置等待客户端确认的回调
71
- */
72
- _setOnAckCallback(callback) {
73
- this.onAckCallback = callback;
74
- }
75
-
76
- /**
77
- * 触发客户端确认回调
78
- */
79
- _triggerAck(received) {
80
- if (this.onAckCallback) {
81
- this.onAckCallback(received);
82
- this.onAckCallback = undefined;
83
- }
84
- }
85
- send(data, options) {
86
- var _options$requireAck;
87
- if (this._sent) return Promise.resolve(false);
88
- this._sent = true;
89
- var requireAck = (_options$requireAck = options === null || options === void 0 ? void 0 : options.requireAck) !== null && _options$requireAck !== void 0 ? _options$requireAck : false;
90
-
91
- // 如果不需要确认,直接发送并返回 true
92
- if (!requireAck) {
93
- this.targetWindow.postMessage((0, _utils.createPostMessage)(_constants.MessageType.RESPONSE, this.requestId, {
94
- path: this.path,
95
- uniqueKey: this.uniqueKey,
96
- data,
97
- status: this.statusCode,
98
- statusText: (0, _constants.getStatusText)(this.statusCode),
99
- headers: this.headers,
100
- requireAck: false
101
- }), this.targetOrigin);
102
- return Promise.resolve(true);
103
- }
104
-
105
- // 需要确认,等待客户端回复
106
- return new Promise(resolve => {
107
- this._setOnAckCallback(resolve);
108
- this.targetWindow.postMessage((0, _utils.createPostMessage)(_constants.MessageType.RESPONSE, this.requestId, {
109
- path: this.path,
110
- uniqueKey: this.uniqueKey,
111
- data,
112
- status: this.statusCode,
113
- statusText: (0, _constants.getStatusText)(this.statusCode),
114
- headers: this.headers,
115
- requireAck: true
116
- }), this.targetOrigin);
117
- });
118
- }
119
- json(data, options) {
120
- this.setHeader(_constants.HttpHeader.CONTENT_TYPE, 'application/json');
121
- return this.send(data, options);
122
- }
123
- sendFile(content, options) {
124
- var _this = this;
125
- return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
126
- var _options$requireAck2;
127
- var requireAck, base64Content, mimeType, fileName, fileHeaders, messageData;
128
- return _regenerator.default.wrap(function (_context) {
129
- while (1) switch (_context.prev = _context.next) {
130
- case 0:
131
- if (!_this._sent) {
132
- _context.next = 1;
133
- break;
134
- }
135
- return _context.abrupt("return", false);
136
- case 1:
137
- _this._sent = true;
138
- requireAck = (_options$requireAck2 = options === null || options === void 0 ? void 0 : options.requireAck) !== null && _options$requireAck2 !== void 0 ? _options$requireAck2 : false;
139
- mimeType = (options === null || options === void 0 ? void 0 : options.mimeType) || 'application/octet-stream';
140
- fileName = options === null || options === void 0 ? void 0 : options.fileName;
141
- if (!(typeof content === 'string')) {
142
- _context.next = 2;
143
- break;
144
- }
145
- // 如果是普通字符串,转换为 base64
146
- base64Content = btoa(unescape(encodeURIComponent(content)));
147
- _context.next = 6;
148
- break;
149
- case 2:
150
- if (!(content instanceof File)) {
151
- _context.next = 4;
152
- break;
153
- }
154
- mimeType = content.type || mimeType;
155
- fileName = fileName || content.name;
156
- _context.next = 3;
157
- return _this.blobToBase64(content);
158
- case 3:
159
- base64Content = _context.sent;
160
- _context.next = 6;
161
- break;
162
- case 4:
163
- _context.next = 5;
164
- return _this.blobToBase64(content);
165
- case 5:
166
- base64Content = _context.sent;
167
- case 6:
168
- // 合并文件相关的 headers
169
- fileHeaders = _objectSpread(_objectSpread({}, _this.headers), {}, {
170
- [_constants.HttpHeader.CONTENT_TYPE]: mimeType,
171
- [_constants.HttpHeader.CONTENT_DISPOSITION]: fileName ? `attachment; filename="${fileName}"` : 'attachment'
172
- });
173
- messageData = (0, _utils.createPostMessage)(_constants.MessageType.RESPONSE, _this.requestId, {
174
- path: _this.path,
175
- uniqueKey: _this.uniqueKey,
176
- status: _this.statusCode,
177
- statusText: (0, _constants.getStatusText)(_this.statusCode),
178
- headers: fileHeaders,
179
- fileData: {
180
- content: base64Content,
181
- mimeType,
182
- fileName
183
- },
184
- requireAck
185
- }); // 如果不需要确认,直接发送并返回 true
186
- if (requireAck) {
187
- _context.next = 7;
188
- break;
189
- }
190
- _this.targetWindow.postMessage(messageData, _this.targetOrigin);
191
- return _context.abrupt("return", true);
192
- case 7:
193
- return _context.abrupt("return", new Promise(resolve => {
194
- _this._setOnAckCallback(resolve);
195
- _this.targetWindow.postMessage(messageData, _this.targetOrigin);
196
- }));
197
- case 8:
198
- case "end":
199
- return _context.stop();
200
- }
201
- }, _callee);
202
- }))();
203
- }
204
-
205
- /**
206
- * 发送流响应
207
- * 将流绑定到当前请求上下文并启动流传输
208
- */
209
- sendStream(stream) {
210
- var _this2 = this;
211
- return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
212
- return _regenerator.default.wrap(function (_context2) {
213
- while (1) switch (_context2.prev = _context2.next) {
214
- case 0:
215
- if (!_this2._sent) {
216
- _context2.next = 1;
217
- break;
218
- }
219
- return _context2.abrupt("return");
220
- case 1:
221
- _this2._sent = true;
222
-
223
- // 绑定流到请求上下文
224
- stream._bind({
225
- requestId: _this2.requestId,
226
- targetWindow: _this2.targetWindow,
227
- targetOrigin: _this2.targetOrigin,
228
- uniqueKey: _this2.uniqueKey
229
- });
230
-
231
- // 启动流传输
232
- _context2.next = 2;
233
- return stream.start();
234
- case 2:
235
- case "end":
236
- return _context2.stop();
237
- }
238
- }, _callee2);
239
- }))();
240
- }
241
- status(code) {
242
- this.statusCode = code;
243
- return this;
244
- }
245
- setHeader(name, value) {
246
- // 与 Express 一致,返回 void
247
- // Set-Cookie 特殊处理,保持为数组
248
- if (name.toLowerCase() === _constants.HttpHeader.SET_COOKIE.toLowerCase()) {
249
- var existing = this.headers[_constants.HttpHeader.SET_COOKIE];
250
- if (Array.isArray(value)) {
251
- this.headers[_constants.HttpHeader.SET_COOKIE] = Array.isArray(existing) ? [...existing, ...value] : value;
252
- } else {
253
- var newValue = String(value);
254
- if (Array.isArray(existing)) {
255
- existing.push(newValue);
256
- } else {
257
- this.headers[_constants.HttpHeader.SET_COOKIE] = [newValue];
258
- }
259
- }
260
- } else if (Array.isArray(value)) {
261
- this.headers[name] = value.join(', ');
262
- } else {
263
- this.headers[name] = String(value);
264
- }
265
- }
266
- set(name, value) {
267
- // 链式调用版本,兼容 Express res.set
268
- this.setHeader(name, value);
269
- return this;
270
- }
271
- cookie(name, value, options) {
272
- /**
273
- * 设置 Cookie(类似 HTTP Set-Cookie)
274
- * 生成 Set-Cookie 字符串并添加到 headers[HttpHeader.SET_COOKIE] 数组中
275
- * 客户端收到后会解析并保存到 Cookie 存储中
276
- */
277
- var setCookieStr = (0, _utils.createSetCookie)(name, value, {
278
- path: options === null || options === void 0 ? void 0 : options.path,
279
- expires: options === null || options === void 0 ? void 0 : options.expires,
280
- maxAge: options === null || options === void 0 ? void 0 : options.maxAge,
281
- httpOnly: options === null || options === void 0 ? void 0 : options.httpOnly,
282
- secure: options === null || options === void 0 ? void 0 : options.secure,
283
- sameSite: (options === null || options === void 0 ? void 0 : options.sameSite) === true ? 'Strict' : (options === null || options === void 0 ? void 0 : options.sameSite) === false ? undefined : options === null || options === void 0 ? void 0 : options.sameSite
284
- });
285
-
286
- // 添加到 Set-Cookie header 数组
287
- var existing = this.headers[_constants.HttpHeader.SET_COOKIE];
288
- if (Array.isArray(existing)) {
289
- existing.push(setCookieStr);
290
- } else {
291
- this.headers[_constants.HttpHeader.SET_COOKIE] = [setCookieStr];
292
- }
293
- return this;
294
- }
295
- clearCookie(name, options) {
296
- /**
297
- * 清除指定的 Cookie
298
- * 生成一个过期的 Set-Cookie 字符串,客户端收到后会删除该 Cookie
299
- */
300
- var setCookieStr = (0, _utils.createClearCookie)(name, {
301
- path: options === null || options === void 0 ? void 0 : options.path
302
- });
303
-
304
- // 添加到 Set-Cookie header 数组
305
- var existing = this.headers[_constants.HttpHeader.SET_COOKIE];
306
- if (Array.isArray(existing)) {
307
- existing.push(setCookieStr);
308
- } else {
309
- this.headers[_constants.HttpHeader.SET_COOKIE] = [setCookieStr];
310
- }
311
- return this;
312
- }
313
- blobToBase64(blob) {
314
- return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
315
- return _regenerator.default.wrap(function (_context3) {
316
- while (1) switch (_context3.prev = _context3.next) {
317
- case 0:
318
- return _context3.abrupt("return", new Promise((resolve, reject) => {
319
- var reader = new FileReader();
320
- reader.onloadend = () => {
321
- var result = reader.result;
322
- // 移除 data URL 前缀(如 "data:image/png;base64,")
323
- var base64 = result.includes(',') ? result.split(',')[1] : result;
324
- resolve(base64);
325
- };
326
- reader.onerror = reject;
327
- reader.readAsDataURL(blob);
328
- }));
329
- case 1:
330
- case "end":
331
- return _context3.stop();
332
- }
333
- }, _callee3);
334
- }))();
335
- }
336
- }
337
- exports.ServerResponseImpl = ServerResponseImpl;
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
@@ -1,86 +0,0 @@
1
- import { PostMessageData, ServerEventName } from '../types';
2
- /**
3
- * server 内部事件监听器集合
4
- */
5
- type ServerListeners = Record<ServerEventName, Set<(payload: any, event?: MessageEvent) => void>>;
6
- /**
7
- * 等待客户端确认的响应
8
- */
9
- interface PendingAck {
10
- resolve: (received: boolean) => void;
11
- reject: (error: Error) => void;
12
- timeoutId: ReturnType<typeof setTimeout>;
13
- }
14
- /**
15
- * RequestIframeBaseServer 基类(封装基本的请求交互逻辑)
16
- */
17
- export declare abstract class RequestIframeBaseServer {
18
- protected readonly uniqueKey?: string;
19
- protected readonly ackTimeout: number;
20
- protected readonly listeners: ServerListeners;
21
- /** 等待客户端确认的响应 */
22
- protected readonly pendingAcks: Map<string, PendingAck>;
23
- /** 客户端等待响应的请求 */
24
- protected readonly pendingClientRequests: Map<string, {
25
- resolve: (data: PostMessageData) => void;
26
- reject: (error: Error) => void;
27
- origin?: string;
28
- }>;
29
- protected readonly onMessage: (event: MessageEvent) => void;
30
- constructor(options?: {
31
- uniqueKey?: string;
32
- ackTimeout?: number;
33
- });
34
- /**
35
- * 处理请求(由子类实现)
36
- */
37
- protected abstract handleRequest(data: PostMessageData, event: MessageEvent): void;
38
- /**
39
- * 处理客户端响应(ack、async、response、error)
40
- */
41
- protected handleClientResponse(data: PostMessageData, event: MessageEvent): void;
42
- /**
43
- * 处理客户端确认收到
44
- */
45
- protected handleReceived(data: PostMessageData): void;
46
- /**
47
- * 处理 ping 请求(用于 isConnect)
48
- */
49
- protected handlePing(data: PostMessageData, event: MessageEvent): void;
50
- /**
51
- * 处理 pong 响应(用于 isConnect)
52
- */
53
- protected handlePong(data: PostMessageData, event: MessageEvent): void;
54
- /**
55
- * 注册等待客户端确认的响应
56
- */
57
- _registerPendingAck(requestId: string, resolve: (received: boolean) => void, reject: (error: Error) => void): void;
58
- /**
59
- * 内部方法:监听底层事件
60
- */
61
- _on(event: ServerEventName, fn: (payload: any, messageEvent?: MessageEvent) => void): void;
62
- /**
63
- * 内部方法:取消监听底层事件
64
- */
65
- _off(event: ServerEventName, fn?: (payload: any, messageEvent?: MessageEvent) => void): void;
66
- /**
67
- * 内部方法:供 client 注册等待响应的 Promise
68
- */
69
- _registerPendingRequest(requestId: string, resolve: (data: PostMessageData) => void, reject: (error: Error) => void, origin?: string): void;
70
- /**
71
- * 内部方法:供 client 取消等待
72
- */
73
- _unregisterPendingRequest(requestId: string): void;
74
- /**
75
- * 销毁 server(移除 message 监听)
76
- */
77
- destroy(): void;
78
- protected emit(event: ServerEventName, payload: any, messageEvent?: MessageEvent): void;
79
- protected prefixPath(path: string): string;
80
- /**
81
- * 发送协议版本不兼容错误(版本过低)
82
- */
83
- protected sendProtocolError(data: PostMessageData, event: MessageEvent, remoteVersion: number): void;
84
- }
85
- export {};
86
- //# sourceMappingURL=server-base.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-base.d.ts","sourceRoot":"","sources":["../../src/core/server-base.ts"],"names":[],"mappings":"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"}
@@ -1,257 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.RequestIframeBaseServer = void 0;
8
- require("core-js/modules/es.array.iterator.js");
9
- require("core-js/modules/es.map.js");
10
- require("core-js/modules/es.set.js");
11
- require("core-js/modules/web.dom-collections.for-each.js");
12
- require("core-js/modules/web.dom-collections.iterator.js");
13
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
- var _utils = require("../utils");
15
- var _constants = require("../constants");
16
- /**
17
- * server 内部事件监听器集合
18
- */
19
-
20
- /**
21
- * 等待客户端确认的响应
22
- */
23
-
24
- /**
25
- * RequestIframeBaseServer 基类(封装基本的请求交互逻辑)
26
- */
27
- class RequestIframeBaseServer {
28
- constructor(options) {
29
- var _options$ackTimeout;
30
- (0, _defineProperty2.default)(this, "listeners", {
31
- request: new Set(),
32
- ack: new Set(),
33
- async: new Set(),
34
- response: new Set(),
35
- error: new Set(),
36
- received: new Set(),
37
- ping: new Set(),
38
- pong: new Set()
39
- });
40
- /** 等待客户端确认的响应 */
41
- (0, _defineProperty2.default)(this, "pendingAcks", new Map());
42
- /** 客户端等待响应的请求 */
43
- (0, _defineProperty2.default)(this, "pendingClientRequests", new Map());
44
- (0, _defineProperty2.default)(this, "onMessage", event => {
45
- var data = event.data;
46
-
47
- // 检查是否是 request-iframe 框架的消息(基本格式验证)
48
- if (!(0, _utils.isValidPostMessage)(data)) {
49
- return;
50
- }
51
-
52
- // 检查协议版本兼容性
53
- var version = (0, _utils.getProtocolVersion)(data);
54
- if (version !== undefined && !(0, _utils.isCompatibleVersion)(version)) {
55
- // 协议版本不兼容,通知对方
56
- this.sendProtocolError(data, event, version);
57
- return;
58
- }
59
-
60
- // uniqueKey 隔离:不匹配则忽略
61
- if (this.uniqueKey) {
62
- if (data.uniqueKey !== this.uniqueKey) return;
63
- } else {
64
- if (data.uniqueKey) return;
65
- }
66
-
67
- // 触发框架内部事件监听器
68
- this.emit(data.type, data, event);
69
-
70
- // 处理请求(由子类实现)
71
- if (data.type === _constants.MessageType.REQUEST) {
72
- this.handleRequest(data, event);
73
- return;
74
- }
75
-
76
- // 处理响应和错误(供 client 使用)
77
- if (data.type === _constants.MessageType.RESPONSE || data.type === _constants.MessageType.ERROR || data.type === _constants.MessageType.ACK || data.type === _constants.MessageType.ASYNC) {
78
- this.handleClientResponse(data, event);
79
- return;
80
- }
81
-
82
- // 处理客户端确认收到(received)
83
- if (data.type === _constants.MessageType.RECEIVED) {
84
- this.handleReceived(data);
85
- return;
86
- }
87
-
88
- // 处理 ping(用于 isConnect)
89
- if (data.type === _constants.MessageType.PING) {
90
- this.handlePing(data, event);
91
- return;
92
- }
93
-
94
- // 处理 pong(用于 isConnect)
95
- if (data.type === _constants.MessageType.PONG) {
96
- this.handlePong(data, event);
97
- return;
98
- }
99
- });
100
- this.uniqueKey = options === null || options === void 0 ? void 0 : options.uniqueKey;
101
- this.ackTimeout = (_options$ackTimeout = options === null || options === void 0 ? void 0 : options.ackTimeout) !== null && _options$ackTimeout !== void 0 ? _options$ackTimeout : _constants.DefaultTimeout.SERVER_ACK;
102
- window.addEventListener('message', this.onMessage);
103
- }
104
-
105
- /**
106
- * 处理请求(由子类实现)
107
- */
108
-
109
- /**
110
- * 处理客户端响应(ack、async、response、error)
111
- */
112
- handleClientResponse(data, event) {
113
- var pending = this.pendingClientRequests.get(data.requestId);
114
- if (pending) {
115
- // 验证 origin(如果指定了)
116
- if (pending.origin && pending.origin !== '*' && event.origin !== pending.origin) {
117
- return;
118
- }
119
- // 对于 ack 和 async,不删除 pending,只触发回调
120
- if (data.type === _constants.MessageType.ACK || data.type === _constants.MessageType.ASYNC) {
121
- pending.resolve(data);
122
- return;
123
- }
124
- // 对于 response 和 error,删除 pending 并触发回调
125
- this.pendingClientRequests.delete(data.requestId);
126
- pending.resolve(data);
127
- }
128
- }
129
-
130
- /**
131
- * 处理客户端确认收到
132
- */
133
- handleReceived(data) {
134
- var pending = this.pendingAcks.get(data.requestId);
135
- if (pending) {
136
- clearTimeout(pending.timeoutId);
137
- this.pendingAcks.delete(data.requestId);
138
- pending.resolve(true);
139
- }
140
- }
141
-
142
- /**
143
- * 处理 ping 请求(用于 isConnect)
144
- */
145
- handlePing(data, event) {
146
- if (!event.source) return;
147
- event.source.postMessage((0, _utils.createPostMessage)(_constants.MessageType.PONG, data.requestId, {
148
- uniqueKey: data.uniqueKey
149
- }), event.origin);
150
- }
151
-
152
- /**
153
- * 处理 pong 响应(用于 isConnect)
154
- */
155
- handlePong(data, event) {
156
- var pending = this.pendingClientRequests.get(data.requestId);
157
- if (pending) {
158
- if (pending.origin && pending.origin !== '*' && event.origin !== pending.origin) {
159
- return;
160
- }
161
- this.pendingClientRequests.delete(data.requestId);
162
- pending.resolve(data);
163
- }
164
- }
165
-
166
- /**
167
- * 注册等待客户端确认的响应
168
- */
169
- _registerPendingAck(requestId, resolve, reject) {
170
- var timeoutId = setTimeout(() => {
171
- this.pendingAcks.delete(requestId);
172
- resolve(false); // 超时未收到确认,但不报错
173
- }, this.ackTimeout);
174
- this.pendingAcks.set(requestId, {
175
- resolve,
176
- reject,
177
- timeoutId
178
- });
179
- }
180
-
181
- /**
182
- * 内部方法:监听底层事件
183
- */
184
- _on(event, fn) {
185
- this.listeners[event].add(fn);
186
- }
187
-
188
- /**
189
- * 内部方法:取消监听底层事件
190
- */
191
- _off(event, fn) {
192
- if (!fn) {
193
- this.listeners[event].clear();
194
- return;
195
- }
196
- this.listeners[event].delete(fn);
197
- }
198
-
199
- /**
200
- * 内部方法:供 client 注册等待响应的 Promise
201
- */
202
- _registerPendingRequest(requestId, resolve, reject, origin) {
203
- this.pendingClientRequests.set(requestId, {
204
- resolve,
205
- reject,
206
- origin
207
- });
208
- }
209
-
210
- /**
211
- * 内部方法:供 client 取消等待
212
- */
213
- _unregisterPendingRequest(requestId) {
214
- this.pendingClientRequests.delete(requestId);
215
- }
216
-
217
- /**
218
- * 销毁 server(移除 message 监听)
219
- */
220
- destroy() {
221
- window.removeEventListener('message', this.onMessage);
222
- this.pendingClientRequests.clear();
223
- this.pendingAcks.forEach(pending => clearTimeout(pending.timeoutId));
224
- this.pendingAcks.clear();
225
- Object.keys(this.listeners).forEach(k => this.listeners[k].clear());
226
- }
227
- emit(event, payload, messageEvent) {
228
- this.listeners[event].forEach(fn => {
229
- try {
230
- fn(payload, messageEvent);
231
- } catch (e) {
232
- // 忽略监听器异常
233
- }
234
- });
235
- }
236
- prefixPath(path) {
237
- return this.uniqueKey ? `${this.uniqueKey}:${path}` : path;
238
- }
239
-
240
- /**
241
- * 发送协议版本不兼容错误(版本过低)
242
- */
243
- sendProtocolError(data, event, remoteVersion) {
244
- if (!event.source) return;
245
- event.source.postMessage((0, _utils.createPostMessage)(_constants.MessageType.ERROR, data.requestId, {
246
- path: data.path,
247
- uniqueKey: data.uniqueKey,
248
- status: _constants.HttpStatus.BAD_REQUEST,
249
- statusText: _constants.Messages.PROTOCOL_VERSION_UNSUPPORTED,
250
- error: {
251
- message: (0, _constants.formatMessage)(_constants.Messages.PROTOCOL_VERSION_TOO_LOW, remoteVersion, _constants.ProtocolVersion.MIN_SUPPORTED),
252
- code: _constants.ErrorCode.PROTOCOL_UNSUPPORTED
253
- }
254
- }), event.origin);
255
- }
256
- }
257
- exports.RequestIframeBaseServer = RequestIframeBaseServer;