request-iframe 0.0.3 → 0.0.4
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 +35 -8
- package/QUICKSTART.md +35 -8
- package/README.CN.md +170 -24
- package/README.md +230 -19
- package/library/__tests__/coverage-branches.test.ts +356 -0
- package/library/__tests__/requestIframe.test.ts +1008 -58
- package/library/__tests__/stream.test.ts +46 -15
- package/library/api/client.d.ts.map +1 -1
- package/library/api/client.js +1 -0
- package/library/constants/messages.d.ts +2 -0
- package/library/constants/messages.d.ts.map +1 -1
- package/library/constants/messages.js +2 -0
- package/library/core/client-server.d.ts +4 -0
- package/library/core/client-server.d.ts.map +1 -1
- package/library/core/client-server.js +45 -22
- package/library/core/client.d.ts +31 -4
- package/library/core/client.d.ts.map +1 -1
- package/library/core/client.js +471 -284
- package/library/core/request.d.ts +3 -1
- package/library/core/request.d.ts.map +1 -1
- package/library/core/request.js +2 -1
- package/library/core/response.d.ts +26 -4
- package/library/core/response.d.ts.map +1 -1
- package/library/core/response.js +142 -81
- package/library/core/server.d.ts +13 -0
- package/library/core/server.d.ts.map +1 -1
- package/library/core/server.js +211 -6
- package/library/index.d.ts +2 -1
- package/library/index.d.ts.map +1 -1
- package/library/index.js +32 -3
- package/library/message/dispatcher.d.ts.map +1 -1
- package/library/message/dispatcher.js +4 -3
- package/library/stream/index.d.ts +11 -1
- package/library/stream/index.d.ts.map +1 -1
- package/library/stream/index.js +21 -3
- package/library/stream/types.d.ts +2 -2
- package/library/stream/types.d.ts.map +1 -1
- package/library/stream/writable-stream.d.ts +1 -1
- package/library/stream/writable-stream.d.ts.map +1 -1
- package/library/stream/writable-stream.js +8 -10
- package/library/types/index.d.ts +26 -4
- package/library/types/index.d.ts.map +1 -1
- package/library/utils/index.d.ts +14 -0
- package/library/utils/index.d.ts.map +1 -1
- package/library/utils/index.js +99 -1
- package/library/utils/path-match.d.ts +16 -0
- package/library/utils/path-match.d.ts.map +1 -1
- package/library/utils/path-match.js +65 -0
- package/package.json +2 -1
- package/react/library/__tests__/index.test.tsx +44 -22
- package/react/library/index.d.ts.map +1 -1
- package/react/library/index.js +81 -23
- package/react/package.json +7 -0
|
@@ -5,13 +5,15 @@ import { MessageContext } from '../message';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class ServerRequestImpl implements ServerRequest {
|
|
7
7
|
body: any;
|
|
8
|
+
stream?: ServerRequest['stream'];
|
|
8
9
|
headers: Record<string, string>;
|
|
9
10
|
cookies: Record<string, string>;
|
|
10
11
|
path: string;
|
|
12
|
+
params: Record<string, string>;
|
|
11
13
|
requestId: string;
|
|
12
14
|
origin: string;
|
|
13
15
|
source: Window;
|
|
14
16
|
res: ServerResponse;
|
|
15
|
-
constructor(data: PostMessageData, context: MessageContext, response: ServerResponse);
|
|
17
|
+
constructor(data: PostMessageData, context: MessageContext, response: ServerResponse, params?: Record<string, string>);
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/core/request.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAAE,cAAc,EAAE,eAAe,EAC/C,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IAC9C,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;gBAGzB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/core/request.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAAE,cAAc,EAAE,eAAe,EAC/C,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IAC9C,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;gBAGzB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;CAkBtC"}
|
package/library/core/request.js
CHANGED
|
@@ -11,7 +11,7 @@ require("core-js/modules/es.object.entries.js");
|
|
|
11
11
|
* ServerRequest implementation
|
|
12
12
|
*/
|
|
13
13
|
class ServerRequestImpl {
|
|
14
|
-
constructor(data, context, response) {
|
|
14
|
+
constructor(data, context, response, params = {}) {
|
|
15
15
|
this.body = data.body;
|
|
16
16
|
// headers may contain array values (e.g., Set-Cookie), simplified to string here
|
|
17
17
|
this.headers = {};
|
|
@@ -25,6 +25,7 @@ class ServerRequestImpl {
|
|
|
25
25
|
}
|
|
26
26
|
this.cookies = data.cookies || {};
|
|
27
27
|
this.path = data.path || '';
|
|
28
|
+
this.params = params;
|
|
28
29
|
this.requestId = data.requestId;
|
|
29
30
|
this.origin = context.origin;
|
|
30
31
|
this.source = context.source;
|
|
@@ -16,18 +16,31 @@ export declare class ServerResponseImpl implements ServerResponse {
|
|
|
16
16
|
private readonly secretKey?;
|
|
17
17
|
private readonly targetWindow;
|
|
18
18
|
private readonly targetOrigin;
|
|
19
|
-
private readonly channel
|
|
19
|
+
private readonly channel;
|
|
20
20
|
/** Target client ID (usually the creatorId of the original request) */
|
|
21
21
|
private readonly targetId?;
|
|
22
22
|
/** Server instance ID (for creatorId in responses) */
|
|
23
23
|
private readonly serverId?;
|
|
24
24
|
private onAckCallback?;
|
|
25
25
|
_sent: boolean;
|
|
26
|
-
constructor(requestId: string, path: string, secretKey: string | undefined, targetWindow: Window, targetOrigin: string, channel
|
|
26
|
+
constructor(requestId: string, path: string, secretKey: string | undefined, targetWindow: Window, targetOrigin: string, channel: MessageChannel, serverId?: string, targetId?: string);
|
|
27
27
|
/**
|
|
28
|
-
* Send message via channel
|
|
28
|
+
* Send message via channel
|
|
29
29
|
*/
|
|
30
30
|
private sendMessage;
|
|
31
|
+
/**
|
|
32
|
+
* Check if header exists (case-insensitive)
|
|
33
|
+
*/
|
|
34
|
+
private hasHeader;
|
|
35
|
+
/**
|
|
36
|
+
* Detect data type and return appropriate Content-Type
|
|
37
|
+
* Returns null if Content-Type should not be auto-set
|
|
38
|
+
*/
|
|
39
|
+
private detectContentType;
|
|
40
|
+
/**
|
|
41
|
+
* Auto set Content-Type based on data type (only if user not set)
|
|
42
|
+
*/
|
|
43
|
+
private ensureContentTypeIfNeeded;
|
|
31
44
|
/**
|
|
32
45
|
* Set callback waiting for client acknowledgment
|
|
33
46
|
*/
|
|
@@ -36,6 +49,16 @@ export declare class ServerResponseImpl implements ServerResponse {
|
|
|
36
49
|
* Trigger client acknowledgment callback
|
|
37
50
|
*/
|
|
38
51
|
_triggerAck(received: boolean): void;
|
|
52
|
+
/**
|
|
53
|
+
* Internal method: send raw data (used by send after type detection)
|
|
54
|
+
*/
|
|
55
|
+
private _sendRaw;
|
|
56
|
+
/**
|
|
57
|
+
* Universal send method - automatically detects data type and calls appropriate method
|
|
58
|
+
* - If data is IframeWritableStream, calls sendStream
|
|
59
|
+
* - If data is File/Blob, calls sendFile
|
|
60
|
+
* - Otherwise, sends as regular data with auto-detected Content-Type
|
|
61
|
+
*/
|
|
39
62
|
send(data: any, options?: SendOptions): Promise<boolean>;
|
|
40
63
|
json(data: any, options?: SendOptions): Promise<boolean>;
|
|
41
64
|
sendFile(content: string | Blob | File, options?: SendFileOptions): Promise<boolean>;
|
|
@@ -49,7 +72,6 @@ export declare class ServerResponseImpl implements ServerResponse {
|
|
|
49
72
|
set(name: string, value: string | number | string[]): ServerResponse;
|
|
50
73
|
cookie(name: string, value: string, options?: CookieOptions): ServerResponse;
|
|
51
74
|
clearCookie(name: string, options?: CookieOptions): ServerResponse;
|
|
52
|
-
private blobToBase64;
|
|
53
75
|
}
|
|
54
76
|
export {};
|
|
55
77
|
//# sourceMappingURL=response.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/core/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGvF,OAAO,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/core/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAoD,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/C;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAChD,UAAU,EAAE,MAAM,CAAiB;IACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAM;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,aAAa,CAAC,CAAc;IAC7B,KAAK,UAAS;gBAGnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM;IAYnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrD;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAO3C;;OAEG;IACH,OAAO,CAAC,QAAQ;IA8ChB;;;;;OAKG;IACU,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiC9D,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD,QAAQ,CACnB,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAC7B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC;IAoDnB;;;OAGG;IACU,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAKpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAwBhE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAMpE,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;IA4BV,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;CAkBlB"}
|
package/library/core/response.js
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
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");
|
|
3
6
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
7
|
Object.defineProperty(exports, "__esModule", {
|
|
5
8
|
value: true
|
|
6
9
|
});
|
|
7
10
|
exports.ServerResponseImpl = void 0;
|
|
8
11
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
-
require("core-js/modules/es.array.includes.js");
|
|
10
12
|
require("core-js/modules/es.array.iterator.js");
|
|
11
13
|
require("core-js/modules/es.promise.js");
|
|
12
|
-
require("core-js/modules/es.string.includes.js");
|
|
13
14
|
require("core-js/modules/web.dom-collections.iterator.js");
|
|
14
15
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
16
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
17
|
var _utils = require("../utils");
|
|
17
18
|
var _constants = require("../constants");
|
|
18
19
|
var _stream = require("../stream");
|
|
20
|
+
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; }
|
|
21
|
+
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; }
|
|
19
22
|
/**
|
|
20
23
|
* Callback waiting for client acknowledgment
|
|
21
24
|
*/
|
|
@@ -39,13 +42,39 @@ class ServerResponseImpl {
|
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
/**
|
|
42
|
-
* Send message via channel
|
|
45
|
+
* Send message via channel
|
|
43
46
|
*/
|
|
44
47
|
sendMessage(message) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
this.channel.send(this.targetWindow, message, this.targetOrigin);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Check if header exists (case-insensitive)
|
|
53
|
+
*/
|
|
54
|
+
hasHeader(name) {
|
|
55
|
+
var lower = name.toLowerCase();
|
|
56
|
+
return Object.keys(this.headers).some(k => k.toLowerCase() === lower);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Detect data type and return appropriate Content-Type
|
|
61
|
+
* Returns null if Content-Type should not be auto-set
|
|
62
|
+
*/
|
|
63
|
+
detectContentType(data) {
|
|
64
|
+
return (0, _utils.detectContentType)(data, {
|
|
65
|
+
checkStream: true,
|
|
66
|
+
isIframeWritableStream: _stream.isIframeWritableStream
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Auto set Content-Type based on data type (only if user not set)
|
|
72
|
+
*/
|
|
73
|
+
ensureContentTypeIfNeeded(data) {
|
|
74
|
+
if (this.hasHeader(_constants.HttpHeader.CONTENT_TYPE)) return;
|
|
75
|
+
var contentType = this.detectContentType(data);
|
|
76
|
+
if (contentType) {
|
|
77
|
+
this.setHeader(_constants.HttpHeader.CONTENT_TYPE, contentType);
|
|
49
78
|
}
|
|
50
79
|
}
|
|
51
80
|
|
|
@@ -65,7 +94,11 @@ class ServerResponseImpl {
|
|
|
65
94
|
this.onAckCallback = undefined;
|
|
66
95
|
}
|
|
67
96
|
}
|
|
68
|
-
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Internal method: send raw data (used by send after type detection)
|
|
100
|
+
*/
|
|
101
|
+
_sendRaw(data, options) {
|
|
69
102
|
var _options$requireAck;
|
|
70
103
|
if (this._sent) return Promise.resolve(false);
|
|
71
104
|
this._sent = true;
|
|
@@ -105,58 +138,109 @@ class ServerResponseImpl {
|
|
|
105
138
|
}));
|
|
106
139
|
});
|
|
107
140
|
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Universal send method - automatically detects data type and calls appropriate method
|
|
144
|
+
* - If data is IframeWritableStream, calls sendStream
|
|
145
|
+
* - If data is File/Blob, calls sendFile
|
|
146
|
+
* - Otherwise, sends as regular data with auto-detected Content-Type
|
|
147
|
+
*/
|
|
148
|
+
send(data, options) {
|
|
149
|
+
var _this = this;
|
|
150
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
151
|
+
var fileOptions;
|
|
152
|
+
return _regenerator.default.wrap(function (_context) {
|
|
153
|
+
while (1) switch (_context.prev = _context.next) {
|
|
154
|
+
case 0:
|
|
155
|
+
if (!_this._sent) {
|
|
156
|
+
_context.next = 1;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
return _context.abrupt("return", Promise.resolve(false));
|
|
160
|
+
case 1:
|
|
161
|
+
if (!(0, _stream.isIframeWritableStream)(data)) {
|
|
162
|
+
_context.next = 3;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
_context.next = 2;
|
|
166
|
+
return _this.sendStream(data);
|
|
167
|
+
case 2:
|
|
168
|
+
return _context.abrupt("return", true);
|
|
169
|
+
case 3:
|
|
170
|
+
if (!(typeof File !== 'undefined' && data instanceof File || typeof Blob !== 'undefined' && data instanceof Blob)) {
|
|
171
|
+
_context.next = 4;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
// Extract options for sendFile
|
|
175
|
+
fileOptions = _objectSpread({
|
|
176
|
+
requireAck: options === null || options === void 0 ? void 0 : options.requireAck
|
|
177
|
+
}, typeof File !== 'undefined' && data instanceof File ? {
|
|
178
|
+
mimeType: data.type,
|
|
179
|
+
fileName: data.name
|
|
180
|
+
} : {});
|
|
181
|
+
return _context.abrupt("return", _this.sendFile(data, fileOptions));
|
|
182
|
+
case 4:
|
|
183
|
+
// For other types, auto-detect and set Content-Type, then send
|
|
184
|
+
_this.ensureContentTypeIfNeeded(data);
|
|
185
|
+
return _context.abrupt("return", _this._sendRaw(data, options));
|
|
186
|
+
case 5:
|
|
187
|
+
case "end":
|
|
188
|
+
return _context.stop();
|
|
189
|
+
}
|
|
190
|
+
}, _callee);
|
|
191
|
+
}))();
|
|
192
|
+
}
|
|
108
193
|
json(data, options) {
|
|
109
|
-
this.setHeader(_constants.HttpHeader.CONTENT_TYPE, 'application/json');
|
|
110
194
|
return this.send(data, options);
|
|
111
195
|
}
|
|
112
196
|
sendFile(content, options) {
|
|
113
|
-
var
|
|
114
|
-
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function
|
|
197
|
+
var _this2 = this;
|
|
198
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
|
|
115
199
|
var mimeType, fileName, fileContent, stream;
|
|
116
|
-
return _regenerator.default.wrap(function (
|
|
117
|
-
while (1) switch (
|
|
200
|
+
return _regenerator.default.wrap(function (_context3) {
|
|
201
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
118
202
|
case 0:
|
|
119
|
-
if (!
|
|
120
|
-
|
|
203
|
+
if (!_this2._sent) {
|
|
204
|
+
_context3.next = 1;
|
|
121
205
|
break;
|
|
122
206
|
}
|
|
123
|
-
return
|
|
207
|
+
return _context3.abrupt("return", false);
|
|
124
208
|
case 1:
|
|
125
209
|
mimeType = (options === null || options === void 0 ? void 0 : options.mimeType) || 'application/octet-stream';
|
|
126
210
|
fileName = options === null || options === void 0 ? void 0 : options.fileName;
|
|
127
211
|
if (!(typeof content === 'string')) {
|
|
128
|
-
|
|
212
|
+
_context3.next = 2;
|
|
129
213
|
break;
|
|
130
214
|
}
|
|
131
215
|
// If it's a plain string, convert to base64
|
|
132
216
|
fileContent = btoa(unescape(encodeURIComponent(content)));
|
|
133
|
-
|
|
217
|
+
_context3.next = 6;
|
|
134
218
|
break;
|
|
135
219
|
case 2:
|
|
136
220
|
if (!(content instanceof File)) {
|
|
137
|
-
|
|
221
|
+
_context3.next = 4;
|
|
138
222
|
break;
|
|
139
223
|
}
|
|
140
224
|
mimeType = content.type || mimeType;
|
|
141
225
|
fileName = fileName || content.name;
|
|
142
|
-
|
|
143
|
-
return
|
|
226
|
+
_context3.next = 3;
|
|
227
|
+
return (0, _utils.blobToBase64)(content);
|
|
144
228
|
case 3:
|
|
145
|
-
fileContent =
|
|
146
|
-
|
|
229
|
+
fileContent = _context3.sent;
|
|
230
|
+
_context3.next = 6;
|
|
147
231
|
break;
|
|
148
232
|
case 4:
|
|
149
|
-
|
|
150
|
-
return
|
|
233
|
+
_context3.next = 5;
|
|
234
|
+
return (0, _utils.blobToBase64)(content);
|
|
151
235
|
case 5:
|
|
152
|
-
fileContent =
|
|
236
|
+
fileContent = _context3.sent;
|
|
153
237
|
case 6:
|
|
154
238
|
// Set file-related headers
|
|
155
|
-
|
|
239
|
+
_this2.setHeader(_constants.HttpHeader.CONTENT_TYPE, mimeType);
|
|
156
240
|
if (fileName) {
|
|
157
|
-
|
|
241
|
+
_this2.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, `attachment; filename="${fileName}"`);
|
|
158
242
|
} else {
|
|
159
|
-
|
|
243
|
+
_this2.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, 'attachment');
|
|
160
244
|
}
|
|
161
245
|
|
|
162
246
|
// Create file stream with autoResolve enabled
|
|
@@ -168,19 +252,19 @@ class ServerResponseImpl {
|
|
|
168
252
|
autoResolve: true,
|
|
169
253
|
// Client will automatically resolve to fileData
|
|
170
254
|
next: function () {
|
|
171
|
-
var _next = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function
|
|
172
|
-
return _regenerator.default.wrap(function (
|
|
173
|
-
while (1) switch (
|
|
255
|
+
var _next = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
256
|
+
return _regenerator.default.wrap(function (_context2) {
|
|
257
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
174
258
|
case 0:
|
|
175
|
-
return
|
|
259
|
+
return _context2.abrupt("return", {
|
|
176
260
|
data: fileContent,
|
|
177
261
|
done: true
|
|
178
262
|
});
|
|
179
263
|
case 1:
|
|
180
264
|
case "end":
|
|
181
|
-
return
|
|
265
|
+
return _context2.stop();
|
|
182
266
|
}
|
|
183
|
-
},
|
|
267
|
+
}, _callee2);
|
|
184
268
|
}));
|
|
185
269
|
function next() {
|
|
186
270
|
return _next.apply(this, arguments);
|
|
@@ -188,15 +272,15 @@ class ServerResponseImpl {
|
|
|
188
272
|
return next;
|
|
189
273
|
}()
|
|
190
274
|
}); // Send stream (this will handle the requireAck logic internally and set _sent)
|
|
191
|
-
|
|
192
|
-
return
|
|
275
|
+
_context3.next = 7;
|
|
276
|
+
return _this2.sendStream(stream);
|
|
193
277
|
case 7:
|
|
194
|
-
return
|
|
278
|
+
return _context3.abrupt("return", true);
|
|
195
279
|
case 8:
|
|
196
280
|
case "end":
|
|
197
|
-
return
|
|
281
|
+
return _context3.stop();
|
|
198
282
|
}
|
|
199
|
-
},
|
|
283
|
+
}, _callee3);
|
|
200
284
|
}))();
|
|
201
285
|
}
|
|
202
286
|
|
|
@@ -205,38 +289,38 @@ class ServerResponseImpl {
|
|
|
205
289
|
* Bind stream to current request context and start stream transmission
|
|
206
290
|
*/
|
|
207
291
|
sendStream(stream) {
|
|
208
|
-
var
|
|
209
|
-
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function
|
|
210
|
-
return _regenerator.default.wrap(function (
|
|
211
|
-
while (1) switch (
|
|
292
|
+
var _this3 = this;
|
|
293
|
+
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
|
|
294
|
+
return _regenerator.default.wrap(function (_context4) {
|
|
295
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
212
296
|
case 0:
|
|
213
|
-
if (!
|
|
214
|
-
|
|
297
|
+
if (!_this3._sent) {
|
|
298
|
+
_context4.next = 1;
|
|
215
299
|
break;
|
|
216
300
|
}
|
|
217
|
-
return
|
|
301
|
+
return _context4.abrupt("return");
|
|
218
302
|
case 1:
|
|
219
|
-
|
|
303
|
+
_this3._sent = true;
|
|
220
304
|
|
|
221
305
|
// Bind stream to request context
|
|
222
306
|
stream._bind({
|
|
223
|
-
requestId:
|
|
224
|
-
targetWindow:
|
|
225
|
-
targetOrigin:
|
|
226
|
-
secretKey:
|
|
227
|
-
channel:
|
|
228
|
-
serverId:
|
|
229
|
-
targetId:
|
|
307
|
+
requestId: _this3.requestId,
|
|
308
|
+
targetWindow: _this3.targetWindow,
|
|
309
|
+
targetOrigin: _this3.targetOrigin,
|
|
310
|
+
secretKey: _this3.secretKey,
|
|
311
|
+
channel: _this3.channel,
|
|
312
|
+
serverId: _this3.serverId,
|
|
313
|
+
targetId: _this3.targetId
|
|
230
314
|
});
|
|
231
315
|
|
|
232
316
|
// Start stream transmission
|
|
233
|
-
|
|
317
|
+
_context4.next = 2;
|
|
234
318
|
return stream.start();
|
|
235
319
|
case 2:
|
|
236
320
|
case "end":
|
|
237
|
-
return
|
|
321
|
+
return _context4.stop();
|
|
238
322
|
}
|
|
239
|
-
},
|
|
323
|
+
}, _callee4);
|
|
240
324
|
}))();
|
|
241
325
|
}
|
|
242
326
|
status(code) {
|
|
@@ -311,28 +395,5 @@ class ServerResponseImpl {
|
|
|
311
395
|
}
|
|
312
396
|
return this;
|
|
313
397
|
}
|
|
314
|
-
blobToBase64(blob) {
|
|
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) {
|
|
318
|
-
case 0:
|
|
319
|
-
return _context4.abrupt("return", new Promise((resolve, reject) => {
|
|
320
|
-
var reader = new FileReader();
|
|
321
|
-
reader.onloadend = () => {
|
|
322
|
-
var result = reader.result;
|
|
323
|
-
// Remove data URL prefix (e.g., "data:image/png;base64,")
|
|
324
|
-
var base64 = result.includes(',') ? result.split(',')[1] : result;
|
|
325
|
-
resolve(base64);
|
|
326
|
-
};
|
|
327
|
-
reader.onerror = reject;
|
|
328
|
-
reader.readAsDataURL(blob);
|
|
329
|
-
}));
|
|
330
|
-
case 1:
|
|
331
|
-
case "end":
|
|
332
|
-
return _context4.stop();
|
|
333
|
-
}
|
|
334
|
-
}, _callee4);
|
|
335
|
-
}))();
|
|
336
|
-
}
|
|
337
398
|
}
|
|
338
399
|
exports.ServerResponseImpl = ServerResponseImpl;
|
package/library/core/server.d.ts
CHANGED
|
@@ -29,6 +29,10 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
|
|
|
29
29
|
private readonly middlewares;
|
|
30
30
|
/** Responses waiting for client acknowledgment */
|
|
31
31
|
private readonly pendingAcks;
|
|
32
|
+
/** Pending requests waiting for client stream_start (streamId present) */
|
|
33
|
+
private readonly pendingStreamRequests;
|
|
34
|
+
/** Stream message handlers (streamId -> handler) for client→server streams */
|
|
35
|
+
private readonly streamHandlers;
|
|
32
36
|
/** List of functions to unregister handlers */
|
|
33
37
|
private readonly unregisterFns;
|
|
34
38
|
/** Whether it is open */
|
|
@@ -50,6 +54,9 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
|
|
|
50
54
|
* Register message handlers
|
|
51
55
|
*/
|
|
52
56
|
private registerHandlers;
|
|
57
|
+
/** Handle stream_start from client (stream request with streamId) */
|
|
58
|
+
private handleStreamStart;
|
|
59
|
+
private dispatchStreamMessage;
|
|
53
60
|
/**
|
|
54
61
|
* Handle protocol version error
|
|
55
62
|
*/
|
|
@@ -68,6 +75,12 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
|
|
|
68
75
|
get messageDispatcher(): MessageDispatcher;
|
|
69
76
|
private handleRequestError;
|
|
70
77
|
private handleRequestResult;
|
|
78
|
+
/**
|
|
79
|
+
* Find matching handler and extract path parameters
|
|
80
|
+
* @param requestPath The actual request path
|
|
81
|
+
* @returns Handler function and extracted parameters, or null if not found
|
|
82
|
+
*/
|
|
83
|
+
private findHandler;
|
|
71
84
|
/**
|
|
72
85
|
* Handle request
|
|
73
86
|
*/
|
|
@@ -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;AAiDjF;;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,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2C;IAEjF,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwD;IAEvF,+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;IAkDxB,qEAAqE;IACrE,OAAO,CAAC,iBAAiB;IAgHzB,OAAO,CAAC,qBAAqB;IAU7B;;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;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwIrB;;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"}
|