@bleedingdev/modern-js-federation-runtime 3.9.0-ultramodern.9 → 3.9.3-ultramodern.10

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 (55) hide show
  1. package/dist/cjs/module-federation/consume-surface.js +6 -16
  2. package/dist/cjs/module-federation/distributed-ssr.js +6 -1
  3. package/dist/cjs/module-federation/index.js +13 -239
  4. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +1 -1
  5. package/dist/cjs/module-federation/native-browser-dev-client.js +320 -0
  6. package/dist/cjs/module-federation/native-browser-dev-refresh.js +226 -0
  7. package/dist/cjs/module-federation/native-browser-dev-runtime-plugin.js +233 -0
  8. package/dist/cjs/module-federation/native-dev-refresh-runtime-plugin.js +267 -0
  9. package/dist/cjs/module-federation/renderer-contract.js +159 -0
  10. package/dist/cjs/module-federation/renderer-runtime-plugin.js +268 -0
  11. package/dist/cjs/module-federation/telemetry.js +214 -0
  12. package/dist/esm/module-federation/consume-surface.mjs +3 -13
  13. package/dist/esm/module-federation/distributed-ssr.mjs +6 -1
  14. package/dist/esm/module-federation/index.mjs +1 -111
  15. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +1 -1
  16. package/dist/esm/module-federation/native-browser-dev-client.mjs +276 -0
  17. package/dist/esm/module-federation/native-browser-dev-refresh.mjs +182 -0
  18. package/dist/esm/module-federation/native-browser-dev-runtime-plugin.mjs +183 -0
  19. package/dist/esm/module-federation/native-dev-refresh-runtime-plugin.mjs +229 -0
  20. package/dist/esm/module-federation/renderer-contract.mjs +103 -0
  21. package/dist/esm/module-federation/renderer-runtime-plugin.mjs +225 -0
  22. package/dist/esm/module-federation/telemetry.mjs +142 -0
  23. package/dist/esm-node/module-federation/consume-surface.mjs +3 -13
  24. package/dist/esm-node/module-federation/distributed-ssr.mjs +6 -1
  25. package/dist/esm-node/module-federation/index.mjs +1 -111
  26. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +1 -1
  27. package/dist/esm-node/module-federation/native-browser-dev-client.mjs +277 -0
  28. package/dist/esm-node/module-federation/native-browser-dev-refresh.mjs +183 -0
  29. package/dist/esm-node/module-federation/native-browser-dev-runtime-plugin.mjs +184 -0
  30. package/dist/esm-node/module-federation/native-dev-refresh-runtime-plugin.mjs +230 -0
  31. package/dist/esm-node/module-federation/renderer-contract.mjs +104 -0
  32. package/dist/esm-node/module-federation/renderer-runtime-plugin.mjs +226 -0
  33. package/dist/esm-node/module-federation/telemetry.mjs +143 -0
  34. package/dist/types/module-federation/consume-surface.d.ts +5 -5
  35. package/dist/types/module-federation/distributed-ssr.d.ts +18 -1
  36. package/dist/types/module-federation/index.d.ts +1 -67
  37. package/dist/types/module-federation/native-browser-dev-client.d.ts +41 -0
  38. package/dist/types/module-federation/native-browser-dev-refresh.d.ts +86 -0
  39. package/dist/types/module-federation/native-browser-dev-runtime-plugin.d.ts +40 -0
  40. package/dist/types/module-federation/native-dev-refresh-runtime-plugin.d.ts +90 -0
  41. package/dist/types/module-federation/renderer-contract.d.ts +20 -0
  42. package/dist/types/module-federation/renderer-runtime-plugin.d.ts +98 -0
  43. package/dist/types/module-federation/telemetry.d.ts +71 -0
  44. package/package.json +102 -19
  45. package/src/module-federation/consume-surface.ts +18 -33
  46. package/src/module-federation/distributed-ssr.tsx +27 -2
  47. package/src/module-federation/index.ts +1 -267
  48. package/src/module-federation/manifest-recovery-runtime-plugin.ts +5 -1
  49. package/src/module-federation/native-browser-dev-client.ts +424 -0
  50. package/src/module-federation/native-browser-dev-refresh.ts +373 -0
  51. package/src/module-federation/native-browser-dev-runtime-plugin.ts +276 -0
  52. package/src/module-federation/native-dev-refresh-runtime-plugin.ts +445 -0
  53. package/src/module-federation/renderer-contract.ts +176 -0
  54. package/src/module-federation/renderer-runtime-plugin.ts +401 -0
  55. package/src/module-federation/telemetry.ts +297 -0
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ NATIVE_BROWSER_DEV_BOUNDARY: ()=>NATIVE_BROWSER_DEV_BOUNDARY,
32
+ createNativeBrowserDevRuntimePlugin: ()=>createNativeBrowserDevRuntimePlugin,
33
+ hasNativeBrowserDevPublisher: ()=>hasNativeBrowserDevPublisher,
34
+ readNativeBrowserDevPublication: ()=>readNativeBrowserDevPublication,
35
+ replaceNativeBrowserDevRemote: ()=>replaceNativeBrowserDevRemote
36
+ });
37
+ const external_native_browser_dev_refresh_js_namespaceObject = require("./native-browser-dev-refresh.js");
38
+ const external_renderer_contract_js_namespaceObject = require("./renderer-contract.js");
39
+ const NATIVE_BROWSER_DEV_BOUNDARY = Symbol.for('ultramodern.federation.browser-dev-boundary.v1');
40
+ const REGISTRY = Symbol.for('ultramodern.federation.browser-dev-routing.v1');
41
+ function registry() {
42
+ const root = globalThis;
43
+ if (!root[REGISTRY]) Object.defineProperty(root, REGISTRY, {
44
+ value: {
45
+ sources: new WeakMap(),
46
+ bindings: new Set()
47
+ }
48
+ });
49
+ return root[REGISTRY];
50
+ }
51
+ function firstReference(binding) {
52
+ const reference = binding.references.values().next().value;
53
+ if (!reference) throw new Error('Native browser refresh has no mounted boundary owner.');
54
+ return reference;
55
+ }
56
+ function createNativeBrowserDevRuntimePlugin(options) {
57
+ return {
58
+ name: 'ultramodern-native-browser-dev-refresh',
59
+ beforeInit (args) {
60
+ const host = args.origin;
61
+ if (Object.hasOwn(host, NATIVE_BROWSER_DEV_BOUNDARY)) return args;
62
+ Object.defineProperty(host, NATIVE_BROWSER_DEV_BOUNDARY, {
63
+ value (id, source, boundary) {
64
+ const remote = options.remotes.find((remote)=>id.startsWith(`${remote.alias}/`));
65
+ if (!remote) throw new Error(`Native browser refresh has no registered remote for ${id}.`);
66
+ const state = registry();
67
+ let sources = state.sources.get(source);
68
+ if (!sources) state.sources.set(source, sources = new Map());
69
+ let binding = sources.get(id);
70
+ if (binding && binding.remoteName !== remote.name) throw new Error('Native browser refresh source has conflicting remote ownership.');
71
+ if (!binding) {
72
+ const references = new Set();
73
+ const current = ()=>firstReference(created);
74
+ const created = {
75
+ id,
76
+ remoteName: remote.name,
77
+ references,
78
+ coordinator: (0, external_native_browser_dev_refresh_js_namespaceObject.createNativeBrowserDevRefresh)({
79
+ get host () {
80
+ return current().host;
81
+ },
82
+ id,
83
+ boundary: references,
84
+ prepareReplacement () {
85
+ const reference = current();
86
+ return reference.prepare(reference.boundary);
87
+ },
88
+ createHost: options.createHost
89
+ })
90
+ };
91
+ binding = created;
92
+ sources.set(id, binding);
93
+ state.bindings.add(binding);
94
+ }
95
+ const reference = {
96
+ host,
97
+ remote,
98
+ boundary,
99
+ prepare: options.prepareReplacement
100
+ };
101
+ binding.references.add(reference);
102
+ const owned = binding;
103
+ let released = false;
104
+ return ()=>{
105
+ if (released) return;
106
+ released = true;
107
+ owned.references.delete(reference);
108
+ if (owned.references.size) return;
109
+ sources.delete(id);
110
+ state.bindings.delete(owned);
111
+ owned.coordinator.dispose();
112
+ };
113
+ }
114
+ });
115
+ return args;
116
+ }
117
+ };
118
+ }
119
+ async function replaceNativeBrowserDevRemote(graph) {
120
+ const bindings = [
121
+ ...registry().bindings
122
+ ].filter((binding)=>binding.remoteName === graph.remote.name);
123
+ if (!bindings.length) throw new Error('Native browser refresh has no mounted publisher for this remote.');
124
+ let committed = 0;
125
+ try {
126
+ for (const binding of bindings){
127
+ await binding.coordinator.replace(graph);
128
+ committed++;
129
+ }
130
+ } catch (error) {
131
+ if (committed && !(0, external_native_browser_dev_refresh_js_namespaceObject.isNativeBrowserDevCommitError)(error, graph.revision)) throw (0, external_native_browser_dev_refresh_js_namespaceObject.nativeBrowserDevCommitFailure)(graph.revision, error);
132
+ throw error;
133
+ }
134
+ return bindings.length;
135
+ }
136
+ const record = (value)=>null !== value && 'object' == typeof value && !Array.isArray(value);
137
+ async function readNativeBrowserDevPublication(remoteName, options) {
138
+ const binding = [
139
+ ...registry().bindings
140
+ ].find((binding)=>binding.remoteName === remoteName);
141
+ if (!binding) throw new Error('Native browser refresh has no mounted publisher for discovery.');
142
+ const reference = firstReference(binding);
143
+ const remote = reference.remote;
144
+ const host = reference.host;
145
+ const init = {
146
+ cache: 'no-store',
147
+ signal: options.signal
148
+ };
149
+ const context = {
150
+ initiator: 'loadRemote',
151
+ id: binding.id,
152
+ resourceType: 'manifest',
153
+ url: remote.entry
154
+ };
155
+ const hook = host.loaderHook?.lifecycle.fetch;
156
+ const request = (async ()=>{
157
+ const hooked = await hook?.emit(remote.entry, init, remote, context);
158
+ const response = hooked instanceof Response ? hooked : await globalThis.fetch(remote.entry, init);
159
+ if (options.signal.aborted) {
160
+ response.body?.cancel().catch(()=>{});
161
+ throw options.signal.reason;
162
+ }
163
+ if (!response.ok) {
164
+ response.body?.cancel().catch(()=>{});
165
+ throw new Error(`Native browser manifest discovery failed: ${response.status}`);
166
+ }
167
+ const manifest = await response.json();
168
+ const revision = response.headers.get(options.revisionHeader);
169
+ const links = [
170
+ ...(response.headers.get('link') ?? '').matchAll(/<([^>]+)>\s*;([^,]*)/gu)
171
+ ].filter(([, , parameters])=>/\brel\s*=\s*"?ultramodern-completed-graph"?(?:\s|;|$)/u.test(parameters));
172
+ if (!revision || !/^[a-f0-9]{64}$/u.test(revision) || 1 !== links.length) throw new Error('Native browser manifest has no unique completed graph coordinate.');
173
+ const entry = new URL(links[0][1], remote.entry);
174
+ if (![
175
+ 'http:',
176
+ 'https:'
177
+ ].includes(entry.protocol) || entry.username || entry.password || entry.hash) throw new Error('Native browser completed graph URL is invalid.');
178
+ const namespace = /\/__ultramodern_mf__\/([a-f0-9]+)\//u.exec(entry.pathname);
179
+ if (!namespace) throw new Error('Native browser graph is not in the immutable runtime namespace.');
180
+ const metadata = record(manifest) && record(manifest.metaData) ? manifest.metaData.ultramodernRenderer : void 0;
181
+ const contract = (0, external_renderer_contract_js_namespaceObject.readRendererFederationContract)(metadata);
182
+ const buildIds = new Set(Object.values(contract.identities).map((identity)=>identity.buildId));
183
+ if (1 !== buildIds.size) throw new Error('Native browser graph has conflicting renderer build identities.');
184
+ return {
185
+ revision,
186
+ runtimeHash: namespace[1],
187
+ buildId: [
188
+ ...buildIds
189
+ ][0],
190
+ remote: {
191
+ ...remote,
192
+ entry: entry.href
193
+ }
194
+ };
195
+ })();
196
+ let removeAbort;
197
+ const aborted = new Promise((_resolve, reject)=>{
198
+ const abort = ()=>reject(options.signal.reason);
199
+ removeAbort = ()=>options.signal.removeEventListener('abort', abort);
200
+ if (options.signal.aborted) abort();
201
+ else options.signal.addEventListener('abort', abort, {
202
+ once: true
203
+ });
204
+ });
205
+ try {
206
+ return await Promise.race([
207
+ request,
208
+ aborted
209
+ ]);
210
+ } finally{
211
+ removeAbort();
212
+ }
213
+ }
214
+ function hasNativeBrowserDevPublisher(remoteName) {
215
+ return [
216
+ ...registry().bindings
217
+ ].some((binding)=>binding.remoteName === remoteName);
218
+ }
219
+ exports.NATIVE_BROWSER_DEV_BOUNDARY = __webpack_exports__.NATIVE_BROWSER_DEV_BOUNDARY;
220
+ exports.createNativeBrowserDevRuntimePlugin = __webpack_exports__.createNativeBrowserDevRuntimePlugin;
221
+ exports.hasNativeBrowserDevPublisher = __webpack_exports__.hasNativeBrowserDevPublisher;
222
+ exports.readNativeBrowserDevPublication = __webpack_exports__.readNativeBrowserDevPublication;
223
+ exports.replaceNativeBrowserDevRemote = __webpack_exports__.replaceNativeBrowserDevRemote;
224
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
225
+ "NATIVE_BROWSER_DEV_BOUNDARY",
226
+ "createNativeBrowserDevRuntimePlugin",
227
+ "hasNativeBrowserDevPublisher",
228
+ "readNativeBrowserDevPublication",
229
+ "replaceNativeBrowserDevRemote"
230
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
231
+ Object.defineProperty(exports, '__esModule', {
232
+ value: true
233
+ });
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ default: ()=>nativeDevRefreshRuntimePlugin
32
+ });
33
+ const external_node_async_hooks_namespaceObject = require("node:async_hooks");
34
+ const LOAD_WITH_CAPTURE = Symbol.for('ultramodern.federation.load-with-capture');
35
+ function nativeDevRefreshRuntimePlugin(options) {
36
+ if (!options.revisionHeader || !Number.isSafeInteger(options.requestTimeout) || options.requestTimeout <= 0) throw new TypeError('Native federation dev refresh requires a bounded revision probe.');
37
+ const hosts = new WeakMap();
38
+ const calls = new external_node_async_hooks_namespaceObject.AsyncLocalStorage();
39
+ const probe = (host, lane, expose)=>{
40
+ if (lane.probe) return lane.probe;
41
+ const info = lane.info;
42
+ if (!info) throw new Error('Native federation dev remote has no admitted entry.');
43
+ const pending = (async ()=>{
44
+ const init = {
45
+ method: 'HEAD',
46
+ cache: 'no-store',
47
+ signal: AbortSignal.timeout(options.requestTimeout)
48
+ };
49
+ let clearDeadline;
50
+ const signal = init.signal;
51
+ const deadline = new Promise((_resolve, reject)=>{
52
+ const abort = ()=>reject(signal.reason);
53
+ signal.addEventListener('abort', abort, {
54
+ once: true
55
+ });
56
+ clearDeadline = ()=>signal.removeEventListener('abort', abort);
57
+ });
58
+ const request = (async ()=>{
59
+ const hooked = await host.loaderHook.lifecycle.fetch.emit(info.entry, init, info, {
60
+ initiator: 'loadRemote',
61
+ id: expose && '.' !== expose ? `${info.name}/${expose.replace(/^\.\//u, '')}` : info.name,
62
+ resourceType: 'remoteEntry',
63
+ url: info.entry,
64
+ expose
65
+ });
66
+ const response = hooked instanceof Response ? hooked : await globalThis.fetch(info.entry, init);
67
+ if (signal.aborted) {
68
+ response.body?.cancel().catch(()=>{});
69
+ throw signal.reason;
70
+ }
71
+ return response;
72
+ })();
73
+ let response;
74
+ try {
75
+ response = await Promise.race([
76
+ request,
77
+ deadline
78
+ ]);
79
+ } finally{
80
+ clearDeadline();
81
+ }
82
+ response.body?.cancel().catch(()=>{});
83
+ if (!response.ok) throw Object.assign(new Error(`Native federation dev revision request failed: ${response.status} ${info.entry}`), {
84
+ status: response.status
85
+ });
86
+ const revision = response.headers.get(options.revisionHeader);
87
+ if (null !== revision && !/^[a-f0-9]{64}$/u.test(revision)) throw new Error('Native federation dev remote returned an invalid graph revision.');
88
+ if (null === revision && 'string' == typeof lane.revision) throw new Error('Native federation dev remote lost its completed graph revision.');
89
+ return revision;
90
+ })();
91
+ lane.probe = pending;
92
+ const clear = ()=>{
93
+ if (lane.probe === pending) lane.probe = void 0;
94
+ };
95
+ pending.then(clear, clear);
96
+ return pending;
97
+ };
98
+ return {
99
+ name: 'ultramodern-native-federation-dev-refresh',
100
+ beforeInit (args) {
101
+ const host = args.origin;
102
+ if (hosts.has(host)) return args;
103
+ const lanes = new Map(options.remotes.map((remote)=>[
104
+ remote.name,
105
+ {
106
+ remote: {
107
+ ...remote
108
+ },
109
+ active: new Set()
110
+ }
111
+ ]));
112
+ hosts.set(host, lanes);
113
+ const load = host.loadRemote.bind(host);
114
+ const loadWithCapture = async (id, loadOptions, capture)=>{
115
+ const parent = calls.getStore();
116
+ const lease = {
117
+ host,
118
+ ...parent?.host === host ? {
119
+ parent
120
+ } : {}
121
+ };
122
+ return calls.run(lease, async ()=>{
123
+ let success = false;
124
+ try {
125
+ const module = await load(id, loadOptions);
126
+ const captured = capture?.(module, lease.resolution);
127
+ success = null !== module && true === lease.admitted;
128
+ return {
129
+ module,
130
+ captured
131
+ };
132
+ } finally{
133
+ lease.active = false;
134
+ lease.release?.(success);
135
+ }
136
+ });
137
+ };
138
+ host.loadRemote = async (id, loadOptions)=>(await loadWithCapture(id, loadOptions)).module;
139
+ host[LOAD_WITH_CAPTURE] = (id, capture)=>loadWithCapture(id, void 0, capture);
140
+ return args;
141
+ },
142
+ async beforeRequest (args) {
143
+ const lease = calls.getStore();
144
+ if (!lease || lease.host !== args.origin) return args;
145
+ const lane = [
146
+ ...hosts.get(args.origin)?.values() ?? []
147
+ ].find(({ remote })=>[
148
+ remote.alias,
149
+ remote.name
150
+ ].some((name)=>args.id === name || args.id.startsWith(`${name}/`)));
151
+ if (!lane || lease.lane) return args;
152
+ lease.lane = lane;
153
+ const prefix = [
154
+ lane.remote.alias,
155
+ lane.remote.name
156
+ ].find((name)=>args.id === name || args.id.startsWith(`${name}/`));
157
+ const expose = args.id === prefix ? '.' : `./${args.id.slice(prefix.length + 1)}`;
158
+ for(let ancestor = lease.parent; ancestor; ancestor = ancestor.parent)if (ancestor.lane === lane && ancestor.active) {
159
+ let release;
160
+ const finished = new Promise((resolve)=>{
161
+ release = resolve;
162
+ });
163
+ lane.active.add(finished);
164
+ lease.active = true;
165
+ lease.snapshot = ancestor.snapshot;
166
+ lease.release = ()=>{
167
+ lane.active.delete(finished);
168
+ release();
169
+ };
170
+ return args;
171
+ }
172
+ for(;;){
173
+ if (lane.transition) {
174
+ await lane.transition;
175
+ continue;
176
+ }
177
+ const revision = void 0 === lane.revision ? void 0 : null === lane.revision ? null : await probe(args.origin, lane, expose);
178
+ if (lane.transition) {
179
+ await lane.transition;
180
+ continue;
181
+ }
182
+ let finish;
183
+ const finished = new Promise((resolve)=>{
184
+ finish = resolve;
185
+ });
186
+ if (void 0 === lane.revision || revision !== lane.revision) {
187
+ lane.transition = finished;
188
+ lease.release = (success)=>{
189
+ if (success) lane.revision = lane.candidate ?? null;
190
+ if (lane.transition === finished) lane.transition = void 0;
191
+ finish();
192
+ };
193
+ while(lane.active.size)await Promise.allSettled([
194
+ ...lane.active
195
+ ]);
196
+ lane.candidate = revision;
197
+ if (void 0 !== lane.revision) {
198
+ lease.active = true;
199
+ lease.snapshot = lane.snapshot;
200
+ const retained = new Set();
201
+ for (const scope of Object.values(args.origin.shareScopeMap ?? {}))for (const [pkgName, versions] of Object.entries(scope))if (options.shared?.some((key)=>key === pkgName || key.endsWith('/') && pkgName.startsWith(key)) && Object.values(versions).some((shared)=>shared.loaded || shared.loading || shared.lib)) retained.add(pkgName);
202
+ for (const pkgName of retained){
203
+ if (!args.origin.loadShare) throw new TypeError('Native federation dev refresh requires the host share lifecycle.');
204
+ await args.origin.loadShare(pkgName);
205
+ }
206
+ while(lane.active.size)await Promise.allSettled([
207
+ ...lane.active
208
+ ]);
209
+ args.origin.registerRemotes([
210
+ {
211
+ ...lane.remote
212
+ }
213
+ ], {
214
+ force: true
215
+ });
216
+ lease.snapshot = void 0;
217
+ }
218
+ } else {
219
+ lane.active.add(finished);
220
+ lease.release = ()=>{
221
+ lane.active.delete(finished);
222
+ finish();
223
+ };
224
+ }
225
+ lease.active = true;
226
+ return args;
227
+ }
228
+ },
229
+ loadSnapshot (args) {
230
+ const lease = calls.getStore();
231
+ if (!lease || args.options !== lease.host.options || args.moduleInfo.name !== lease.lane?.remote.name) return args;
232
+ if (void 0 !== lease.snapshot) return {
233
+ ...args,
234
+ remoteSnapshot: lease.snapshot
235
+ };
236
+ lease.snapshot = args.remoteSnapshot;
237
+ return args;
238
+ },
239
+ afterLoadSnapshot (args) {
240
+ const lease = calls.getStore();
241
+ if (lease?.host === args.host && args.moduleInfo.name === lease.lane?.remote.name) lease.snapshot = args.remoteSnapshot;
242
+ return args;
243
+ },
244
+ async afterResolve (args) {
245
+ const lane = hosts.get(args.origin)?.get(args.remote.name);
246
+ const lease = calls.getStore();
247
+ if (!lane || lease?.host !== args.origin || lease.lane !== lane || !lease.active) return args;
248
+ if (lane.info?.entry !== args.remoteInfo.entry) lane.candidate = void 0;
249
+ lane.info = args.remoteInfo;
250
+ if (void 0 === lane.candidate) lane.candidate = await probe(args.origin, lane, args.expose);
251
+ lease.admitted = true;
252
+ lane.snapshot = args.remoteSnapshot;
253
+ lease.resolution = {
254
+ remoteSnapshot: args.remoteSnapshot,
255
+ expose: args.expose
256
+ };
257
+ return args;
258
+ }
259
+ };
260
+ }
261
+ exports["default"] = __webpack_exports__["default"];
262
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
263
+ "default"
264
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
265
+ Object.defineProperty(exports, '__esModule', {
266
+ value: true
267
+ });
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ RENDERER_FEDERATION_METADATA_KEY: ()=>RENDERER_FEDERATION_METADATA_KEY,
32
+ RENDERER_FEDERATION_SCHEMA: ()=>RENDERER_FEDERATION_SCHEMA,
33
+ RENDERER_FEDERATION_SCHEMA_VERSION: ()=>RENDERER_FEDERATION_SCHEMA_VERSION,
34
+ assertRendererFederationCompatibility: ()=>assertRendererFederationCompatibility,
35
+ readRendererFederationCompatibility: ()=>readRendererFederationCompatibility,
36
+ readRendererFederationContract: ()=>readRendererFederationContract,
37
+ rendererFederationError: ()=>rendererFederationError
38
+ });
39
+ const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
40
+ const RENDERER_FEDERATION_METADATA_KEY = 'ultramodernRenderer';
41
+ const RENDERER_FEDERATION_SCHEMA = 'ultramodern.renderer-federation';
42
+ const RENDERER_FEDERATION_SCHEMA_VERSION = 1;
43
+ const rendererFederationError = (message)=>new Error(`Renderer federation manifest contract: ${message}`);
44
+ const record = (value)=>null !== value && 'object' == typeof value && !Array.isArray(value);
45
+ const exactFields = (value, fields, label)=>{
46
+ const unknown = Object.keys(value).filter((key)=>!fields.includes(key));
47
+ const missing = fields.filter((key)=>!Object.hasOwn(value, key));
48
+ if (unknown.length || missing.length) throw rendererFederationError(`${label} fields differ (unknown=${unknown.join(',')}; missing=${missing.join(',')}).`);
49
+ };
50
+ const assertProfile = (value)=>{
51
+ const result = (0, backend_federation_contracts_namespaceObject.validateRendererProfile)(value, 'rendererProfile');
52
+ if (!result.ok) throw rendererFederationError((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
53
+ const profile = value;
54
+ return Object.freeze({
55
+ ...profile,
56
+ compiler: Object.freeze({
57
+ ...profile.compiler
58
+ }),
59
+ hydration: Object.freeze({
60
+ ...profile.hydration
61
+ }),
62
+ router: Object.freeze({
63
+ ...profile.router
64
+ })
65
+ });
66
+ };
67
+ const assertPackage = (value, profile, label)=>{
68
+ const result = (0, backend_federation_contracts_namespaceObject.validateRendererProfile)({
69
+ ...profile,
70
+ compiler: value
71
+ }, label);
72
+ if (!result.ok) throw rendererFederationError((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
73
+ return Object.freeze({
74
+ ...value
75
+ });
76
+ };
77
+ function readRendererFederationCompatibility(value) {
78
+ if (!record(value)) throw rendererFederationError('the consuming renderer tuple is absent.');
79
+ exactFields(value, [
80
+ 'profile',
81
+ 'runtime',
82
+ 'bootstrap'
83
+ ], 'compatibility');
84
+ const profile = assertProfile(value.profile);
85
+ return Object.freeze({
86
+ profile,
87
+ runtime: assertPackage(value.runtime, profile, 'runtime'),
88
+ bootstrap: assertPackage(value.bootstrap, profile, 'bootstrap')
89
+ });
90
+ }
91
+ function readRendererFederationContract(value) {
92
+ if (!record(value)) throw rendererFederationError('renderer publication metadata is absent.');
93
+ exactFields(value, [
94
+ 'schema',
95
+ 'schemaVersion',
96
+ 'profile',
97
+ 'runtime',
98
+ 'bootstrap',
99
+ 'identities'
100
+ ], 'publication');
101
+ if (value.schema !== RENDERER_FEDERATION_SCHEMA || value.schemaVersion !== RENDERER_FEDERATION_SCHEMA_VERSION) throw rendererFederationError('unsupported renderer publication schema.');
102
+ const compatibility = readRendererFederationCompatibility({
103
+ profile: value.profile,
104
+ runtime: value.runtime,
105
+ bootstrap: value.bootstrap
106
+ });
107
+ if (!record(value.identities) || !Object.keys(value.identities).length) throw rendererFederationError('finalized application entry identities are absent.');
108
+ const identities = Object.create(null);
109
+ let appId;
110
+ for (const [entryName, valueIdentity] of Object.entries(value.identities)){
111
+ const result = (0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(valueIdentity, `identities.${entryName}`);
112
+ if (!result.ok) throw rendererFederationError((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
113
+ const identity = valueIdentity;
114
+ if (identity.entryName !== entryName || identity.renderer !== compatibility.profile.renderer || identity.protocolVersion !== compatibility.profile.protocolVersion || void 0 !== appId && identity.appId !== appId) throw rendererFederationError(`incoherent publication identity for ${entryName}.`);
115
+ appId = identity.appId;
116
+ identities[entryName] = Object.freeze({
117
+ ...identity
118
+ });
119
+ }
120
+ return Object.freeze({
121
+ schema: RENDERER_FEDERATION_SCHEMA,
122
+ schemaVersion: RENDERER_FEDERATION_SCHEMA_VERSION,
123
+ ...compatibility,
124
+ identities: Object.freeze(identities)
125
+ });
126
+ }
127
+ function assertRendererFederationCompatibility(expected, actual) {
128
+ try {
129
+ (0, backend_federation_contracts_namespaceObject.assertRendererProfileCompatibility)(expected.profile, actual.profile);
130
+ } catch (error) {
131
+ throw rendererFederationError(error instanceof Error ? error.message : String(error));
132
+ }
133
+ for (const field of [
134
+ 'runtime',
135
+ 'bootstrap'
136
+ ])for (const key of [
137
+ 'name',
138
+ 'version'
139
+ ])if (expected[field][key] !== actual[field][key]) throw rendererFederationError(`${field}.${key} must match the consuming renderer tuple.`);
140
+ }
141
+ exports.RENDERER_FEDERATION_METADATA_KEY = __webpack_exports__.RENDERER_FEDERATION_METADATA_KEY;
142
+ exports.RENDERER_FEDERATION_SCHEMA = __webpack_exports__.RENDERER_FEDERATION_SCHEMA;
143
+ exports.RENDERER_FEDERATION_SCHEMA_VERSION = __webpack_exports__.RENDERER_FEDERATION_SCHEMA_VERSION;
144
+ exports.assertRendererFederationCompatibility = __webpack_exports__.assertRendererFederationCompatibility;
145
+ exports.readRendererFederationCompatibility = __webpack_exports__.readRendererFederationCompatibility;
146
+ exports.readRendererFederationContract = __webpack_exports__.readRendererFederationContract;
147
+ exports.rendererFederationError = __webpack_exports__.rendererFederationError;
148
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
149
+ "RENDERER_FEDERATION_METADATA_KEY",
150
+ "RENDERER_FEDERATION_SCHEMA",
151
+ "RENDERER_FEDERATION_SCHEMA_VERSION",
152
+ "assertRendererFederationCompatibility",
153
+ "readRendererFederationCompatibility",
154
+ "readRendererFederationContract",
155
+ "rendererFederationError"
156
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
157
+ Object.defineProperty(exports, '__esModule', {
158
+ value: true
159
+ });