request-iframe 0.0.1 → 0.0.3
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/README.CN.md +271 -12
- package/README.md +268 -11
- package/library/__tests__/channel.test.ts +420 -0
- package/library/__tests__/debug.test.ts +588 -0
- package/library/__tests__/dispatcher.test.ts +481 -0
- package/library/__tests__/interceptors.test.ts +22 -0
- package/library/__tests__/requestIframe.test.ts +2317 -99
- package/library/__tests__/server.test.ts +738 -0
- package/library/api/client.d.js +5 -0
- package/library/api/client.d.ts.map +1 -1
- package/library/api/client.js +11 -6
- package/library/api/server.d.js +5 -0
- package/library/api/server.d.ts +4 -3
- package/library/api/server.d.ts.map +1 -1
- package/library/api/server.js +25 -7
- package/library/constants/index.d.js +36 -0
- package/library/constants/index.d.ts +14 -4
- package/library/constants/index.d.ts.map +1 -1
- package/library/constants/index.js +15 -7
- package/library/constants/messages.d.js +5 -0
- package/library/constants/messages.d.ts +35 -0
- package/library/constants/messages.d.ts.map +1 -1
- package/library/constants/messages.js +36 -1
- package/library/core/client-server.d.ts +101 -0
- package/library/core/client-server.d.ts.map +1 -0
- package/library/core/client-server.js +266 -0
- package/library/core/client.d.js +5 -0
- package/library/core/client.d.ts +38 -6
- package/library/core/client.d.ts.map +1 -1
- package/library/core/client.js +198 -24
- package/library/core/request.d.js +5 -0
- package/library/core/response.d.js +5 -0
- package/library/core/response.d.ts +5 -1
- package/library/core/response.d.ts.map +1 -1
- package/library/core/response.js +85 -70
- package/library/core/server-client.d.js +5 -0
- package/library/core/server-client.d.ts +3 -1
- package/library/core/server-client.d.ts.map +1 -1
- package/library/core/server-client.js +19 -9
- package/library/core/server.d.js +5 -0
- package/library/core/server.d.ts +11 -3
- package/library/core/server.d.ts.map +1 -1
- package/library/core/server.js +112 -54
- package/library/index.d.ts +1 -1
- package/library/index.js +2 -2
- package/library/interceptors/index.d.js +5 -0
- package/library/interceptors/index.d.ts +4 -0
- package/library/interceptors/index.d.ts.map +1 -1
- package/library/interceptors/index.js +7 -0
- package/library/message/channel.d.js +5 -0
- package/library/message/channel.d.ts +3 -1
- package/library/message/channel.d.ts.map +1 -1
- package/library/message/dispatcher.d.js +5 -0
- package/library/message/dispatcher.d.ts +7 -2
- package/library/message/dispatcher.d.ts.map +1 -1
- package/library/message/dispatcher.js +47 -2
- package/library/message/index.d.js +25 -0
- package/library/stream/file-stream.d.js +4 -0
- package/library/stream/file-stream.d.ts +5 -0
- package/library/stream/file-stream.d.ts.map +1 -1
- package/library/stream/file-stream.js +41 -12
- package/library/stream/index.d.js +58 -0
- package/library/stream/readable-stream.d.js +5 -0
- package/library/stream/readable-stream.d.ts.map +1 -1
- package/library/stream/readable-stream.js +32 -30
- package/library/stream/types.d.js +5 -0
- package/library/stream/types.d.ts +18 -0
- package/library/stream/types.d.ts.map +1 -1
- package/library/stream/writable-stream.d.js +5 -0
- package/library/stream/writable-stream.d.ts +1 -0
- package/library/stream/writable-stream.d.ts.map +1 -1
- package/library/stream/writable-stream.js +7 -2
- package/library/types/index.d.js +5 -0
- package/library/types/index.d.ts +79 -19
- package/library/types/index.d.ts.map +1 -1
- package/library/utils/cache.d.js +5 -0
- package/library/utils/cache.d.ts +24 -0
- package/library/utils/cache.d.ts.map +1 -1
- package/library/utils/cache.js +76 -0
- package/library/utils/cookie.d.js +5 -0
- package/library/utils/debug.d.js +5 -0
- package/library/utils/debug.d.ts.map +1 -1
- package/library/utils/debug.js +382 -20
- package/library/utils/index.d.js +94 -0
- package/library/utils/index.d.ts +5 -0
- package/library/utils/index.d.ts.map +1 -1
- package/library/utils/index.js +14 -1
- package/library/utils/path-match.d.js +5 -0
- package/library/utils/protocol.d.js +5 -0
- package/package.json +16 -2
- package/react/library/__tests__/index.test.d.ts +2 -0
- package/react/library/__tests__/index.test.d.ts.map +1 -0
- package/react/library/__tests__/index.test.tsx +770 -0
- package/react/library/index.d.ts +118 -0
- package/react/library/index.d.ts.map +1 -0
- package/react/library/index.js +232 -0
package/library/core/response.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
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
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
7
4
|
Object.defineProperty(exports, "__esModule", {
|
|
8
5
|
value: true
|
|
@@ -18,8 +15,7 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
18
15
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
16
|
var _utils = require("../utils");
|
|
20
17
|
var _constants = require("../constants");
|
|
21
|
-
|
|
22
|
-
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; }
|
|
18
|
+
var _stream = require("../stream");
|
|
23
19
|
/**
|
|
24
20
|
* Callback waiting for client acknowledgment
|
|
25
21
|
*/
|
|
@@ -28,7 +24,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
28
24
|
* ServerResponse implementation
|
|
29
25
|
*/
|
|
30
26
|
class ServerResponseImpl {
|
|
31
|
-
constructor(requestId, path, secretKey, targetWindow, targetOrigin, channel) {
|
|
27
|
+
constructor(requestId, path, secretKey, targetWindow, targetOrigin, channel, serverId, targetId) {
|
|
32
28
|
(0, _defineProperty2.default)(this, "statusCode", _constants.HttpStatus.OK);
|
|
33
29
|
(0, _defineProperty2.default)(this, "headers", {});
|
|
34
30
|
(0, _defineProperty2.default)(this, "_sent", false);
|
|
@@ -38,6 +34,8 @@ class ServerResponseImpl {
|
|
|
38
34
|
this.targetWindow = targetWindow;
|
|
39
35
|
this.targetOrigin = targetOrigin;
|
|
40
36
|
this.channel = channel;
|
|
37
|
+
this.serverId = serverId;
|
|
38
|
+
this.targetId = targetId;
|
|
41
39
|
}
|
|
42
40
|
|
|
43
41
|
/**
|
|
@@ -82,7 +80,10 @@ class ServerResponseImpl {
|
|
|
82
80
|
status: this.statusCode,
|
|
83
81
|
statusText: (0, _constants.getStatusText)(this.statusCode),
|
|
84
82
|
headers: this.headers,
|
|
85
|
-
requireAck: false
|
|
83
|
+
requireAck: false,
|
|
84
|
+
role: _constants.MessageRole.SERVER,
|
|
85
|
+
creatorId: this.serverId,
|
|
86
|
+
targetId: this.targetId
|
|
86
87
|
}));
|
|
87
88
|
return Promise.resolve(true);
|
|
88
89
|
}
|
|
@@ -97,7 +98,10 @@ class ServerResponseImpl {
|
|
|
97
98
|
status: this.statusCode,
|
|
98
99
|
statusText: (0, _constants.getStatusText)(this.statusCode),
|
|
99
100
|
headers: this.headers,
|
|
100
|
-
requireAck: true
|
|
101
|
+
requireAck: true,
|
|
102
|
+
role: _constants.MessageRole.SERVER,
|
|
103
|
+
creatorId: this.serverId,
|
|
104
|
+
targetId: this.targetId
|
|
101
105
|
}));
|
|
102
106
|
});
|
|
103
107
|
}
|
|
@@ -107,83 +111,92 @@ class ServerResponseImpl {
|
|
|
107
111
|
}
|
|
108
112
|
sendFile(content, options) {
|
|
109
113
|
var _this = this;
|
|
110
|
-
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function
|
|
111
|
-
var
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
while (1) switch (_context.prev = _context.next) {
|
|
114
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
115
|
+
var mimeType, fileName, fileContent, stream;
|
|
116
|
+
return _regenerator.default.wrap(function (_context2) {
|
|
117
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
115
118
|
case 0:
|
|
116
119
|
if (!_this._sent) {
|
|
117
|
-
|
|
120
|
+
_context2.next = 1;
|
|
118
121
|
break;
|
|
119
122
|
}
|
|
120
|
-
return
|
|
123
|
+
return _context2.abrupt("return", false);
|
|
121
124
|
case 1:
|
|
122
|
-
_this._sent = true;
|
|
123
|
-
requireAck = (_options$requireAck2 = options === null || options === void 0 ? void 0 : options.requireAck) !== null && _options$requireAck2 !== void 0 ? _options$requireAck2 : false;
|
|
124
125
|
mimeType = (options === null || options === void 0 ? void 0 : options.mimeType) || 'application/octet-stream';
|
|
125
126
|
fileName = options === null || options === void 0 ? void 0 : options.fileName;
|
|
126
127
|
if (!(typeof content === 'string')) {
|
|
127
|
-
|
|
128
|
+
_context2.next = 2;
|
|
128
129
|
break;
|
|
129
130
|
}
|
|
130
131
|
// If it's a plain string, convert to base64
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
fileContent = btoa(unescape(encodeURIComponent(content)));
|
|
133
|
+
_context2.next = 6;
|
|
133
134
|
break;
|
|
134
135
|
case 2:
|
|
135
136
|
if (!(content instanceof File)) {
|
|
136
|
-
|
|
137
|
+
_context2.next = 4;
|
|
137
138
|
break;
|
|
138
139
|
}
|
|
139
140
|
mimeType = content.type || mimeType;
|
|
140
141
|
fileName = fileName || content.name;
|
|
141
|
-
|
|
142
|
+
_context2.next = 3;
|
|
142
143
|
return _this.blobToBase64(content);
|
|
143
144
|
case 3:
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
fileContent = _context2.sent;
|
|
146
|
+
_context2.next = 6;
|
|
146
147
|
break;
|
|
147
148
|
case 4:
|
|
148
|
-
|
|
149
|
+
_context2.next = 5;
|
|
149
150
|
return _this.blobToBase64(content);
|
|
150
151
|
case 5:
|
|
151
|
-
|
|
152
|
+
fileContent = _context2.sent;
|
|
152
153
|
case 6:
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
path: _this.path,
|
|
160
|
-
secretKey: _this.secretKey,
|
|
161
|
-
status: _this.statusCode,
|
|
162
|
-
statusText: (0, _constants.getStatusText)(_this.statusCode),
|
|
163
|
-
headers: fileHeaders,
|
|
164
|
-
fileData: {
|
|
165
|
-
content: base64Content,
|
|
166
|
-
mimeType,
|
|
167
|
-
fileName
|
|
168
|
-
},
|
|
169
|
-
requireAck
|
|
170
|
-
}); // If acknowledgment not required, send directly and return true
|
|
171
|
-
if (requireAck) {
|
|
172
|
-
_context.next = 7;
|
|
173
|
-
break;
|
|
154
|
+
// Set file-related headers
|
|
155
|
+
_this.setHeader(_constants.HttpHeader.CONTENT_TYPE, mimeType);
|
|
156
|
+
if (fileName) {
|
|
157
|
+
_this.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, `attachment; filename="${fileName}"`);
|
|
158
|
+
} else {
|
|
159
|
+
_this.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, 'attachment');
|
|
174
160
|
}
|
|
175
|
-
|
|
176
|
-
|
|
161
|
+
|
|
162
|
+
// Create file stream with autoResolve enabled
|
|
163
|
+
stream = new _stream.IframeFileWritableStream({
|
|
164
|
+
filename: fileName || 'file',
|
|
165
|
+
mimeType,
|
|
166
|
+
chunked: false,
|
|
167
|
+
// File is sent in one chunk
|
|
168
|
+
autoResolve: true,
|
|
169
|
+
// Client will automatically resolve to fileData
|
|
170
|
+
next: function () {
|
|
171
|
+
var _next = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
172
|
+
return _regenerator.default.wrap(function (_context) {
|
|
173
|
+
while (1) switch (_context.prev = _context.next) {
|
|
174
|
+
case 0:
|
|
175
|
+
return _context.abrupt("return", {
|
|
176
|
+
data: fileContent,
|
|
177
|
+
done: true
|
|
178
|
+
});
|
|
179
|
+
case 1:
|
|
180
|
+
case "end":
|
|
181
|
+
return _context.stop();
|
|
182
|
+
}
|
|
183
|
+
}, _callee);
|
|
184
|
+
}));
|
|
185
|
+
function next() {
|
|
186
|
+
return _next.apply(this, arguments);
|
|
187
|
+
}
|
|
188
|
+
return next;
|
|
189
|
+
}()
|
|
190
|
+
}); // Send stream (this will handle the requireAck logic internally and set _sent)
|
|
191
|
+
_context2.next = 7;
|
|
192
|
+
return _this.sendStream(stream);
|
|
177
193
|
case 7:
|
|
178
|
-
return
|
|
179
|
-
_this._setOnAckCallback(resolve);
|
|
180
|
-
_this.sendMessage(messageData);
|
|
181
|
-
}));
|
|
194
|
+
return _context2.abrupt("return", true);
|
|
182
195
|
case 8:
|
|
183
196
|
case "end":
|
|
184
|
-
return
|
|
197
|
+
return _context2.stop();
|
|
185
198
|
}
|
|
186
|
-
},
|
|
199
|
+
}, _callee2);
|
|
187
200
|
}))();
|
|
188
201
|
}
|
|
189
202
|
|
|
@@ -193,15 +206,15 @@ class ServerResponseImpl {
|
|
|
193
206
|
*/
|
|
194
207
|
sendStream(stream) {
|
|
195
208
|
var _this2 = this;
|
|
196
|
-
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function
|
|
197
|
-
return _regenerator.default.wrap(function (
|
|
198
|
-
while (1) switch (
|
|
209
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
|
|
210
|
+
return _regenerator.default.wrap(function (_context3) {
|
|
211
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
199
212
|
case 0:
|
|
200
213
|
if (!_this2._sent) {
|
|
201
|
-
|
|
214
|
+
_context3.next = 1;
|
|
202
215
|
break;
|
|
203
216
|
}
|
|
204
|
-
return
|
|
217
|
+
return _context3.abrupt("return");
|
|
205
218
|
case 1:
|
|
206
219
|
_this2._sent = true;
|
|
207
220
|
|
|
@@ -211,17 +224,19 @@ class ServerResponseImpl {
|
|
|
211
224
|
targetWindow: _this2.targetWindow,
|
|
212
225
|
targetOrigin: _this2.targetOrigin,
|
|
213
226
|
secretKey: _this2.secretKey,
|
|
214
|
-
channel: _this2.channel
|
|
227
|
+
channel: _this2.channel,
|
|
228
|
+
serverId: _this2.serverId,
|
|
229
|
+
targetId: _this2.targetId
|
|
215
230
|
});
|
|
216
231
|
|
|
217
232
|
// Start stream transmission
|
|
218
|
-
|
|
233
|
+
_context3.next = 2;
|
|
219
234
|
return stream.start();
|
|
220
235
|
case 2:
|
|
221
236
|
case "end":
|
|
222
|
-
return
|
|
237
|
+
return _context3.stop();
|
|
223
238
|
}
|
|
224
|
-
},
|
|
239
|
+
}, _callee3);
|
|
225
240
|
}))();
|
|
226
241
|
}
|
|
227
242
|
status(code) {
|
|
@@ -297,11 +312,11 @@ class ServerResponseImpl {
|
|
|
297
312
|
return this;
|
|
298
313
|
}
|
|
299
314
|
blobToBase64(blob) {
|
|
300
|
-
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function
|
|
301
|
-
return _regenerator.default.wrap(function (
|
|
302
|
-
while (1) switch (
|
|
315
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
|
|
316
|
+
return _regenerator.default.wrap(function (_context4) {
|
|
317
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
303
318
|
case 0:
|
|
304
|
-
return
|
|
319
|
+
return _context4.abrupt("return", new Promise((resolve, reject) => {
|
|
305
320
|
var reader = new FileReader();
|
|
306
321
|
reader.onloadend = () => {
|
|
307
322
|
var result = reader.result;
|
|
@@ -314,9 +329,9 @@ class ServerResponseImpl {
|
|
|
314
329
|
}));
|
|
315
330
|
case 1:
|
|
316
331
|
case "end":
|
|
317
|
-
return
|
|
332
|
+
return _context4.stop();
|
|
318
333
|
}
|
|
319
|
-
},
|
|
334
|
+
}, _callee4);
|
|
320
335
|
}))();
|
|
321
336
|
}
|
|
322
337
|
}
|
|
@@ -14,6 +14,8 @@ export interface ClientServerOptions {
|
|
|
14
14
|
ackTimeout?: number;
|
|
15
15
|
/** Protocol version validator (optional, uses built-in validation by default) */
|
|
16
16
|
versionValidator?: VersionValidator;
|
|
17
|
+
/** Whether to automatically open when creating the client server. Default is true. */
|
|
18
|
+
autoOpen?: boolean;
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
21
|
* RequestIframeClientServer - Client-side message server
|
|
@@ -34,7 +36,7 @@ export declare class RequestIframeClientServer {
|
|
|
34
36
|
private readonly unregisterFns;
|
|
35
37
|
/** Whether opened */
|
|
36
38
|
private _isOpen;
|
|
37
|
-
constructor(options?: ClientServerOptions);
|
|
39
|
+
constructor(options?: ClientServerOptions, instanceId?: string);
|
|
38
40
|
/**
|
|
39
41
|
* Open message handling (register message handlers)
|
|
40
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-client.d.ts","sourceRoot":"","sources":["../../src/core/server-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAoB7F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server-client.d.ts","sourceRoot":"","sources":["../../src/core/server-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAoB7F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,sFAAsF;IACtF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IAErE,8BAA8B;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAwB;IAE/C,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,qBAAqB;IACrB,OAAO,CAAC,OAAO,CAAS;gBAEL,OAAO,CAAC,EAAE,mBAAmB,EAAE,UAAU,CAAC,EAAE,MAAM;IAcrE;;OAEG;IACI,IAAI,IAAI,IAAI;IAMnB;;OAEG;IACI,KAAK,IAAI,IAAI;IASpB;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoFxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAI/D,oBAAoB;IACpB,IAAW,SAAS,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED,2CAA2C;IAC3C,IAAW,iBAAiB,IAAI,iBAAiB,CAEhD;IAED;;OAEG;IACI,mBAAmB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,EACpC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC7B,IAAI;IASP;;OAEG;IACI,uBAAuB,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,EACxC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,IAAI;IAIP;;OAEG;IACI,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIzD;;OAEG;IACI,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIpF;;OAEG;IACI,OAAO,IAAI,IAAI;CAavB"}
|
|
@@ -37,7 +37,7 @@ var _constants = require("../constants");
|
|
|
37
37
|
* Uses shared MessageDispatcher (backed by MessageChannel) to listen for and send messages
|
|
38
38
|
*/
|
|
39
39
|
class RequestIframeClientServer {
|
|
40
|
-
constructor(options) {
|
|
40
|
+
constructor(options, instanceId) {
|
|
41
41
|
var _options$ackTimeout, _options$versionValid;
|
|
42
42
|
/** Pending responses awaiting client acknowledgment */
|
|
43
43
|
(0, _defineProperty2.default)(this, "pendingAcks", new Map());
|
|
@@ -47,15 +47,17 @@ class RequestIframeClientServer {
|
|
|
47
47
|
(0, _defineProperty2.default)(this, "unregisterFns", []);
|
|
48
48
|
/** Whether opened */
|
|
49
49
|
(0, _defineProperty2.default)(this, "_isOpen", false);
|
|
50
|
-
this.ackTimeout = (_options$ackTimeout = options === null || options === void 0 ? void 0 : options.ackTimeout) !== null && _options$ackTimeout !== void 0 ? _options$ackTimeout : _constants.DefaultTimeout.
|
|
50
|
+
this.ackTimeout = (_options$ackTimeout = options === null || options === void 0 ? void 0 : options.ackTimeout) !== null && _options$ackTimeout !== void 0 ? _options$ackTimeout : _constants.DefaultTimeout.ACK;
|
|
51
51
|
this.versionValidator = (_options$versionValid = options === null || options === void 0 ? void 0 : options.versionValidator) !== null && _options$versionValid !== void 0 ? _options$versionValid : _utils.isCompatibleVersion;
|
|
52
52
|
|
|
53
53
|
// Get or create shared channel and create dispatcher
|
|
54
54
|
var channel = (0, _cache.getOrCreateMessageChannel)(options === null || options === void 0 ? void 0 : options.secretKey);
|
|
55
|
-
this.dispatcher = new _message.MessageDispatcher(channel);
|
|
55
|
+
this.dispatcher = new _message.MessageDispatcher(channel, _constants.MessageRole.CLIENT, instanceId);
|
|
56
56
|
|
|
57
|
-
// Auto-open by default
|
|
58
|
-
|
|
57
|
+
// Auto-open by default (unless explicitly set to false)
|
|
58
|
+
if ((options === null || options === void 0 ? void 0 : options.autoOpen) !== false) {
|
|
59
|
+
this.open();
|
|
60
|
+
}
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
/**
|
|
@@ -113,8 +115,16 @@ class RequestIframeClientServer {
|
|
|
113
115
|
// Handle PONG messages
|
|
114
116
|
this.unregisterFns.push(this.dispatcher.registerHandler(_constants.MessageType.PONG, (data, context) => this.handlePong(data, context), handlerOptions));
|
|
115
117
|
|
|
116
|
-
// Handle
|
|
117
|
-
|
|
118
|
+
// Handle stream_start messages (route to handleClientResponse so it reaches send callback)
|
|
119
|
+
// Note: stream_start is handled in send callback, not through streamCallback
|
|
120
|
+
this.unregisterFns.push(this.dispatcher.registerHandler(_constants.MessageType.STREAM_START, (data, context) => {
|
|
121
|
+
// Route to handleClientResponse so it reaches send callback
|
|
122
|
+
this.handleClientResponse(data, context);
|
|
123
|
+
// Don't call streamCallback here - stream_start is handled in send callback
|
|
124
|
+
}, handlerOptions));
|
|
125
|
+
|
|
126
|
+
// Handle other stream messages (stream_data, stream_end, etc.)
|
|
127
|
+
this.unregisterFns.push(this.dispatcher.registerHandler(type => type.startsWith('stream_') && type !== _constants.MessageType.STREAM_START, (data, context) => {
|
|
118
128
|
var _this$streamCallback;
|
|
119
129
|
return (_this$streamCallback = this.streamCallback) === null || _this$streamCallback === void 0 ? void 0 : _this$streamCallback.call(this, data, context);
|
|
120
130
|
}, handlerOptions));
|
|
@@ -142,8 +152,8 @@ class RequestIframeClientServer {
|
|
|
142
152
|
if (pending.origin && pending.origin !== '*' && context.origin !== pending.origin) {
|
|
143
153
|
return;
|
|
144
154
|
}
|
|
145
|
-
// ack and
|
|
146
|
-
if (data.type === _constants.MessageType.ACK || data.type === _constants.MessageType.ASYNC) {
|
|
155
|
+
// ack, async, and stream_start don't delete pending (stream_start needs to keep pending for stream_data/stream_end)
|
|
156
|
+
if (data.type === _constants.MessageType.ACK || data.type === _constants.MessageType.ASYNC || data.type === _constants.MessageType.STREAM_START) {
|
|
147
157
|
pending.resolve(data);
|
|
148
158
|
return;
|
|
149
159
|
}
|
package/library/core/server.d.ts
CHANGED
|
@@ -6,16 +6,22 @@ import { MessageDispatcher, VersionValidator } from '../message';
|
|
|
6
6
|
export interface ServerOptions {
|
|
7
7
|
/** Message isolation secret key */
|
|
8
8
|
secretKey?: string;
|
|
9
|
+
/** Custom server instance ID (if specified, server will use this ID instead of generating one) */
|
|
10
|
+
id?: string;
|
|
9
11
|
/** ACK timeout duration */
|
|
10
12
|
ackTimeout?: number;
|
|
11
13
|
/** Protocol version validator (optional, uses built-in validator by default) */
|
|
12
14
|
versionValidator?: VersionValidator;
|
|
15
|
+
/** Whether to automatically open when creating the server. Default is true. */
|
|
16
|
+
autoOpen?: boolean;
|
|
13
17
|
}
|
|
14
18
|
/**
|
|
15
19
|
* RequestIframeServer implementation
|
|
16
20
|
* Uses shared MessageDispatcher (backed by MessageChannel) to listen for and send messages
|
|
17
21
|
*/
|
|
18
22
|
export declare class RequestIframeServerImpl implements RequestIframeServer {
|
|
23
|
+
/** Unique instance ID */
|
|
24
|
+
readonly id: string;
|
|
19
25
|
private readonly dispatcher;
|
|
20
26
|
private readonly ackTimeout;
|
|
21
27
|
private readonly versionValidator;
|
|
@@ -60,6 +66,8 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
|
|
|
60
66
|
get secretKey(): string | undefined;
|
|
61
67
|
/** Get the underlying MessageDispatcher */
|
|
62
68
|
get messageDispatcher(): MessageDispatcher;
|
|
69
|
+
private handleRequestError;
|
|
70
|
+
private handleRequestResult;
|
|
63
71
|
/**
|
|
64
72
|
* Handle request
|
|
65
73
|
*/
|
|
@@ -70,10 +78,10 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
|
|
|
70
78
|
private registerPendingAck;
|
|
71
79
|
use(middleware: Middleware): void;
|
|
72
80
|
use(path: PathMatcher, middleware: Middleware): void;
|
|
73
|
-
on(path: string, handler: ServerHandler): void;
|
|
81
|
+
on(path: string, handler: ServerHandler): () => void;
|
|
74
82
|
private runMiddlewares;
|
|
75
|
-
off(path: string): void;
|
|
76
|
-
map(handlers: Record<string, ServerHandler>): void;
|
|
83
|
+
off(path: string | string[]): void;
|
|
84
|
+
map(handlers: Record<string, ServerHandler>): (() => void);
|
|
77
85
|
/**
|
|
78
86
|
* Destroy (close and release channel reference)
|
|
79
87
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,WAAW,EACZ,MAAM,UAAU,CAAC;AAKlB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,WAAW,EACZ,MAAM,UAAU,CAAC;AAKlB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;AAiCjF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,yBAAyB;IACzB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IAEpD,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,yBAAyB;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEL,OAAO,CAAC,EAAE,aAAa;IAgB1C;;OAEG;IACI,IAAI,IAAI,IAAI;IAMnB;;OAEG;IACI,KAAK,IAAI,IAAI;IASpB;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB,oBAAoB;IACpB,IAAW,SAAS,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED,2CAA2C;IAC3C,IAAW,iBAAiB,IAAI,iBAAiB,CAEhD;IAED,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoHrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAanB,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IACjC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAepD,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,IAAI;IAU3D,OAAO,CAAC,cAAc;IA4Cf,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAYlC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC;IAUjE;;OAEG;IACI,OAAO,IAAI,IAAI;CAgBvB"}
|