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,118 @@
1
+ import { type RefObject } from 'react';
2
+ import { type RequestIframeClient, type RequestIframeClientOptions, type RequestIframeServer, type RequestIframeServerOptions, type ServerHandler } from '../..';
3
+ /**
4
+ * React hook for using request-iframe client
5
+ *
6
+ * @param targetFnOrRef - function that returns iframe element or Window object, or a React ref object
7
+ * @param options - client options
8
+ * @param deps - dependency array (optional, for re-creating client when dependencies change)
9
+ * @returns client instance
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * // Using function
14
+ * const MyComponent = () => {
15
+ * const iframeRef = useRef<HTMLIFrameElement>(null);
16
+ * const client = useClient(() => iframeRef.current, { secretKey: 'my-app' });
17
+ *
18
+ * const handleClick = async () => {
19
+ * if (client) {
20
+ * const response = await client.send('/api/data', { id: 1 });
21
+ * console.log(response.data);
22
+ * }
23
+ * };
24
+ *
25
+ * return (
26
+ * <div>
27
+ * <iframe ref={iframeRef} src="/iframe.html" />
28
+ * <button onClick={handleClick}>Send Request</button>
29
+ * </div>
30
+ * );
31
+ * };
32
+ *
33
+ * // Using ref directly
34
+ * const MyComponent2 = () => {
35
+ * const iframeRef = useRef<HTMLIFrameElement>(null);
36
+ * const client = useClient(iframeRef, { secretKey: 'my-app' });
37
+ * // ...
38
+ * };
39
+ * ```
40
+ */
41
+ export declare function useClient(targetFnOrRef: (() => HTMLIFrameElement | Window | null) | RefObject<HTMLIFrameElement | Window | null>, options?: RequestIframeClientOptions, deps?: readonly unknown[]): RequestIframeClient | null;
42
+ /**
43
+ * React hook for using request-iframe server
44
+ *
45
+ * @param options - server options
46
+ * @param deps - dependency array (optional, for re-creating server when dependencies change)
47
+ * @returns server instance
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * const MyComponent = () => {
52
+ * const server = useServer({ secretKey: 'my-app' });
53
+ *
54
+ * useEffect(() => {
55
+ * const off = server.on('/api/data', (req, res) => {
56
+ * res.send({ data: 'Hello' });
57
+ * });
58
+ * return off;
59
+ * }, [server]);
60
+ *
61
+ * return <div>Server Component</div>;
62
+ * };
63
+ * ```
64
+ */
65
+ export declare function useServer(options?: RequestIframeServerOptions, deps?: readonly unknown[]): RequestIframeServer | null;
66
+ /**
67
+ * React hook for registering server handlers
68
+ *
69
+ * @param server - server instance (from useServer)
70
+ * @param path - route path
71
+ * @param handler - handler function
72
+ * @param deps - dependency array (optional, for re-registering when dependencies change)
73
+ *
74
+ * @example
75
+ * ```tsx
76
+ * const MyComponent = () => {
77
+ * const server = useServer();
78
+ * const [userId, setUserId] = useState(1);
79
+ *
80
+ * // Register handler that depends on userId
81
+ * useServerHandler(server, '/api/user', (req, res) => {
82
+ * res.send({ userId, data: 'Hello' });
83
+ * }, [userId]);
84
+ *
85
+ * return <div>Server Component</div>;
86
+ * };
87
+ * ```
88
+ */
89
+ export declare function useServerHandler(server: RequestIframeServer | null, path: string, handler: ServerHandler, deps: readonly unknown[]): void;
90
+ /**
91
+ * React hook for registering server handlers map
92
+ *
93
+ * @param server - server instance (from useServer)
94
+ * @param map - map of route paths and handler functions
95
+ * @param deps - dependency array (optional, for re-registering when dependencies change)
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * const MyComponent = () => {
100
+ * const server = useServer();
101
+ * const [userId, setUserId] = useState(1);
102
+ *
103
+ * // Register handlers using map
104
+ * useServerHandlerMap(server, {
105
+ * '/api/user': (req, res) => {
106
+ * res.send({ userId, data: 'Hello' });
107
+ * },
108
+ * '/api/user2': (req, res) => {
109
+ * res.send({ userId, data: 'Hello' });
110
+ * }
111
+ * }, [userId]);
112
+ *
113
+ * return <div>Server Component</div>;
114
+ * };
115
+ * ```
116
+ */
117
+ export declare function useServerHandlerMap(server: RequestIframeServer | null, map: Record<string, ServerHandler>, deps: readonly unknown[]): void;
118
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1F,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,SAAS,CACvB,aAAa,EAAE,CAAC,MAAM,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC,EACvG,OAAO,CAAC,EAAE,0BAA0B,EACpC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,GACxB,mBAAmB,GAAG,IAAI,CAkC5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CACvB,OAAO,CAAC,EAAE,0BAA0B,EACpC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,GACxB,mBAAmB,GAAG,IAAI,CAkB5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,SAAS,OAAO,EAAE,GACvB,IAAI,CAmBN;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAClC,IAAI,EAAE,SAAS,OAAO,EAAE,GACvB,IAAI,CA2BN"}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useClient = useClient;
8
+ exports.useServer = useServer;
9
+ exports.useServerHandler = useServerHandler;
10
+ exports.useServerHandlerMap = useServerHandlerMap;
11
+ require("core-js/modules/es.array.iterator.js");
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");
15
+ require("core-js/modules/web.dom-collections.iterator.js");
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+ var _react = require("react");
18
+ var _ = require("../..");
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
+ * ```
56
+ */
57
+ function useClient(targetFnOrRef, options, deps) {
58
+ var _useState = (0, _react.useState)(null),
59
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
60
+ client = _useState2[0],
61
+ setClient = _useState2[1];
62
+ (0, _react.useEffect)(() => {
63
+ // Get current target
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
+ }
71
+
72
+ // Only create client if target is available
73
+ if (!target) {
74
+ return;
75
+ }
76
+
77
+ // Create new client instance
78
+ var newClient = (0, _.requestIframeClient)(target, options);
79
+ setClient(newClient);
80
+
81
+ // Cleanup: destroy client on unmount
82
+ return () => {
83
+ if (newClient) {
84
+ newClient.destroy();
85
+ setClient(null);
86
+ }
87
+ };
88
+ }, deps !== undefined ? deps : []);
89
+ return client;
90
+ }
91
+
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
+ * ```
114
+ */
115
+ function useServer(options, deps) {
116
+ var _useState3 = (0, _react.useState)(null),
117
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
118
+ server = _useState4[0],
119
+ setServer = _useState4[1];
120
+ (0, _react.useEffect)(() => {
121
+ // Create server instance
122
+ var newServer = (0, _.requestIframeServer)(options);
123
+ setServer(newServer);
124
+
125
+ // Cleanup: destroy server on unmount
126
+ return () => {
127
+ if (newServer) {
128
+ newServer.destroy();
129
+ setServer(null);
130
+ }
131
+ };
132
+ }, deps !== undefined ? deps : []); // Only create once on mount by default
133
+
134
+ return server;
135
+ }
136
+
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
+ * ```
159
+ */
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
+ }, []);
167
+ (0, _react.useEffect)(() => {
168
+ if (!server) {
169
+ return;
170
+ }
171
+
172
+ // Register handler with stable wrapper
173
+ var off = server.on(path, handlerWrapper);
174
+
175
+ // Cleanup: unregister handler on unmount or when deps change
176
+ return off;
177
+ }, [server, path, handlerWrapper, ...(deps || [])]);
178
+ }
179
+
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
+ * ```
206
+ */
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]);
222
+ (0, _react.useEffect)(() => {
223
+ if (!server) {
224
+ return;
225
+ }
226
+ // Register handlers using map with stable wrappers
227
+ var off = server.map(mapWrapper);
228
+
229
+ // Cleanup: unregister all handlers on unmount or when deps change
230
+ return off;
231
+ }, [server, mapWrapper, ...(deps || [])]);
232
+ }