request-iframe 0.0.2 → 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 (72) hide show
  1. package/README.CN.md +269 -12
  2. package/README.md +266 -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__/requestIframe.test.ts +2127 -99
  7. package/library/__tests__/server.test.ts +738 -0
  8. package/library/api/client.d.ts.map +1 -1
  9. package/library/api/client.js +11 -6
  10. package/library/api/server.d.ts +4 -3
  11. package/library/api/server.d.ts.map +1 -1
  12. package/library/api/server.js +25 -7
  13. package/library/constants/index.d.ts +14 -4
  14. package/library/constants/index.d.ts.map +1 -1
  15. package/library/constants/index.js +15 -7
  16. package/library/constants/messages.d.ts +35 -0
  17. package/library/constants/messages.d.ts.map +1 -1
  18. package/library/constants/messages.js +36 -1
  19. package/library/core/client-server.d.ts +101 -0
  20. package/library/core/client-server.d.ts.map +1 -0
  21. package/library/core/client-server.js +266 -0
  22. package/library/core/client.d.ts +22 -6
  23. package/library/core/client.d.ts.map +1 -1
  24. package/library/core/client.js +159 -24
  25. package/library/core/request.d.ts.map +1 -1
  26. package/library/core/response.d.ts +5 -1
  27. package/library/core/response.d.ts.map +1 -1
  28. package/library/core/response.js +85 -70
  29. package/library/core/server-client.d.ts +3 -1
  30. package/library/core/server-client.d.ts.map +1 -1
  31. package/library/core/server-client.js +19 -9
  32. package/library/core/server.d.ts +9 -1
  33. package/library/core/server.d.ts.map +1 -1
  34. package/library/core/server.js +96 -52
  35. package/library/index.d.ts +1 -1
  36. package/library/index.js +2 -2
  37. package/library/interceptors/index.d.ts.map +1 -1
  38. package/library/message/channel.d.ts +3 -1
  39. package/library/message/channel.d.ts.map +1 -1
  40. package/library/message/dispatcher.d.ts +7 -2
  41. package/library/message/dispatcher.d.ts.map +1 -1
  42. package/library/message/dispatcher.js +47 -2
  43. package/library/message/index.d.ts.map +1 -1
  44. package/library/stream/file-stream.d.ts +5 -0
  45. package/library/stream/file-stream.d.ts.map +1 -1
  46. package/library/stream/file-stream.js +41 -12
  47. package/library/stream/index.d.ts.map +1 -1
  48. package/library/stream/readable-stream.d.ts.map +1 -1
  49. package/library/stream/readable-stream.js +32 -30
  50. package/library/stream/types.d.ts +18 -0
  51. package/library/stream/types.d.ts.map +1 -1
  52. package/library/stream/writable-stream.d.ts +1 -0
  53. package/library/stream/writable-stream.d.ts.map +1 -1
  54. package/library/stream/writable-stream.js +7 -2
  55. package/library/types/index.d.ts +80 -28
  56. package/library/types/index.d.ts.map +1 -1
  57. package/library/utils/cache.d.ts +24 -0
  58. package/library/utils/cache.d.ts.map +1 -1
  59. package/library/utils/cache.js +76 -0
  60. package/library/utils/cookie.d.ts.map +1 -1
  61. package/library/utils/debug.d.ts.map +1 -1
  62. package/library/utils/debug.js +382 -20
  63. package/library/utils/index.d.ts +5 -0
  64. package/library/utils/index.d.ts.map +1 -1
  65. package/library/utils/index.js +14 -1
  66. package/library/utils/path-match.d.ts.map +1 -1
  67. package/library/utils/protocol.d.ts.map +1 -1
  68. package/package.json +3 -1
  69. package/react/library/__tests__/index.test.tsx +238 -267
  70. package/react/library/index.d.ts +4 -3
  71. package/react/library/index.d.ts.map +1 -1
  72. package/react/library/index.js +167 -158
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -9,215 +10,223 @@ exports.useServerHandler = useServerHandler;
9
10
  exports.useServerHandlerMap = useServerHandlerMap;
10
11
  require("core-js/modules/es.array.iterator.js");
11
12
  require("core-js/modules/es.array.map.js");
13
+ require("core-js/modules/es.array.reduce.js");
14
+ require("core-js/modules/es.array.sort.js");
12
15
  require("core-js/modules/web.dom-collections.iterator.js");
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
17
  var _react = require("react");
14
18
  var _ = require("../..");
15
- /**
16
- * React hook for using request-iframe client
17
- *
18
- * @param targetFnOrRef - function that returns iframe element or Window object, or a React ref object
19
- * @param options - client options
20
- * @param deps - dependency array (optional, for re-creating client when dependencies change)
21
- * @returns client instance
22
- *
23
- * @example
24
- * ```tsx
25
- * // Using function
26
- * const MyComponent = () => {
27
- * const iframeRef = useRef<HTMLIFrameElement>(null);
28
- * const client = useClient(() => iframeRef.current, { secretKey: 'my-app' });
29
- *
30
- * const handleClick = async () => {
31
- * if (client) {
32
- * const response = await client.send('/api/data', { id: 1 });
33
- * console.log(response.data);
34
- * }
35
- * };
36
- *
37
- * return (
38
- * <div>
39
- * <iframe ref={iframeRef} src="/iframe.html" />
40
- * <button onClick={handleClick}>Send Request</button>
41
- * </div>
42
- * );
43
- * };
44
- *
45
- * // Using ref directly
46
- * const MyComponent2 = () => {
47
- * const iframeRef = useRef<HTMLIFrameElement>(null);
48
- * const client = useClient(iframeRef, { secretKey: 'my-app' });
49
- * // ...
50
- * };
51
- * ```
19
+ /**
20
+ * React hook for using request-iframe client
21
+ *
22
+ * @param targetFnOrRef - function that returns iframe element or Window object, or a React ref object
23
+ * @param options - client options
24
+ * @param deps - dependency array (optional, for re-creating client when dependencies change)
25
+ * @returns client instance
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * // Using function
30
+ * const MyComponent = () => {
31
+ * const iframeRef = useRef<HTMLIFrameElement>(null);
32
+ * const client = useClient(() => iframeRef.current, { secretKey: 'my-app' });
33
+ *
34
+ * const handleClick = async () => {
35
+ * if (client) {
36
+ * const response = await client.send('/api/data', { id: 1 });
37
+ * console.log(response.data);
38
+ * }
39
+ * };
40
+ *
41
+ * return (
42
+ * <div>
43
+ * <iframe ref={iframeRef} src="/iframe.html" />
44
+ * <button onClick={handleClick}>Send Request</button>
45
+ * </div>
46
+ * );
47
+ * };
48
+ *
49
+ * // Using ref directly
50
+ * const MyComponent2 = () => {
51
+ * const iframeRef = useRef<HTMLIFrameElement>(null);
52
+ * const client = useClient(iframeRef, { secretKey: 'my-app' });
53
+ * // ...
54
+ * };
55
+ * ```
52
56
  */
53
57
  function useClient(targetFnOrRef, options, deps) {
54
- var clientRef = (0, _react.useRef)(null);
55
- var optionsRef = (0, _react.useRef)(options);
56
- var targetFnOrRefRef = (0, _react.useRef)(targetFnOrRef);
57
-
58
- // Update refs when they change
59
- (0, _react.useEffect)(() => {
60
- optionsRef.current = options;
61
- targetFnOrRefRef.current = targetFnOrRef;
62
- }, [options, targetFnOrRef]);
58
+ var _useState = (0, _react.useState)(null),
59
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
60
+ client = _useState2[0],
61
+ setClient = _useState2[1];
63
62
  (0, _react.useEffect)(() => {
64
63
  // Get current target
65
- var target = typeof targetFnOrRefRef.current === 'function' ? targetFnOrRefRef.current() : targetFnOrRefRef.current.current;
64
+ var target = typeof targetFnOrRef === 'function' ? targetFnOrRef() : targetFnOrRef.current;
65
+
66
+ // Destroy existing client if it exists
67
+ if (client) {
68
+ client.destroy();
69
+ setClient(null);
70
+ }
66
71
 
67
72
  // Only create client if target is available
68
73
  if (!target) {
69
- if (clientRef.current) {
70
- clientRef.current.destroy();
71
- clientRef.current = null;
72
- }
73
74
  return;
74
75
  }
75
76
 
76
- // Destroy previous client if exists
77
- if (clientRef.current) {
78
- clientRef.current.destroy();
79
- clientRef.current = null;
80
- }
81
-
82
77
  // Create new client instance
83
- var client = (0, _.requestIframeClient)(target, optionsRef.current);
84
- clientRef.current = client;
78
+ var newClient = (0, _.requestIframeClient)(target, options);
79
+ setClient(newClient);
85
80
 
86
81
  // Cleanup: destroy client on unmount
87
82
  return () => {
88
- if (clientRef.current) {
89
- clientRef.current.destroy();
90
- clientRef.current = null;
83
+ if (newClient) {
84
+ newClient.destroy();
85
+ setClient(null);
91
86
  }
92
87
  };
93
- }, deps !== undefined ? deps : [targetFnOrRef, options]);
94
- return clientRef.current;
88
+ }, deps !== undefined ? deps : []);
89
+ return client;
95
90
  }
96
91
 
97
- /**
98
- * React hook for using request-iframe server
99
- *
100
- * @param options - server options
101
- * @param deps - dependency array (optional, for re-creating server when dependencies change)
102
- * @returns server instance
103
- *
104
- * @example
105
- * ```tsx
106
- * const MyComponent = () => {
107
- * const server = useServer({ secretKey: 'my-app' });
108
- *
109
- * useEffect(() => {
110
- * server.on('/api/data', (req, res) => {
111
- * res.send({ data: 'Hello' });
112
- * });
113
- * }, [server]);
114
- *
115
- * return <div>Server Component</div>;
116
- * };
117
- * ```
92
+ /**
93
+ * React hook for using request-iframe server
94
+ *
95
+ * @param options - server options
96
+ * @param deps - dependency array (optional, for re-creating server when dependencies change)
97
+ * @returns server instance
98
+ *
99
+ * @example
100
+ * ```tsx
101
+ * const MyComponent = () => {
102
+ * const server = useServer({ secretKey: 'my-app' });
103
+ *
104
+ * useEffect(() => {
105
+ * const off = server.on('/api/data', (req, res) => {
106
+ * res.send({ data: 'Hello' });
107
+ * });
108
+ * return off;
109
+ * }, [server]);
110
+ *
111
+ * return <div>Server Component</div>;
112
+ * };
113
+ * ```
118
114
  */
119
115
  function useServer(options, deps) {
120
- var serverRef = (0, _react.useRef)(null);
121
- var optionsRef = (0, _react.useRef)(options);
122
-
123
- // Update options ref when options change
124
- (0, _react.useEffect)(() => {
125
- optionsRef.current = options;
126
- }, [options]);
116
+ var _useState3 = (0, _react.useState)(null),
117
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
118
+ server = _useState4[0],
119
+ setServer = _useState4[1];
127
120
  (0, _react.useEffect)(() => {
128
121
  // Create server instance
129
- var server = (0, _.requestIframeServer)(optionsRef.current);
130
- serverRef.current = server;
122
+ var newServer = (0, _.requestIframeServer)(options);
123
+ setServer(newServer);
131
124
 
132
125
  // Cleanup: destroy server on unmount
133
126
  return () => {
134
- if (serverRef.current) {
135
- serverRef.current.destroy();
136
- serverRef.current = null;
127
+ if (newServer) {
128
+ newServer.destroy();
129
+ setServer(null);
137
130
  }
138
131
  };
139
132
  }, deps !== undefined ? deps : []); // Only create once on mount by default
140
133
 
141
- return serverRef.current;
134
+ return server;
142
135
  }
143
136
 
144
- /**
145
- * React hook for registering server handlers
146
- *
147
- * @param server - server instance (from useServer)
148
- * @param path - route path
149
- * @param handler - handler function
150
- * @param deps - dependency array (optional, for re-registering when dependencies change)
151
- *
152
- * @example
153
- * ```tsx
154
- * const MyComponent = () => {
155
- * const server = useServer();
156
- * const [userId, setUserId] = useState(1);
157
- *
158
- * // Register handler that depends on userId
159
- * useServerHandler(server, '/api/user', (req, res) => {
160
- * res.send({ userId, data: 'Hello' });
161
- * }, [userId]);
162
- *
163
- * return <div>Server Component</div>;
164
- * };
165
- * ```
137
+ /**
138
+ * React hook for registering server handlers
139
+ *
140
+ * @param server - server instance (from useServer)
141
+ * @param path - route path
142
+ * @param handler - handler function
143
+ * @param deps - dependency array (optional, for re-registering when dependencies change)
144
+ *
145
+ * @example
146
+ * ```tsx
147
+ * const MyComponent = () => {
148
+ * const server = useServer();
149
+ * const [userId, setUserId] = useState(1);
150
+ *
151
+ * // Register handler that depends on userId
152
+ * useServerHandler(server, '/api/user', (req, res) => {
153
+ * res.send({ userId, data: 'Hello' });
154
+ * }, [userId]);
155
+ *
156
+ * return <div>Server Component</div>;
157
+ * };
158
+ * ```
166
159
  */
167
160
  function useServerHandler(server, path, handler, deps) {
161
+ var handlerRef = (0, _react.useRef)(handler);
162
+ handlerRef.current = handler;
163
+ var handlerWrapper = (0, _react.useCallback)((req, res) => {
164
+ var _handlerRef$current;
165
+ return (_handlerRef$current = handlerRef.current) === null || _handlerRef$current === void 0 ? void 0 : _handlerRef$current.call(handlerRef, req, res);
166
+ }, []);
168
167
  (0, _react.useEffect)(() => {
169
168
  if (!server) {
170
169
  return;
171
170
  }
172
171
 
173
- // Register handler and get unregister function
174
- var unregister = server.on(path, handler);
172
+ // Register handler with stable wrapper
173
+ var off = server.on(path, handlerWrapper);
175
174
 
176
175
  // Cleanup: unregister handler on unmount or when deps change
177
- return () => {
178
- unregister();
179
- };
180
- }, [server, path, handler, ...(deps || [])]);
176
+ return off;
177
+ }, [server, path, handlerWrapper, ...(deps || [])]);
181
178
  }
182
179
 
183
- /**
184
- * React hook for registering server handlers map
185
- *
186
- * @param server - server instance (from useServer)
187
- * @param map - map of route paths and handler functions
188
- * @param deps - dependency array (optional, for re-registering when dependencies change)
189
- *
190
- * @example
191
- * ```tsx
192
- * const MyComponent = () => {
193
- * const server = useServer();
194
- * const [userId, setUserId] = useState(1);
195
- *
196
- * // Register handlers using map
197
- * useServerHandlerMap(server, {
198
- * '/api/user': (req, res) => {
199
- * res.send({ userId, data: 'Hello' });
200
- * },
201
- * '/api/user2': (req, res) => {
202
- * res.send({ userId, data: 'Hello' });
203
- * }
204
- * }, [userId]);
205
- *
206
- * return <div>Server Component</div>;
207
- * };
208
- * ```
180
+ /**
181
+ * React hook for registering server handlers map
182
+ *
183
+ * @param server - server instance (from useServer)
184
+ * @param map - map of route paths and handler functions
185
+ * @param deps - dependency array (optional, for re-registering when dependencies change)
186
+ *
187
+ * @example
188
+ * ```tsx
189
+ * const MyComponent = () => {
190
+ * const server = useServer();
191
+ * const [userId, setUserId] = useState(1);
192
+ *
193
+ * // Register handlers using map
194
+ * useServerHandlerMap(server, {
195
+ * '/api/user': (req, res) => {
196
+ * res.send({ userId, data: 'Hello' });
197
+ * },
198
+ * '/api/user2': (req, res) => {
199
+ * res.send({ userId, data: 'Hello' });
200
+ * }
201
+ * }, [userId]);
202
+ *
203
+ * return <div>Server Component</div>;
204
+ * };
205
+ * ```
209
206
  */
210
207
  function useServerHandlerMap(server, map, deps) {
208
+ var mapRef = (0, _react.useRef)(map);
209
+ mapRef.current = map;
210
+ var keys = (0, _react.useMemo)(() => {
211
+ return Object.keys(map).sort();
212
+ }, [map]);
213
+ var mapWrapper = (0, _react.useMemo)(() => {
214
+ return keys.reduce((acc, key) => {
215
+ acc[key] = function (req, res) {
216
+ var _mapRef$current;
217
+ return (_mapRef$current = mapRef.current) === null || _mapRef$current === void 0 || (_mapRef$current = _mapRef$current[key]) === null || _mapRef$current === void 0 ? void 0 : _mapRef$current.call(this, req, res);
218
+ };
219
+ return acc;
220
+ }, {});
221
+ }, [keys]);
211
222
  (0, _react.useEffect)(() => {
212
223
  if (!server) {
213
224
  return;
214
225
  }
215
- // Register handlers using map
216
- server.map(map);
226
+ // Register handlers using map with stable wrappers
227
+ var off = server.map(mapWrapper);
217
228
 
218
229
  // Cleanup: unregister all handlers on unmount or when deps change
219
- return () => {
220
- server.off(Object.keys(map));
221
- };
222
- }, [server, map, ...(deps || [])]);
230
+ return off;
231
+ }, [server, mapWrapper, ...(deps || [])]);
223
232
  }