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.
- package/README.CN.md +269 -12
- package/README.md +266 -11
- package/library/__tests__/channel.test.ts +420 -0
- package/library/__tests__/debug.test.ts +588 -0
- package/library/__tests__/dispatcher.test.ts +481 -0
- package/library/__tests__/requestIframe.test.ts +2127 -99
- package/library/__tests__/server.test.ts +738 -0
- package/library/api/client.d.ts.map +1 -1
- package/library/api/client.js +11 -6
- package/library/api/server.d.ts +4 -3
- package/library/api/server.d.ts.map +1 -1
- package/library/api/server.js +25 -7
- package/library/constants/index.d.ts +14 -4
- package/library/constants/index.d.ts.map +1 -1
- package/library/constants/index.js +15 -7
- package/library/constants/messages.d.ts +35 -0
- package/library/constants/messages.d.ts.map +1 -1
- package/library/constants/messages.js +36 -1
- package/library/core/client-server.d.ts +101 -0
- package/library/core/client-server.d.ts.map +1 -0
- package/library/core/client-server.js +266 -0
- package/library/core/client.d.ts +22 -6
- package/library/core/client.d.ts.map +1 -1
- package/library/core/client.js +159 -24
- package/library/core/request.d.ts.map +1 -1
- package/library/core/response.d.ts +5 -1
- package/library/core/response.d.ts.map +1 -1
- package/library/core/response.js +85 -70
- package/library/core/server-client.d.ts +3 -1
- package/library/core/server-client.d.ts.map +1 -1
- package/library/core/server-client.js +19 -9
- package/library/core/server.d.ts +9 -1
- package/library/core/server.d.ts.map +1 -1
- package/library/core/server.js +96 -52
- package/library/index.d.ts +1 -1
- package/library/index.js +2 -2
- package/library/interceptors/index.d.ts.map +1 -1
- package/library/message/channel.d.ts +3 -1
- package/library/message/channel.d.ts.map +1 -1
- package/library/message/dispatcher.d.ts +7 -2
- package/library/message/dispatcher.d.ts.map +1 -1
- package/library/message/dispatcher.js +47 -2
- package/library/message/index.d.ts.map +1 -1
- package/library/stream/file-stream.d.ts +5 -0
- package/library/stream/file-stream.d.ts.map +1 -1
- package/library/stream/file-stream.js +41 -12
- package/library/stream/index.d.ts.map +1 -1
- package/library/stream/readable-stream.d.ts.map +1 -1
- package/library/stream/readable-stream.js +32 -30
- package/library/stream/types.d.ts +18 -0
- package/library/stream/types.d.ts.map +1 -1
- package/library/stream/writable-stream.d.ts +1 -0
- package/library/stream/writable-stream.d.ts.map +1 -1
- package/library/stream/writable-stream.js +7 -2
- package/library/types/index.d.ts +80 -28
- package/library/types/index.d.ts.map +1 -1
- package/library/utils/cache.d.ts +24 -0
- package/library/utils/cache.d.ts.map +1 -1
- package/library/utils/cache.js +76 -0
- package/library/utils/cookie.d.ts.map +1 -1
- package/library/utils/debug.d.ts.map +1 -1
- package/library/utils/debug.js +382 -20
- package/library/utils/index.d.ts +5 -0
- package/library/utils/index.d.ts.map +1 -1
- package/library/utils/index.js +14 -1
- package/library/utils/path-match.d.ts.map +1 -1
- package/library/utils/protocol.d.ts.map +1 -1
- package/package.json +3 -1
- package/react/library/__tests__/index.test.tsx +238 -267
- package/react/library/index.d.ts +4 -3
- package/react/library/index.d.ts.map +1 -1
- package/react/library/index.js +167 -158
package/react/library/index.js
CHANGED
|
@@ -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
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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
|
|
84
|
-
|
|
78
|
+
var newClient = (0, _.requestIframeClient)(target, options);
|
|
79
|
+
setClient(newClient);
|
|
85
80
|
|
|
86
81
|
// Cleanup: destroy client on unmount
|
|
87
82
|
return () => {
|
|
88
|
-
if (
|
|
89
|
-
|
|
90
|
-
|
|
83
|
+
if (newClient) {
|
|
84
|
+
newClient.destroy();
|
|
85
|
+
setClient(null);
|
|
91
86
|
}
|
|
92
87
|
};
|
|
93
|
-
}, deps !== undefined ? deps : [
|
|
94
|
-
return
|
|
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
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
|
130
|
-
|
|
122
|
+
var newServer = (0, _.requestIframeServer)(options);
|
|
123
|
+
setServer(newServer);
|
|
131
124
|
|
|
132
125
|
// Cleanup: destroy server on unmount
|
|
133
126
|
return () => {
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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
|
|
174
|
-
var
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
221
|
-
};
|
|
222
|
-
}, [server, map, ...(deps || [])]);
|
|
230
|
+
return off;
|
|
231
|
+
}, [server, mapWrapper, ...(deps || [])]);
|
|
223
232
|
}
|