@bleedingdev/modern-js-server 3.9.0-ultramodern.17 → 3.9.0-ultramodern.18

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.
@@ -149,6 +149,7 @@ async function createDevServer(options, applyPlugins) {
149
149
  compiler,
150
150
  nodeServer,
151
151
  getRuntimeServer: ()=>currentRuntimeServer,
152
+ holdRequests: (task)=>reloadManager.hold(task),
152
153
  onFileChange: (filepath)=>{
153
154
  pendingReloadFiles.add(external_node_path_default().relative(pwd, filepath));
154
155
  reloadManager.schedule();
@@ -108,13 +108,21 @@ const notReadyHandle = ()=>new Response('Dev server is starting…', {
108
108
  'content-type': 'text/plain; charset=utf-8'
109
109
  }
110
110
  });
111
- var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
111
+ var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _held = /*#__PURE__*/ new WeakMap(), _holding = /*#__PURE__*/ new WeakMap(), _released = /*#__PURE__*/ new WeakSet(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
112
112
  class ReloadManager {
113
113
  setHandle(handle) {
114
114
  _class_private_field_set(this, _current, handle);
115
115
  }
116
116
  get handle() {
117
- return (request, ...args)=>_class_private_field_get(this, _current).call(this, request, ...args);
117
+ return (request, ...args)=>0 === _class_private_field_get(this, _holding) ? _class_private_field_get(this, _current).call(this, request, ...args) : _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_field_get(this, _current).call(this, request, ...args));
118
+ }
119
+ hold(task) {
120
+ _class_private_field_set(this, _holding, _class_private_field_get(this, _holding) + 1);
121
+ const run = _class_private_field_get(this, _held).then(task).finally(()=>{
122
+ _class_private_field_set(this, _holding, _class_private_field_get(this, _holding) - 1);
123
+ });
124
+ _class_private_field_set(this, _held, run.catch(()=>{}));
125
+ return run;
118
126
  }
119
127
  get currentHandle() {
120
128
  return _class_private_field_get(this, _current);
@@ -153,9 +161,11 @@ class ReloadManager {
153
161
  clearTimeout(_class_private_field_get(this, _debounceTimer));
154
162
  _class_private_field_set(this, _debounceTimer, null);
155
163
  }
156
- _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, _class_private_field_get(this, _current));
164
+ const current = _class_private_field_get(this, _current);
165
+ _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_method_get(this, _dispose, reloadManager_dispose).call(this, current));
157
166
  }
158
167
  constructor(options){
168
+ _class_private_method_init(this, _released);
159
169
  _class_private_method_init(this, _runLoop);
160
170
  _class_private_method_init(this, _reportBuildError);
161
171
  _class_private_method_init(this, _reportReloadCallbackError);
@@ -204,11 +214,21 @@ class ReloadManager {
204
214
  writable: true,
205
215
  value: void 0
206
216
  });
217
+ _class_private_field_init(this, _held, {
218
+ writable: true,
219
+ value: void 0
220
+ });
221
+ _class_private_field_init(this, _holding, {
222
+ writable: true,
223
+ value: void 0
224
+ });
207
225
  _class_private_field_set(this, _debounceTimer, null);
208
226
  _class_private_field_set(this, _running, false);
209
227
  _class_private_field_set(this, _pending, false);
210
228
  _class_private_field_set(this, _runningPromise, null);
211
229
  _class_private_field_set(this, _closed, false);
230
+ _class_private_field_set(this, _held, Promise.resolve());
231
+ _class_private_field_set(this, _holding, 0);
212
232
  _class_private_field_set(this, _current, options.initialHandle ?? notReadyHandle);
213
233
  _class_private_field_set(this, _build, options.build);
214
234
  _class_private_field_set(this, _debounceMs, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
@@ -217,6 +237,9 @@ class ReloadManager {
217
237
  _class_private_field_set(this, _onReloadError, options.onReloadError);
218
238
  }
219
239
  }
240
+ async function released() {
241
+ while(_class_private_field_get(this, _holding) > 0)await _class_private_field_get(this, _held);
242
+ }
220
243
  async function runLoop() {
221
244
  var _this, _this1;
222
245
  do {
@@ -228,6 +251,7 @@ async function runLoop() {
228
251
  _class_private_method_get(this, _reportBuildError, reportBuildError).call(this, error);
229
252
  continue;
230
253
  }
254
+ await _class_private_method_get(this, _released, released).call(this);
231
255
  if (_class_private_field_get(this, _closed)) return void await _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, next);
232
256
  const previous = _class_private_field_get(this, _current);
233
257
  _class_private_field_set(this, _current, next);
package/dist/cjs/dev.js CHANGED
@@ -81,7 +81,7 @@ const devRuntimeMiddlewarePlugin = (options, compiler)=>({
81
81
  });
82
82
  }
83
83
  });
84
- function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer }) {
84
+ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer }) {
85
85
  const { close, connectWebSocket } = builderDevServer || {};
86
86
  const closeCb = [];
87
87
  close && closeCb.push(close);
@@ -91,10 +91,10 @@ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, build
91
91
  builder?.onDevCompileDone(({ stats })=>{
92
92
  if ('server' !== stats.toJson({
93
93
  all: false
94
- }).name) {
94
+ }).name) holdRequests(async ()=>{
95
95
  const runtimeServer = getRuntimeServer();
96
- if (runtimeServer) (0, index_js_namespaceObject.onRepack)(distDir, runtimeServer.hooks);
97
- }
96
+ if (runtimeServer) await (0, index_js_namespaceObject.onRepack)(distDir, runtimeServer.hooks);
97
+ }).catch((error)=>utils_namespaceObject.logger.error(error));
98
98
  });
99
99
  const { watchOptions } = config.server;
100
100
  const mockDir = config.dev?.mockDir;
@@ -52,15 +52,18 @@ const cleanFederationRuntime = ()=>{
52
52
  const remoteEntries = runtime.__GLOBAL_LOADING_REMOTE_ENTRY__ ?? {};
53
53
  for (const key of Object.keys(remoteEntries))delete remoteEntries[key];
54
54
  };
55
- const onRepack = (distDir, hooks)=>{
56
- cleanSSRCache(distDir);
57
- cleanFederationRuntime();
58
- fileReader_namespaceObject.fileReader.reset();
59
- hooks.onReset.call({
60
- event: {
61
- type: 'repack'
62
- }
63
- });
55
+ const onRepack = async (distDir, hooks)=>{
56
+ try {
57
+ await hooks.onReset.call({
58
+ event: {
59
+ type: 'repack'
60
+ }
61
+ });
62
+ } finally{
63
+ cleanSSRCache(distDir);
64
+ cleanFederationRuntime();
65
+ fileReader_namespaceObject.fileReader.reset();
66
+ }
64
67
  };
65
68
  exports.onRepack = __webpack_exports__.onRepack;
66
69
  for(var __rspack_i in __webpack_exports__)if (-1 === [
@@ -107,6 +107,7 @@ async function createDevServer(options, applyPlugins) {
107
107
  compiler,
108
108
  nodeServer,
109
109
  getRuntimeServer: ()=>currentRuntimeServer,
110
+ holdRequests: (task)=>reloadManager.hold(task),
110
111
  onFileChange: (filepath)=>{
111
112
  pendingReloadFiles.add(node_path.relative(pwd, filepath));
112
113
  reloadManager.schedule();
@@ -74,13 +74,21 @@ const notReadyHandle = ()=>new Response('Dev server is starting…', {
74
74
  'content-type': 'text/plain; charset=utf-8'
75
75
  }
76
76
  });
77
- var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
77
+ var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _held = /*#__PURE__*/ new WeakMap(), _holding = /*#__PURE__*/ new WeakMap(), _released = /*#__PURE__*/ new WeakSet(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
78
78
  class ReloadManager {
79
79
  setHandle(handle) {
80
80
  _class_private_field_set(this, _current, handle);
81
81
  }
82
82
  get handle() {
83
- return (request, ...args)=>_class_private_field_get(this, _current).call(this, request, ...args);
83
+ return (request, ...args)=>0 === _class_private_field_get(this, _holding) ? _class_private_field_get(this, _current).call(this, request, ...args) : _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_field_get(this, _current).call(this, request, ...args));
84
+ }
85
+ hold(task) {
86
+ _class_private_field_set(this, _holding, _class_private_field_get(this, _holding) + 1);
87
+ const run = _class_private_field_get(this, _held).then(task).finally(()=>{
88
+ _class_private_field_set(this, _holding, _class_private_field_get(this, _holding) - 1);
89
+ });
90
+ _class_private_field_set(this, _held, run.catch(()=>{}));
91
+ return run;
84
92
  }
85
93
  get currentHandle() {
86
94
  return _class_private_field_get(this, _current);
@@ -119,9 +127,11 @@ class ReloadManager {
119
127
  clearTimeout(_class_private_field_get(this, _debounceTimer));
120
128
  _class_private_field_set(this, _debounceTimer, null);
121
129
  }
122
- _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, _class_private_field_get(this, _current));
130
+ const current = _class_private_field_get(this, _current);
131
+ _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_method_get(this, _dispose, reloadManager_dispose).call(this, current));
123
132
  }
124
133
  constructor(options){
134
+ _class_private_method_init(this, _released);
125
135
  _class_private_method_init(this, _runLoop);
126
136
  _class_private_method_init(this, _reportBuildError);
127
137
  _class_private_method_init(this, _reportReloadCallbackError);
@@ -170,11 +180,21 @@ class ReloadManager {
170
180
  writable: true,
171
181
  value: void 0
172
182
  });
183
+ _class_private_field_init(this, _held, {
184
+ writable: true,
185
+ value: void 0
186
+ });
187
+ _class_private_field_init(this, _holding, {
188
+ writable: true,
189
+ value: void 0
190
+ });
173
191
  _class_private_field_set(this, _debounceTimer, null);
174
192
  _class_private_field_set(this, _running, false);
175
193
  _class_private_field_set(this, _pending, false);
176
194
  _class_private_field_set(this, _runningPromise, null);
177
195
  _class_private_field_set(this, _closed, false);
196
+ _class_private_field_set(this, _held, Promise.resolve());
197
+ _class_private_field_set(this, _holding, 0);
178
198
  _class_private_field_set(this, _current, options.initialHandle ?? notReadyHandle);
179
199
  _class_private_field_set(this, _build, options.build);
180
200
  _class_private_field_set(this, _debounceMs, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
@@ -183,6 +203,9 @@ class ReloadManager {
183
203
  _class_private_field_set(this, _onReloadError, options.onReloadError);
184
204
  }
185
205
  }
206
+ async function released() {
207
+ while(_class_private_field_get(this, _holding) > 0)await _class_private_field_get(this, _held);
208
+ }
186
209
  async function runLoop() {
187
210
  var _this, _this1;
188
211
  do {
@@ -194,6 +217,7 @@ async function runLoop() {
194
217
  _class_private_method_get(this, _reportBuildError, reportBuildError).call(this, error);
195
218
  continue;
196
219
  }
220
+ await _class_private_method_get(this, _released, released).call(this);
197
221
  if (_class_private_field_get(this, _closed)) return void await _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, next);
198
222
  const previous = _class_private_field_get(this, _current);
199
223
  _class_private_field_set(this, _current, next);
package/dist/esm/dev.mjs CHANGED
@@ -48,7 +48,7 @@ const devRuntimeMiddlewarePlugin = (options, compiler)=>({
48
48
  });
49
49
  }
50
50
  });
51
- function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer }) {
51
+ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer }) {
52
52
  const { close, connectWebSocket } = builderDevServer || {};
53
53
  const closeCb = [];
54
54
  close && closeCb.push(close);
@@ -58,10 +58,10 @@ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, build
58
58
  builder?.onDevCompileDone(({ stats })=>{
59
59
  if ('server' !== stats.toJson({
60
60
  all: false
61
- }).name) {
61
+ }).name) holdRequests(async ()=>{
62
62
  const runtimeServer = getRuntimeServer();
63
- if (runtimeServer) onRepack(distDir, runtimeServer.hooks);
64
- }
63
+ if (runtimeServer) await onRepack(distDir, runtimeServer.hooks);
64
+ }).catch((error)=>logger.error(error));
65
65
  });
66
66
  const { watchOptions } = config.server;
67
67
  const mockDir = config.dev?.mockDir;
@@ -20,14 +20,17 @@ const cleanFederationRuntime = ()=>{
20
20
  const remoteEntries = runtime.__GLOBAL_LOADING_REMOTE_ENTRY__ ?? {};
21
21
  for (const key of Object.keys(remoteEntries))delete remoteEntries[key];
22
22
  };
23
- const onRepack = (distDir, hooks)=>{
24
- cleanSSRCache(distDir);
25
- cleanFederationRuntime();
26
- fileReader.reset();
27
- hooks.onReset.call({
28
- event: {
29
- type: 'repack'
30
- }
31
- });
23
+ const onRepack = async (distDir, hooks)=>{
24
+ try {
25
+ await hooks.onReset.call({
26
+ event: {
27
+ type: 'repack'
28
+ }
29
+ });
30
+ } finally{
31
+ cleanSSRCache(distDir);
32
+ cleanFederationRuntime();
33
+ fileReader.reset();
34
+ }
32
35
  };
33
36
  export { onRepack };
@@ -108,6 +108,7 @@ async function createDevServer(options, applyPlugins) {
108
108
  compiler,
109
109
  nodeServer,
110
110
  getRuntimeServer: ()=>currentRuntimeServer,
111
+ holdRequests: (task)=>reloadManager.hold(task),
111
112
  onFileChange: (filepath)=>{
112
113
  pendingReloadFiles.add(node_path.relative(pwd, filepath));
113
114
  reloadManager.schedule();
@@ -75,13 +75,21 @@ const notReadyHandle = ()=>new Response('Dev server is starting…', {
75
75
  'content-type': 'text/plain; charset=utf-8'
76
76
  }
77
77
  });
78
- var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
78
+ var _current = /*#__PURE__*/ new WeakMap(), _build = /*#__PURE__*/ new WeakMap(), _debounceMs = /*#__PURE__*/ new WeakMap(), _onReload = /*#__PURE__*/ new WeakMap(), _onError = /*#__PURE__*/ new WeakMap(), _onReloadError = /*#__PURE__*/ new WeakMap(), _debounceTimer = /*#__PURE__*/ new WeakMap(), _running = /*#__PURE__*/ new WeakMap(), _pending = /*#__PURE__*/ new WeakMap(), _runningPromise = /*#__PURE__*/ new WeakMap(), _closed = /*#__PURE__*/ new WeakMap(), _held = /*#__PURE__*/ new WeakMap(), _holding = /*#__PURE__*/ new WeakMap(), _released = /*#__PURE__*/ new WeakSet(), _runLoop = /*#__PURE__*/ new WeakSet(), _reportBuildError = /*#__PURE__*/ new WeakSet(), _reportReloadCallbackError = /*#__PURE__*/ new WeakSet(), _dispose = /*#__PURE__*/ new WeakSet();
79
79
  class ReloadManager {
80
80
  setHandle(handle) {
81
81
  _class_private_field_set(this, _current, handle);
82
82
  }
83
83
  get handle() {
84
- return (request, ...args)=>_class_private_field_get(this, _current).call(this, request, ...args);
84
+ return (request, ...args)=>0 === _class_private_field_get(this, _holding) ? _class_private_field_get(this, _current).call(this, request, ...args) : _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_field_get(this, _current).call(this, request, ...args));
85
+ }
86
+ hold(task) {
87
+ _class_private_field_set(this, _holding, _class_private_field_get(this, _holding) + 1);
88
+ const run = _class_private_field_get(this, _held).then(task).finally(()=>{
89
+ _class_private_field_set(this, _holding, _class_private_field_get(this, _holding) - 1);
90
+ });
91
+ _class_private_field_set(this, _held, run.catch(()=>{}));
92
+ return run;
85
93
  }
86
94
  get currentHandle() {
87
95
  return _class_private_field_get(this, _current);
@@ -120,9 +128,11 @@ class ReloadManager {
120
128
  clearTimeout(_class_private_field_get(this, _debounceTimer));
121
129
  _class_private_field_set(this, _debounceTimer, null);
122
130
  }
123
- _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, _class_private_field_get(this, _current));
131
+ const current = _class_private_field_get(this, _current);
132
+ _class_private_method_get(this, _released, released).call(this).then(()=>_class_private_method_get(this, _dispose, reloadManager_dispose).call(this, current));
124
133
  }
125
134
  constructor(options){
135
+ _class_private_method_init(this, _released);
126
136
  _class_private_method_init(this, _runLoop);
127
137
  _class_private_method_init(this, _reportBuildError);
128
138
  _class_private_method_init(this, _reportReloadCallbackError);
@@ -171,11 +181,21 @@ class ReloadManager {
171
181
  writable: true,
172
182
  value: void 0
173
183
  });
184
+ _class_private_field_init(this, _held, {
185
+ writable: true,
186
+ value: void 0
187
+ });
188
+ _class_private_field_init(this, _holding, {
189
+ writable: true,
190
+ value: void 0
191
+ });
174
192
  _class_private_field_set(this, _debounceTimer, null);
175
193
  _class_private_field_set(this, _running, false);
176
194
  _class_private_field_set(this, _pending, false);
177
195
  _class_private_field_set(this, _runningPromise, null);
178
196
  _class_private_field_set(this, _closed, false);
197
+ _class_private_field_set(this, _held, Promise.resolve());
198
+ _class_private_field_set(this, _holding, 0);
179
199
  _class_private_field_set(this, _current, options.initialHandle ?? notReadyHandle);
180
200
  _class_private_field_set(this, _build, options.build);
181
201
  _class_private_field_set(this, _debounceMs, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
@@ -184,6 +204,9 @@ class ReloadManager {
184
204
  _class_private_field_set(this, _onReloadError, options.onReloadError);
185
205
  }
186
206
  }
207
+ async function released() {
208
+ while(_class_private_field_get(this, _holding) > 0)await _class_private_field_get(this, _held);
209
+ }
187
210
  async function runLoop() {
188
211
  var _this, _this1;
189
212
  do {
@@ -195,6 +218,7 @@ async function runLoop() {
195
218
  _class_private_method_get(this, _reportBuildError, reportBuildError).call(this, error);
196
219
  continue;
197
220
  }
221
+ await _class_private_method_get(this, _released, released).call(this);
198
222
  if (_class_private_field_get(this, _closed)) return void await _class_private_method_get(this, _dispose, reloadManager_dispose).call(this, next);
199
223
  const previous = _class_private_field_get(this, _current);
200
224
  _class_private_field_set(this, _current, next);
@@ -49,7 +49,7 @@ const devRuntimeMiddlewarePlugin = (options, compiler)=>({
49
49
  });
50
50
  }
51
51
  });
52
- function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer }) {
52
+ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer }) {
53
53
  const { close, connectWebSocket } = builderDevServer || {};
54
54
  const closeCb = [];
55
55
  close && closeCb.push(close);
@@ -59,10 +59,10 @@ function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, build
59
59
  builder?.onDevCompileDone(({ stats })=>{
60
60
  if ('server' !== stats.toJson({
61
61
  all: false
62
- }).name) {
62
+ }).name) holdRequests(async ()=>{
63
63
  const runtimeServer = getRuntimeServer();
64
- if (runtimeServer) onRepack(distDir, runtimeServer.hooks);
65
- }
64
+ if (runtimeServer) await onRepack(distDir, runtimeServer.hooks);
65
+ }).catch((error)=>logger.error(error));
66
66
  });
67
67
  const { watchOptions } = config.server;
68
68
  const mockDir = config.dev?.mockDir;
@@ -22,14 +22,17 @@ const cleanFederationRuntime = ()=>{
22
22
  const remoteEntries = runtime.__GLOBAL_LOADING_REMOTE_ENTRY__ ?? {};
23
23
  for (const key of Object.keys(remoteEntries))delete remoteEntries[key];
24
24
  };
25
- const onRepack = (distDir, hooks)=>{
26
- cleanSSRCache(distDir);
27
- cleanFederationRuntime();
28
- fileReader.reset();
29
- hooks.onReset.call({
30
- event: {
31
- type: 'repack'
32
- }
33
- });
25
+ const onRepack = async (distDir, hooks)=>{
26
+ try {
27
+ await hooks.onReset.call({
28
+ event: {
29
+ type: 'repack'
30
+ }
31
+ });
32
+ } finally{
33
+ cleanSSRCache(distDir);
34
+ cleanFederationRuntime();
35
+ fileReader.reset();
36
+ }
34
37
  };
35
38
  export { onRepack };
@@ -71,6 +71,15 @@ export declare class ReloadManager {
71
71
  * be recreated on reload.
72
72
  */
73
73
  get handle(): ReloadableHandle;
74
+ /**
75
+ * Run `task` after the previously held tasks, and make requests arriving
76
+ * through `handle` wait until it settles. A reload waits for it before it
77
+ * swaps the runtime. Requests already dispatched are not waited for: an SSR
78
+ * loader fetching its own dev server would deadlock. The task itself must
79
+ * not await a request to this handle, which waits for the task.
80
+ * Returns the task's own result, rejection included.
81
+ */
82
+ hold(task: () => Promise<void>): Promise<void>;
74
83
  /** The currently active resolved handle (introspection / tests). */
75
84
  get currentHandle(): ReloadableHandle;
76
85
  /** Whether a reload is currently running (introspection / tests). */
@@ -35,6 +35,11 @@ export interface DevInfraOptions {
35
35
  nodeServer?: NodeServer | NodeHttpsServer | Http2SecureServer;
36
36
  /** Accessor for the currently-active runtime ServerBase (a mutable ref). */
37
37
  getRuntimeServer: () => ServerBase | undefined;
38
+ /**
39
+ * Run a repack task while new requests wait for it (`ReloadManager.hold`),
40
+ * so no request re-requires the server bundle mid-reset.
41
+ */
42
+ holdRequests: (task: () => Promise<void>) => Promise<void>;
38
43
  /**
39
44
  * Triggered when a watched user server file changes (require cache already
40
45
  * busted). Wired to the runtime reload scheduler.
@@ -64,5 +69,5 @@ export interface DevInfra {
64
69
  * runtime, so a later phase can swap the trigger to the reload scheduler
65
70
  * without leaking a stale closure to a dead runtime.
66
71
  */
67
- export declare function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, onFileChange, onClose, nodeServer, }: DevInfraOptions): DevInfra;
72
+ export declare function setupDevInfra({ config, pwd, distDir, apiDir, sharedDir, builder, builderDevServer, getRuntimeServer, holdRequests, onFileChange, onClose, nodeServer, }: DevInfraOptions): DevInfra;
68
73
  export {};
@@ -1,2 +1,12 @@
1
1
  import type { ServerPluginHooks } from '@modern-js/server-core';
2
- export declare const onRepack: (distDir: string, hooks: ServerPluginHooks) => void;
2
+ /**
3
+ * Reset the dev server after the server bundle is rebuilt.
4
+ *
5
+ * Contract: the `onReset({ event: { type: 'repack' } })` handlers run in
6
+ * registration order and are awaited before the previous generation is purged.
7
+ * The caller holds new requests until this promise settles, so no request
8
+ * re-requires the bundle while a handler is still running. As with every async
9
+ * server hook, a rejecting handler skips the handlers after it; the generation
10
+ * is still purged and the promise rejects with that error.
11
+ */
12
+ export declare const onRepack: (distDir: string, hooks: ServerPluginHooks) => Promise<void>;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "modern",
18
18
  "modern.js"
19
19
  ],
20
- "version": "3.9.0-ultramodern.17",
20
+ "version": "3.9.0-ultramodern.18",
21
21
  "types": "./dist/types/index.d.ts",
22
22
  "main": "./dist/cjs/index.js",
23
23
  "exports": {
@@ -38,11 +38,11 @@
38
38
  }
39
39
  },
40
40
  "dependencies": {
41
- "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.17",
42
- "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.17",
43
- "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.17",
44
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.17",
45
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.17",
41
+ "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.18",
42
+ "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.18",
43
+ "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.18",
44
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.18",
45
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.18",
46
46
  "@swc/helpers": "^0.5.23",
47
47
  "connect-history-api-fallback": "^2.0.0",
48
48
  "http-compression": "1.1.3",
@@ -51,7 +51,7 @@
51
51
  "ws": "^8.21.3"
52
52
  },
53
53
  "devDependencies": {
54
- "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.17",
54
+ "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.18",
55
55
  "@module-federation/runtime": "npm:@bleedingdev/mf-runtime@2.9.1",
56
56
  "@rslib/core": "1.0.2",
57
57
  "@scripts/rstest-config": "2.66.0",