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
@@ -55,37 +55,73 @@ var _ = require("../..");
55
55
  * ```
56
56
  */
57
57
  function useClient(targetFnOrRef, options, deps) {
58
+ var clientRef = (0, _react.useRef)(null);
58
59
  var _useState = (0, _react.useState)(null),
59
60
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
60
61
  client = _useState2[0],
61
62
  setClient = _useState2[1];
62
- (0, _react.useEffect)(() => {
63
- // Get current target
64
- var target = typeof targetFnOrRef === 'function' ? targetFnOrRef() : targetFnOrRef.current;
63
+ var lastTargetRef = (0, _react.useRef)(null);
64
+ var targetFnOrRefRef = (0, _react.useRef)(targetFnOrRef);
65
+ var optionsRef = (0, _react.useRef)(options);
65
66
 
66
- // Destroy existing client if it exists
67
- if (client) {
68
- client.destroy();
69
- setClient(null);
67
+ /** Keep latest inputs without re-creating effect deps */
68
+ targetFnOrRefRef.current = targetFnOrRef;
69
+ optionsRef.current = options;
70
+ var getTarget = (0, _react.useCallback)(() => {
71
+ return typeof targetFnOrRefRef.current === 'function' ? targetFnOrRefRef.current() : targetFnOrRefRef.current.current;
72
+ }, []);
73
+
74
+ /**
75
+ * Snapshot the current target during render (pure read).
76
+ * We use this value as an effect dependency so the effect only runs when
77
+ * the target actually changes (avoids StrictMode update-depth loops).
78
+ */
79
+ var target = getTarget();
80
+ var destroy = (0, _react.useCallback)(() => {
81
+ if (clientRef.current) {
82
+ clientRef.current.destroy();
83
+ clientRef.current = null;
70
84
  }
85
+ lastTargetRef.current = null;
86
+ }, []);
87
+
88
+ /**
89
+ * Create/destroy client in effect to be compatible with React 18 StrictMode
90
+ * and concurrent rendering (avoid render-phase side effects).
91
+ */
92
+ (0, _react.useEffect)(() => {
93
+ /** If target unchanged, keep current client */
94
+ if (target === lastTargetRef.current) return;
71
95
 
72
- // Only create client if target is available
96
+ /** Target changed: destroy old client and maybe create a new one */
97
+ if (clientRef.current) {
98
+ clientRef.current.destroy();
99
+ clientRef.current = null;
100
+ }
101
+ lastTargetRef.current = target;
73
102
  if (!target) {
103
+ setClient(null);
74
104
  return;
75
105
  }
76
-
77
- // Create new client instance
78
- var newClient = (0, _.requestIframeClient)(target, options);
106
+ var newClient = (0, _.requestIframeClient)(target, optionsRef.current);
107
+ clientRef.current = newClient;
79
108
  setClient(newClient);
80
-
81
- // Cleanup: destroy client on unmount
82
109
  return () => {
83
- if (newClient) {
110
+ /** Cleanup only if it's still the current client */
111
+ if (clientRef.current === newClient) {
84
112
  newClient.destroy();
85
- setClient(null);
113
+ clientRef.current = null;
114
+ lastTargetRef.current = null;
86
115
  }
87
116
  };
88
- }, deps !== undefined ? deps : []);
117
+ }, deps ? [...deps, target] : [target]);
118
+
119
+ // Cleanup on unmount
120
+ (0, _react.useEffect)(() => {
121
+ return () => {
122
+ destroy();
123
+ };
124
+ }, []);
89
125
  return client;
90
126
  }
91
127
 
@@ -113,24 +149,46 @@ function useClient(targetFnOrRef, options, deps) {
113
149
  * ```
114
150
  */
115
151
  function useServer(options, deps) {
152
+ var serverRef = (0, _react.useRef)(null);
116
153
  var _useState3 = (0, _react.useState)(null),
117
154
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
118
155
  server = _useState4[0],
119
156
  setServer = _useState4[1];
157
+ var optionsRef = (0, _react.useRef)(options);
158
+ optionsRef.current = options;
159
+ var destroy = (0, _react.useCallback)(() => {
160
+ if (serverRef.current) {
161
+ serverRef.current.destroy();
162
+ serverRef.current = null;
163
+ }
164
+ }, []);
165
+
166
+ /**
167
+ * Create/destroy server in effect to be compatible with React 18 StrictMode
168
+ * and concurrent rendering (avoid render-phase side effects).
169
+ */
120
170
  (0, _react.useEffect)(() => {
121
- // Create server instance
122
- var newServer = (0, _.requestIframeServer)(options);
171
+ if (serverRef.current) {
172
+ serverRef.current.destroy();
173
+ serverRef.current = null;
174
+ }
175
+ var newServer = (0, _.requestIframeServer)(optionsRef.current);
176
+ serverRef.current = newServer;
123
177
  setServer(newServer);
124
-
125
- // Cleanup: destroy server on unmount
126
178
  return () => {
127
- if (newServer) {
179
+ if (serverRef.current === newServer) {
128
180
  newServer.destroy();
129
- setServer(null);
181
+ serverRef.current = null;
130
182
  }
131
183
  };
132
- }, deps !== undefined ? deps : []); // Only create once on mount by default
184
+ }, deps !== null && deps !== void 0 ? deps : []);
133
185
 
186
+ // Cleanup on unmount
187
+ (0, _react.useEffect)(() => {
188
+ return () => {
189
+ destroy();
190
+ };
191
+ }, []);
134
192
  return server;
135
193
  }
136
194
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@request-iframe/react",
3
+ "version": "0.0.1",
4
+ "main": "./library/index.js",
5
+ "module": "./library/index.js",
6
+ "typings": "./library/index.d.ts"
7
+ }