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.
Files changed (53) hide show
  1. package/QUICKSTART.CN.md +35 -8
  2. package/QUICKSTART.md +35 -8
  3. package/README.CN.md +170 -24
  4. package/README.md +230 -19
  5. package/library/__tests__/coverage-branches.test.ts +356 -0
  6. package/library/__tests__/requestIframe.test.ts +1008 -58
  7. package/library/__tests__/stream.test.ts +46 -15
  8. package/library/api/client.d.ts.map +1 -1
  9. package/library/api/client.js +1 -0
  10. package/library/constants/messages.d.ts +2 -0
  11. package/library/constants/messages.d.ts.map +1 -1
  12. package/library/constants/messages.js +2 -0
  13. package/library/core/client-server.d.ts +4 -0
  14. package/library/core/client-server.d.ts.map +1 -1
  15. package/library/core/client-server.js +45 -22
  16. package/library/core/client.d.ts +31 -4
  17. package/library/core/client.d.ts.map +1 -1
  18. package/library/core/client.js +471 -284
  19. package/library/core/request.d.ts +3 -1
  20. package/library/core/request.d.ts.map +1 -1
  21. package/library/core/request.js +2 -1
  22. package/library/core/response.d.ts +26 -4
  23. package/library/core/response.d.ts.map +1 -1
  24. package/library/core/response.js +142 -81
  25. package/library/core/server.d.ts +13 -0
  26. package/library/core/server.d.ts.map +1 -1
  27. package/library/core/server.js +211 -6
  28. package/library/index.d.ts +2 -1
  29. package/library/index.d.ts.map +1 -1
  30. package/library/index.js +32 -3
  31. package/library/message/dispatcher.d.ts.map +1 -1
  32. package/library/message/dispatcher.js +4 -3
  33. package/library/stream/index.d.ts +11 -1
  34. package/library/stream/index.d.ts.map +1 -1
  35. package/library/stream/index.js +21 -3
  36. package/library/stream/types.d.ts +2 -2
  37. package/library/stream/types.d.ts.map +1 -1
  38. package/library/stream/writable-stream.d.ts +1 -1
  39. package/library/stream/writable-stream.d.ts.map +1 -1
  40. package/library/stream/writable-stream.js +8 -10
  41. package/library/types/index.d.ts +26 -4
  42. package/library/types/index.d.ts.map +1 -1
  43. package/library/utils/index.d.ts +14 -0
  44. package/library/utils/index.d.ts.map +1 -1
  45. package/library/utils/index.js +99 -1
  46. package/library/utils/path-match.d.ts +16 -0
  47. package/library/utils/path-match.d.ts.map +1 -1
  48. package/library/utils/path-match.js +65 -0
  49. package/package.json +2 -1
  50. package/react/library/__tests__/index.test.tsx +44 -22
  51. package/react/library/index.d.ts.map +1 -1
  52. package/react/library/index.js +81 -23
  53. 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;CAiB3B"}
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"}
@@ -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?: MessageChannel, serverId?: string, targetId?: string);
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 or direct postMessage
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,EAA4B,MAAM,WAAW,CAAC;AAC3E,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,CAAC,CAAiB;IAC1C,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,CAAC,EAAE,cAAc,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM;IAYnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrD;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAOpC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IA8CxD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,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;YAkBH,YAAY;CAa3B"}
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"}
@@ -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 or direct postMessage
45
+ * Send message via channel
43
46
  */
44
47
  sendMessage(message) {
45
- if (this.channel) {
46
- this.channel.send(this.targetWindow, message, this.targetOrigin);
47
- } else {
48
- this.targetWindow.postMessage(message, this.targetOrigin);
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
- send(data, options) {
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 _this = this;
114
- return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
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 (_context2) {
117
- while (1) switch (_context2.prev = _context2.next) {
200
+ return _regenerator.default.wrap(function (_context3) {
201
+ while (1) switch (_context3.prev = _context3.next) {
118
202
  case 0:
119
- if (!_this._sent) {
120
- _context2.next = 1;
203
+ if (!_this2._sent) {
204
+ _context3.next = 1;
121
205
  break;
122
206
  }
123
- return _context2.abrupt("return", false);
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
- _context2.next = 2;
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
- _context2.next = 6;
217
+ _context3.next = 6;
134
218
  break;
135
219
  case 2:
136
220
  if (!(content instanceof File)) {
137
- _context2.next = 4;
221
+ _context3.next = 4;
138
222
  break;
139
223
  }
140
224
  mimeType = content.type || mimeType;
141
225
  fileName = fileName || content.name;
142
- _context2.next = 3;
143
- return _this.blobToBase64(content);
226
+ _context3.next = 3;
227
+ return (0, _utils.blobToBase64)(content);
144
228
  case 3:
145
- fileContent = _context2.sent;
146
- _context2.next = 6;
229
+ fileContent = _context3.sent;
230
+ _context3.next = 6;
147
231
  break;
148
232
  case 4:
149
- _context2.next = 5;
150
- return _this.blobToBase64(content);
233
+ _context3.next = 5;
234
+ return (0, _utils.blobToBase64)(content);
151
235
  case 5:
152
- fileContent = _context2.sent;
236
+ fileContent = _context3.sent;
153
237
  case 6:
154
238
  // Set file-related headers
155
- _this.setHeader(_constants.HttpHeader.CONTENT_TYPE, mimeType);
239
+ _this2.setHeader(_constants.HttpHeader.CONTENT_TYPE, mimeType);
156
240
  if (fileName) {
157
- _this.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, `attachment; filename="${fileName}"`);
241
+ _this2.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, `attachment; filename="${fileName}"`);
158
242
  } else {
159
- _this.setHeader(_constants.HttpHeader.CONTENT_DISPOSITION, 'attachment');
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 _callee() {
172
- return _regenerator.default.wrap(function (_context) {
173
- while (1) switch (_context.prev = _context.next) {
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 _context.abrupt("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 _context.stop();
265
+ return _context2.stop();
182
266
  }
183
- }, _callee);
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
- _context2.next = 7;
192
- return _this.sendStream(stream);
275
+ _context3.next = 7;
276
+ return _this2.sendStream(stream);
193
277
  case 7:
194
- return _context2.abrupt("return", true);
278
+ return _context3.abrupt("return", true);
195
279
  case 8:
196
280
  case "end":
197
- return _context2.stop();
281
+ return _context3.stop();
198
282
  }
199
- }, _callee2);
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 _this2 = this;
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) {
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 (!_this2._sent) {
214
- _context3.next = 1;
297
+ if (!_this3._sent) {
298
+ _context4.next = 1;
215
299
  break;
216
300
  }
217
- return _context3.abrupt("return");
301
+ return _context4.abrupt("return");
218
302
  case 1:
219
- _this2._sent = true;
303
+ _this3._sent = true;
220
304
 
221
305
  // Bind stream to request context
222
306
  stream._bind({
223
- requestId: _this2.requestId,
224
- targetWindow: _this2.targetWindow,
225
- targetOrigin: _this2.targetOrigin,
226
- secretKey: _this2.secretKey,
227
- channel: _this2.channel,
228
- serverId: _this2.serverId,
229
- targetId: _this2.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
- _context3.next = 2;
317
+ _context4.next = 2;
234
318
  return stream.start();
235
319
  case 2:
236
320
  case "end":
237
- return _context3.stop();
321
+ return _context4.stop();
238
322
  }
239
- }, _callee3);
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;
@@ -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;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"}
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"}