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.
Files changed (96) hide show
  1. package/README.CN.md +271 -12
  2. package/README.md +268 -11
  3. package/library/__tests__/channel.test.ts +420 -0
  4. package/library/__tests__/debug.test.ts +588 -0
  5. package/library/__tests__/dispatcher.test.ts +481 -0
  6. package/library/__tests__/interceptors.test.ts +22 -0
  7. package/library/__tests__/requestIframe.test.ts +2317 -99
  8. package/library/__tests__/server.test.ts +738 -0
  9. package/library/api/client.d.js +5 -0
  10. package/library/api/client.d.ts.map +1 -1
  11. package/library/api/client.js +11 -6
  12. package/library/api/server.d.js +5 -0
  13. package/library/api/server.d.ts +4 -3
  14. package/library/api/server.d.ts.map +1 -1
  15. package/library/api/server.js +25 -7
  16. package/library/constants/index.d.js +36 -0
  17. package/library/constants/index.d.ts +14 -4
  18. package/library/constants/index.d.ts.map +1 -1
  19. package/library/constants/index.js +15 -7
  20. package/library/constants/messages.d.js +5 -0
  21. package/library/constants/messages.d.ts +35 -0
  22. package/library/constants/messages.d.ts.map +1 -1
  23. package/library/constants/messages.js +36 -1
  24. package/library/core/client-server.d.ts +101 -0
  25. package/library/core/client-server.d.ts.map +1 -0
  26. package/library/core/client-server.js +266 -0
  27. package/library/core/client.d.js +5 -0
  28. package/library/core/client.d.ts +38 -6
  29. package/library/core/client.d.ts.map +1 -1
  30. package/library/core/client.js +198 -24
  31. package/library/core/request.d.js +5 -0
  32. package/library/core/response.d.js +5 -0
  33. package/library/core/response.d.ts +5 -1
  34. package/library/core/response.d.ts.map +1 -1
  35. package/library/core/response.js +85 -70
  36. package/library/core/server-client.d.js +5 -0
  37. package/library/core/server-client.d.ts +3 -1
  38. package/library/core/server-client.d.ts.map +1 -1
  39. package/library/core/server-client.js +19 -9
  40. package/library/core/server.d.js +5 -0
  41. package/library/core/server.d.ts +11 -3
  42. package/library/core/server.d.ts.map +1 -1
  43. package/library/core/server.js +112 -54
  44. package/library/index.d.ts +1 -1
  45. package/library/index.js +2 -2
  46. package/library/interceptors/index.d.js +5 -0
  47. package/library/interceptors/index.d.ts +4 -0
  48. package/library/interceptors/index.d.ts.map +1 -1
  49. package/library/interceptors/index.js +7 -0
  50. package/library/message/channel.d.js +5 -0
  51. package/library/message/channel.d.ts +3 -1
  52. package/library/message/channel.d.ts.map +1 -1
  53. package/library/message/dispatcher.d.js +5 -0
  54. package/library/message/dispatcher.d.ts +7 -2
  55. package/library/message/dispatcher.d.ts.map +1 -1
  56. package/library/message/dispatcher.js +47 -2
  57. package/library/message/index.d.js +25 -0
  58. package/library/stream/file-stream.d.js +4 -0
  59. package/library/stream/file-stream.d.ts +5 -0
  60. package/library/stream/file-stream.d.ts.map +1 -1
  61. package/library/stream/file-stream.js +41 -12
  62. package/library/stream/index.d.js +58 -0
  63. package/library/stream/readable-stream.d.js +5 -0
  64. package/library/stream/readable-stream.d.ts.map +1 -1
  65. package/library/stream/readable-stream.js +32 -30
  66. package/library/stream/types.d.js +5 -0
  67. package/library/stream/types.d.ts +18 -0
  68. package/library/stream/types.d.ts.map +1 -1
  69. package/library/stream/writable-stream.d.js +5 -0
  70. package/library/stream/writable-stream.d.ts +1 -0
  71. package/library/stream/writable-stream.d.ts.map +1 -1
  72. package/library/stream/writable-stream.js +7 -2
  73. package/library/types/index.d.js +5 -0
  74. package/library/types/index.d.ts +79 -19
  75. package/library/types/index.d.ts.map +1 -1
  76. package/library/utils/cache.d.js +5 -0
  77. package/library/utils/cache.d.ts +24 -0
  78. package/library/utils/cache.d.ts.map +1 -1
  79. package/library/utils/cache.js +76 -0
  80. package/library/utils/cookie.d.js +5 -0
  81. package/library/utils/debug.d.js +5 -0
  82. package/library/utils/debug.d.ts.map +1 -1
  83. package/library/utils/debug.js +382 -20
  84. package/library/utils/index.d.js +94 -0
  85. package/library/utils/index.d.ts +5 -0
  86. package/library/utils/index.d.ts.map +1 -1
  87. package/library/utils/index.js +14 -1
  88. package/library/utils/path-match.d.js +5 -0
  89. package/library/utils/protocol.d.js +5 -0
  90. package/package.json +16 -2
  91. package/react/library/__tests__/index.test.d.ts +2 -0
  92. package/react/library/__tests__/index.test.d.ts.map +1 -0
  93. package/react/library/__tests__/index.test.tsx +770 -0
  94. package/react/library/index.d.ts +118 -0
  95. package/react/library/index.d.ts.map +1 -0
  96. package/react/library/index.js +232 -0
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAO1F;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAClC,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,CA0CrB;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAO1F;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAClC,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,CA+CrB;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtE"}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.clearRequestIframeClientCache = clearRequestIframeClientCache;
7
7
  exports.requestIframeClient = requestIframeClient;
8
8
  var _utils = require("../utils");
9
- var _serverClient = require("../core/server-client");
9
+ var _clientServer = require("../core/client-server");
10
10
  var _client = require("../core/client");
11
11
  var _debug = require("../utils/debug");
12
12
  var _constants = require("../constants");
@@ -39,19 +39,24 @@ function requestIframeClient(target, options) {
39
39
  // Determine secretKey
40
40
  var secretKey = options === null || options === void 0 ? void 0 : options.secretKey;
41
41
 
42
+ // Generate instance ID first (will be used by both client and server)
43
+ var instanceId = (0, _utils.generateInstanceId)();
44
+
42
45
  // Create ClientServer (internally obtains or creates a shared MessageChannel)
43
- var server = new _serverClient.RequestIframeClientServer({
46
+ var server = new _clientServer.RequestIframeClientServer({
44
47
  secretKey,
45
- ackTimeout: options === null || options === void 0 ? void 0 : options.ackTimeout
46
- });
48
+ ackTimeout: options === null || options === void 0 ? void 0 : options.ackTimeout,
49
+ autoOpen: options === null || options === void 0 ? void 0 : options.autoOpen
50
+ }, instanceId);
47
51
 
48
52
  // Create client instance
49
53
  var client = new _client.RequestIframeClientImpl(targetWindow, targetOrigin, server, {
50
54
  secretKey,
51
55
  ackTimeout: options === null || options === void 0 ? void 0 : options.ackTimeout,
52
56
  timeout: options === null || options === void 0 ? void 0 : options.timeout,
53
- asyncTimeout: options === null || options === void 0 ? void 0 : options.asyncTimeout
54
- });
57
+ asyncTimeout: options === null || options === void 0 ? void 0 : options.asyncTimeout,
58
+ headers: options === null || options === void 0 ? void 0 : options.headers
59
+ }, instanceId);
55
60
 
56
61
  // If trace mode is enabled, register debug interceptors
57
62
  if (options !== null && options !== void 0 && options.trace) {
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -4,13 +4,14 @@ import { RequestIframeServer, RequestIframeServerOptions } from '../types';
4
4
  *
5
5
  * Note:
6
6
  * - MessageChannel is cached at the window level by secretKey (ensures unique message listener)
7
- * - Server instances are not cached, a new instance is created on each call
7
+ * - If options.id is specified, the server will be cached and reused (singleton pattern)
8
+ * - If options.id is not specified, a new instance is created on each call
8
9
  * - This allows different versions of the library to coexist
9
10
  */
10
11
  export declare function requestIframeServer(options?: RequestIframeServerOptions): RequestIframeServer;
11
12
  /**
12
- * Clear MessageChannel cache (for testing or reset)
13
- * Note: This clears the shared message channel for the specified secretKey
13
+ * Clear server cache (for testing or reset)
14
+ * Note: This clears the cached server instances
14
15
  */
15
16
  export declare function clearRequestIframeServerCache(secretKey?: string): void;
16
17
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAI3E;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,CAgBrB;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAK3E;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,CAgCrB;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtE"}
@@ -7,38 +7,56 @@ exports.clearRequestIframeServerCache = clearRequestIframeServerCache;
7
7
  exports.requestIframeServer = requestIframeServer;
8
8
  var _server = require("../core/server");
9
9
  var _debug = require("../utils/debug");
10
+ var _cache = require("../utils/cache");
10
11
  /**
11
12
  * Create a server (for receiving and handling requests)
12
13
  *
13
14
  * Note:
14
15
  * - MessageChannel is cached at the window level by secretKey (ensures unique message listener)
15
- * - Server instances are not cached, a new instance is created on each call
16
+ * - If options.id is specified, the server will be cached and reused (singleton pattern)
17
+ * - If options.id is not specified, a new instance is created on each call
16
18
  * - This allows different versions of the library to coexist
17
19
  */
18
20
  function requestIframeServer(options) {
19
- // Determine secretKey
21
+ // Determine secretKey and id
20
22
  var secretKey = options === null || options === void 0 ? void 0 : options.secretKey;
23
+ var id = options === null || options === void 0 ? void 0 : options.id;
24
+
25
+ // If id is specified, check cache first
26
+ if (id) {
27
+ var cached = (0, _cache.getCachedServer)(secretKey, id);
28
+ if (cached) {
29
+ return cached;
30
+ }
31
+ }
21
32
 
22
33
  // Create server (internally obtains or creates a shared MessageChannel)
23
34
  var server = new _server.RequestIframeServerImpl({
24
35
  secretKey,
25
- ackTimeout: options === null || options === void 0 ? void 0 : options.ackTimeout
36
+ id,
37
+ ackTimeout: options === null || options === void 0 ? void 0 : options.ackTimeout,
38
+ autoOpen: options === null || options === void 0 ? void 0 : options.autoOpen
26
39
  });
27
40
 
28
41
  // If trace mode is enabled, register debug listeners
29
42
  if (options !== null && options !== void 0 && options.trace) {
30
43
  (0, _debug.setupServerDebugListeners)(server);
31
44
  }
45
+
46
+ // Cache server if id is specified
47
+ if (id) {
48
+ (0, _cache.cacheServer)(server, secretKey, id);
49
+ }
32
50
  return server;
33
51
  }
34
52
 
35
53
  /**
36
- * Clear MessageChannel cache (for testing or reset)
37
- * Note: This clears the shared message channel for the specified secretKey
54
+ * Clear server cache (for testing or reset)
55
+ * Note: This clears the cached server instances
38
56
  */
39
57
  function clearRequestIframeServerCache(secretKey) {
40
- // Now server is no longer cached, only need to clear MessageChannel cache
58
+ // Clear server cache
59
+ (0, _cache.clearServerCache)();
41
60
  // MessageChannel cleanup is handled by clearMessageChannelCache in cache.ts
42
- // Empty implementation kept here to maintain API compatibility
43
61
  void secretKey;
44
62
  }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "Messages", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _messages.Messages;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "formatMessage", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _messages.formatMessage;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "getMessages", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _messages.getMessages;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "resetMessages", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _messages.resetMessages;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "setMessages", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _messages.setMessages;
34
+ }
35
+ });
36
+ var _messages = require("./messages");
@@ -111,18 +111,28 @@ export declare const MessageType: {
111
111
  /** Stream cancel */
112
112
  readonly STREAM_CANCEL: "stream_cancel";
113
113
  };
114
+ export declare const MessageRole: {
115
+ /** Server role */
116
+ readonly SERVER: "server";
117
+ /** Client role */
118
+ readonly CLIENT: "client";
119
+ };
120
+ export type MessageRoleValue = typeof MessageRole[keyof typeof MessageRole];
114
121
  /**
115
122
  * Default timeout configuration (milliseconds)
116
123
  */
117
124
  export declare const DefaultTimeout: {
118
- /** ACK confirmation timeout: 500ms (client waiting for server confirmation) */
119
- readonly ACK: 500;
125
+ /**
126
+ * ACK confirmation timeout: 1000ms (1s)
127
+ * Used for both client waiting for server ACK and server waiting for client RECEIVED.
128
+ * Increased from 500ms to accommodate slower environments or busy browsers where postMessage
129
+ * serialization/deserialization may take longer.
130
+ */
131
+ readonly ACK: 1000;
120
132
  /** Request timeout: 5s */
121
133
  readonly REQUEST: 5000;
122
134
  /** Async request timeout: 120s */
123
135
  readonly ASYNC: 120000;
124
- /** Server waiting for client confirmation timeout: 5s (server waiting for client to confirm response received) */
125
- readonly SERVER_ACK: 5000;
126
136
  };
127
137
  /**
128
138
  * HTTP Header name constants
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.MessageType = exports.HttpStatusText = exports.HttpStatus = exports.HttpHeader = exports.ErrorCode = exports.DefaultTimeout = void 0;
6
+ exports.MessageType = exports.MessageRole = exports.HttpStatusText = exports.HttpStatus = exports.HttpHeader = exports.ErrorCode = exports.DefaultTimeout = void 0;
7
7
  Object.defineProperty(exports, "Messages", {
8
8
  enumerable: true,
9
9
  get: function get() {
@@ -159,19 +159,27 @@ var MessageType = exports.MessageType = {
159
159
  /** Stream cancel */
160
160
  STREAM_CANCEL: 'stream_cancel'
161
161
  };
162
-
162
+ var MessageRole = exports.MessageRole = {
163
+ /** Server role */
164
+ SERVER: 'server',
165
+ /** Client role */
166
+ CLIENT: 'client'
167
+ };
163
168
  /**
164
169
  * Default timeout configuration (milliseconds)
165
170
  */
166
171
  var DefaultTimeout = exports.DefaultTimeout = {
167
- /** ACK confirmation timeout: 500ms (client waiting for server confirmation) */
168
- ACK: 500,
172
+ /**
173
+ * ACK confirmation timeout: 1000ms (1s)
174
+ * Used for both client waiting for server ACK and server waiting for client RECEIVED.
175
+ * Increased from 500ms to accommodate slower environments or busy browsers where postMessage
176
+ * serialization/deserialization may take longer.
177
+ */
178
+ ACK: 1000,
169
179
  /** Request timeout: 5s */
170
180
  REQUEST: 5000,
171
181
  /** Async request timeout: 120s */
172
- ASYNC: 120000,
173
- /** Server waiting for client confirmation timeout: 5s (server waiting for client to confirm response received) */
174
- SERVER_ACK: 5000
182
+ ASYNC: 120000
175
183
  };
176
184
 
177
185
  /**
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -40,6 +40,41 @@ declare const defaultMessages: {
40
40
  readonly STREAM_ERROR: "Stream error: {0}";
41
41
  readonly STREAM_ENDED: "Stream has ended";
42
42
  readonly STREAM_READ_ERROR: "Failed to read stream data";
43
+ /** Debug messages - Client */
44
+ readonly DEBUG_CLIENT_REQUEST_START: "📤 [Client] Request Start";
45
+ readonly DEBUG_CLIENT_REQUEST_SUCCESS: "✅ [Client] Request Success";
46
+ readonly DEBUG_CLIENT_REQUEST_SUCCESS_FILE: "✅ [Client] Request Success (File)";
47
+ readonly DEBUG_CLIENT_REQUEST_SUCCESS_STREAM: "✅ [Client] Request Success (Stream)";
48
+ readonly DEBUG_CLIENT_REQUEST_FAILED: "❌ [Client] Request Failed";
49
+ readonly DEBUG_CLIENT_RECEIVED_ACK: "📥 [Client] Received ACK";
50
+ readonly DEBUG_CLIENT_RECEIVED_ASYNC: "⏳ [Client] Received ASYNC Notification";
51
+ readonly DEBUG_CLIENT_RECEIVED_STREAM_START: "🌊 [Client] Received Stream Start";
52
+ readonly DEBUG_CLIENT_RECEIVED_STREAM_DATA: "🌊 [Client] Received Stream Data";
53
+ readonly DEBUG_CLIENT_RECEIVED_STREAM_END: "🌊 [Client] Received Stream End";
54
+ readonly DEBUG_CLIENT_RECEIVED_RESPONSE: "📥 [Client] Received Response";
55
+ readonly DEBUG_CLIENT_RECEIVED_ERROR: "📥 [Client] Received Error";
56
+ readonly DEBUG_CLIENT_REQUEST_TIMEOUT: "⏱️ [Client] Request Timeout";
57
+ readonly DEBUG_CLIENT_SENDING_REQUEST: "📤 [Client] Sending Request";
58
+ readonly DEBUG_CLIENT_SENDING_PING: "📤 [Client] Sending Ping";
59
+ readonly DEBUG_CLIENT_SENDING_RECEIVED_ACK: "📤 [Client] Sending Received ACK";
60
+ /** Debug messages - Server */
61
+ readonly DEBUG_SERVER_RECEIVED_REQUEST: "📥 [Server] Received Request";
62
+ readonly DEBUG_SERVER_SETTING_STATUS_CODE: "📝 [Server] Setting Status Code";
63
+ readonly DEBUG_SERVER_SETTING_HEADER: "📝 [Server] Setting Header";
64
+ readonly DEBUG_SERVER_SENDING_RESPONSE: "📤 [Server] Sending Response";
65
+ readonly DEBUG_SERVER_SENDING_JSON_RESPONSE: "📤 [Server] Sending JSON Response";
66
+ readonly DEBUG_SERVER_SENDING_FILE: "📤 [Server] Sending File";
67
+ readonly DEBUG_SERVER_SENDING_STREAM: "📤 [Server] Sending Stream";
68
+ readonly DEBUG_SERVER_SENDING_ACK: "📤 [Server] Sending ACK";
69
+ readonly DEBUG_SERVER_SENDING_ASYNC: "📤 [Server] Sending ASYNC Notification";
70
+ readonly DEBUG_SERVER_SENDING_STREAM_START: "🌊 [Server] Sending Stream Start";
71
+ readonly DEBUG_SERVER_SENDING_STREAM_DATA: "🌊 [Server] Sending Stream Data";
72
+ readonly DEBUG_SERVER_SENDING_STREAM_END: "🌊 [Server] Sending Stream End";
73
+ readonly DEBUG_SERVER_SENDING_ERROR: "📤 [Server] Sending Error";
74
+ readonly DEBUG_SERVER_SENDING_RESPONSE_VIA_DISPATCHER: "📤 [Server] Sending Response (via dispatcher)";
75
+ readonly DEBUG_SERVER_HANDLING_REQUEST: "📥 [Server] Handling Request";
76
+ readonly DEBUG_SERVER_EXECUTING_MIDDLEWARE_CHAIN: "⚙️ [Server] Executing Middleware Chain";
77
+ readonly DEBUG_SERVER_MIDDLEWARE_CHAIN_COMPLETED: "✅ [Server] Middleware Chain Completed";
43
78
  };
44
79
  /**
45
80
  * Message type
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/constants/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,QAAA,MAAM,eAAe;IACnB,8BAA8B;;;;IAK9B,4BAA4B;;;;;IAM5B,qBAAqB;;;;IAKrB,8BAA8B;;;;;;IAO9B,oBAAoB;;IAGpB,8BAA8B;;;;;;;CAOtB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,eAAe,CAAC;AAOtD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAIxD,CAAC;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAKpF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAElE"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/constants/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,QAAA,MAAM,eAAe;IACnB,8BAA8B;;;;IAK9B,4BAA4B;;;;;IAM5B,qBAAqB;;;;IAKrB,8BAA8B;;;;;;IAO9B,oBAAoB;;IAGpB,8BAA8B;;;;;;;IAQ9B,8BAA8B;;;;;;;;;;;;;;;;;IAkB9B,8BAA8B;;;;;;;;;;;;;;;;;;CAkBtB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,eAAe,CAAC;AAOtD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAIxD,CAAC;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAE/E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAKpF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAElE"}
@@ -59,7 +59,42 @@ var defaultMessages = {
59
59
  STREAM_CANCELLED: 'Stream was cancelled: {0}',
60
60
  STREAM_ERROR: 'Stream error: {0}',
61
61
  STREAM_ENDED: 'Stream has ended',
62
- STREAM_READ_ERROR: 'Failed to read stream data'
62
+ STREAM_READ_ERROR: 'Failed to read stream data',
63
+ /** Debug messages - Client */
64
+ DEBUG_CLIENT_REQUEST_START: '📤 [Client] Request Start',
65
+ DEBUG_CLIENT_REQUEST_SUCCESS: '✅ [Client] Request Success',
66
+ DEBUG_CLIENT_REQUEST_SUCCESS_FILE: '✅ [Client] Request Success (File)',
67
+ DEBUG_CLIENT_REQUEST_SUCCESS_STREAM: '✅ [Client] Request Success (Stream)',
68
+ DEBUG_CLIENT_REQUEST_FAILED: '❌ [Client] Request Failed',
69
+ DEBUG_CLIENT_RECEIVED_ACK: '📥 [Client] Received ACK',
70
+ DEBUG_CLIENT_RECEIVED_ASYNC: '⏳ [Client] Received ASYNC Notification',
71
+ DEBUG_CLIENT_RECEIVED_STREAM_START: '🌊 [Client] Received Stream Start',
72
+ DEBUG_CLIENT_RECEIVED_STREAM_DATA: '🌊 [Client] Received Stream Data',
73
+ DEBUG_CLIENT_RECEIVED_STREAM_END: '🌊 [Client] Received Stream End',
74
+ DEBUG_CLIENT_RECEIVED_RESPONSE: '📥 [Client] Received Response',
75
+ DEBUG_CLIENT_RECEIVED_ERROR: '📥 [Client] Received Error',
76
+ DEBUG_CLIENT_REQUEST_TIMEOUT: '⏱️ [Client] Request Timeout',
77
+ DEBUG_CLIENT_SENDING_REQUEST: '📤 [Client] Sending Request',
78
+ DEBUG_CLIENT_SENDING_PING: '📤 [Client] Sending Ping',
79
+ DEBUG_CLIENT_SENDING_RECEIVED_ACK: '📤 [Client] Sending Received ACK',
80
+ /** Debug messages - Server */
81
+ DEBUG_SERVER_RECEIVED_REQUEST: '📥 [Server] Received Request',
82
+ DEBUG_SERVER_SETTING_STATUS_CODE: '📝 [Server] Setting Status Code',
83
+ DEBUG_SERVER_SETTING_HEADER: '📝 [Server] Setting Header',
84
+ DEBUG_SERVER_SENDING_RESPONSE: '📤 [Server] Sending Response',
85
+ DEBUG_SERVER_SENDING_JSON_RESPONSE: '📤 [Server] Sending JSON Response',
86
+ DEBUG_SERVER_SENDING_FILE: '📤 [Server] Sending File',
87
+ DEBUG_SERVER_SENDING_STREAM: '📤 [Server] Sending Stream',
88
+ DEBUG_SERVER_SENDING_ACK: '📤 [Server] Sending ACK',
89
+ DEBUG_SERVER_SENDING_ASYNC: '📤 [Server] Sending ASYNC Notification',
90
+ DEBUG_SERVER_SENDING_STREAM_START: '🌊 [Server] Sending Stream Start',
91
+ DEBUG_SERVER_SENDING_STREAM_DATA: '🌊 [Server] Sending Stream Data',
92
+ DEBUG_SERVER_SENDING_STREAM_END: '🌊 [Server] Sending Stream End',
93
+ DEBUG_SERVER_SENDING_ERROR: '📤 [Server] Sending Error',
94
+ DEBUG_SERVER_SENDING_RESPONSE_VIA_DISPATCHER: '📤 [Server] Sending Response (via dispatcher)',
95
+ DEBUG_SERVER_HANDLING_REQUEST: '📥 [Server] Handling Request',
96
+ DEBUG_SERVER_EXECUTING_MIDDLEWARE_CHAIN: '⚙️ [Server] Executing Middleware Chain',
97
+ DEBUG_SERVER_MIDDLEWARE_CHAIN_COMPLETED: '✅ [Server] Middleware Chain Completed'
63
98
  };
64
99
 
65
100
  /**
@@ -0,0 +1,101 @@
1
+ import { PostMessageData } from '../types';
2
+ import { MessageDispatcher, VersionValidator, MessageContext } from '../message';
3
+ /**
4
+ * Stream message handler callback
5
+ */
6
+ export type StreamMessageCallback = (data: PostMessageData, context: MessageContext) => void;
7
+ /**
8
+ * ClientServer configuration options
9
+ */
10
+ export interface ClientServerOptions {
11
+ /** Message isolation key */
12
+ secretKey?: string;
13
+ /** ACK timeout */
14
+ ackTimeout?: number;
15
+ /** Protocol version validator (optional, uses built-in validation by default) */
16
+ versionValidator?: VersionValidator;
17
+ /** Whether to automatically open when creating the client server. Default is true. */
18
+ autoOpen?: boolean;
19
+ }
20
+ /**
21
+ * RequestIframeClientServer - Client-side message server
22
+ * Only handles responses, not requests
23
+ * Uses shared MessageDispatcher (backed by MessageChannel) to listen for and send messages
24
+ */
25
+ export declare class RequestIframeClientServer {
26
+ private readonly dispatcher;
27
+ private readonly ackTimeout;
28
+ private readonly versionValidator;
29
+ /** Pending responses awaiting client acknowledgment */
30
+ private readonly pendingAcks;
31
+ /** Pending requests awaiting response */
32
+ private readonly pendingRequests;
33
+ /** Stream message callback */
34
+ private streamCallback?;
35
+ /** List of unregister handler functions */
36
+ private readonly unregisterFns;
37
+ /** Whether opened */
38
+ private _isOpen;
39
+ constructor(options?: ClientServerOptions, instanceId?: string);
40
+ /**
41
+ * Open message handling (register message handlers)
42
+ */
43
+ open(): void;
44
+ /**
45
+ * Close message handling (unregister message handlers, but don't release channel)
46
+ */
47
+ close(): void;
48
+ /**
49
+ * Whether opened
50
+ */
51
+ get isOpen(): boolean;
52
+ /**
53
+ * Register message handlers
54
+ */
55
+ private registerHandlers;
56
+ /**
57
+ * Handle protocol version error
58
+ */
59
+ private handleVersionError;
60
+ /**
61
+ * Handle client response
62
+ */
63
+ private handleClientResponse;
64
+ /**
65
+ * Handle received acknowledgment
66
+ */
67
+ private handleReceived;
68
+ /**
69
+ * Handle pong
70
+ */
71
+ private handlePong;
72
+ /**
73
+ * Set stream message handler callback
74
+ */
75
+ setStreamCallback(callback: StreamMessageCallback): void;
76
+ /** Get secretKey */
77
+ get secretKey(): string | undefined;
78
+ /** Get the underlying MessageDispatcher */
79
+ get messageDispatcher(): MessageDispatcher;
80
+ /**
81
+ * Register pending acknowledgment response
82
+ */
83
+ _registerPendingAck(requestId: string, resolve: (received: boolean) => void, reject: (error: Error) => void): void;
84
+ /**
85
+ * Register pending request awaiting response
86
+ */
87
+ _registerPendingRequest(requestId: string, resolve: (data: PostMessageData) => void, reject: (error: Error) => void, origin?: string): void;
88
+ /**
89
+ * Cancel pending response
90
+ */
91
+ _unregisterPendingRequest(requestId: string): void;
92
+ /**
93
+ * Send ping message
94
+ */
95
+ sendPing(targetWindow: Window, targetOrigin: string, requestId: string): void;
96
+ /**
97
+ * Destroy (close and release channel reference)
98
+ */
99
+ destroy(): void;
100
+ }
101
+ //# sourceMappingURL=client-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-server.d.ts","sourceRoot":"","sources":["../../src/core/client-server.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"}