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

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 (35) 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/renderer-contract.js +159 -0
  6. package/dist/cjs/module-federation/renderer-runtime-plugin.js +265 -0
  7. package/dist/cjs/module-federation/telemetry.js +214 -0
  8. package/dist/esm/module-federation/consume-surface.mjs +3 -13
  9. package/dist/esm/module-federation/distributed-ssr.mjs +6 -1
  10. package/dist/esm/module-federation/index.mjs +1 -111
  11. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +1 -1
  12. package/dist/esm/module-federation/renderer-contract.mjs +103 -0
  13. package/dist/esm/module-federation/renderer-runtime-plugin.mjs +222 -0
  14. package/dist/esm/module-federation/telemetry.mjs +142 -0
  15. package/dist/esm-node/module-federation/consume-surface.mjs +3 -13
  16. package/dist/esm-node/module-federation/distributed-ssr.mjs +6 -1
  17. package/dist/esm-node/module-federation/index.mjs +1 -111
  18. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +1 -1
  19. package/dist/esm-node/module-federation/renderer-contract.mjs +104 -0
  20. package/dist/esm-node/module-federation/renderer-runtime-plugin.mjs +223 -0
  21. package/dist/esm-node/module-federation/telemetry.mjs +143 -0
  22. package/dist/types/module-federation/consume-surface.d.ts +5 -5
  23. package/dist/types/module-federation/distributed-ssr.d.ts +18 -1
  24. package/dist/types/module-federation/index.d.ts +1 -67
  25. package/dist/types/module-federation/renderer-contract.d.ts +20 -0
  26. package/dist/types/module-federation/renderer-runtime-plugin.d.ts +98 -0
  27. package/dist/types/module-federation/telemetry.d.ts +71 -0
  28. package/package.json +54 -18
  29. package/src/module-federation/consume-surface.ts +18 -33
  30. package/src/module-federation/distributed-ssr.tsx +27 -2
  31. package/src/module-federation/index.ts +1 -267
  32. package/src/module-federation/manifest-recovery-runtime-plugin.ts +5 -1
  33. package/src/module-federation/renderer-contract.ts +176 -0
  34. package/src/module-federation/renderer-runtime-plugin.ts +396 -0
  35. package/src/module-federation/telemetry.ts +297 -0
@@ -0,0 +1,265 @@
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
+ createRendererFederationRuntimePlugin: ()=>createRendererFederationRuntimePlugin,
32
+ default: ()=>renderer_runtime_plugin,
33
+ rendererShareVersions: ()=>rendererShareVersions
34
+ });
35
+ const sdk_namespaceObject = require("@module-federation/sdk");
36
+ const external_renderer_contract_js_namespaceObject = require("./renderer-contract.js");
37
+ const ATTESTATION = Symbol.for('ultramodern.renderer-federation.attestation.v1');
38
+ const record = (value)=>null !== value && 'object' == typeof value && !Array.isArray(value);
39
+ const coordinates = (snapshot)=>JSON.stringify([
40
+ 'globalName',
41
+ 'buildVersion',
42
+ 'remoteEntry',
43
+ 'remoteEntryType',
44
+ 'ssrRemoteEntry',
45
+ 'ssrRemoteEntryType',
46
+ 'publicPath',
47
+ 'ssrPublicPath',
48
+ 'getPublicPath'
49
+ ].map((key)=>[
50
+ key,
51
+ snapshot[key]
52
+ ]));
53
+ function attestation(snapshot) {
54
+ const descriptor = Object.getOwnPropertyDescriptor(snapshot, ATTESTATION);
55
+ const value = descriptor?.value;
56
+ if (!descriptor || descriptor.writable || descriptor.configurable || !record(value) || 'string' != typeof value.coordinates || value.coordinates !== coordinates(snapshot)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('cached remote snapshot is missing or has changed its attestation.');
57
+ return {
58
+ contract: (0, external_renderer_contract_js_namespaceObject.readRendererFederationContract)(value.contract),
59
+ coordinates: value.coordinates
60
+ };
61
+ }
62
+ const assertManifestRemote = (remote)=>{
63
+ if (!record(remote)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('remote registration is absent.');
64
+ if ('entry' in remote && ('string' != typeof remote.entry || !remote.entry.includes('.json'))) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('renderer components require a native JSON manifest remote.');
65
+ };
66
+ function sameFactory(left, right) {
67
+ if (left === right) return true;
68
+ if ('function' == typeof left.lib && 'function' == typeof right.lib) return left.lib === right.lib;
69
+ return 'function' == typeof left.get && left.get === right.get;
70
+ }
71
+ const containerCoordinates = (info)=>JSON.stringify([
72
+ 'name',
73
+ 'entry',
74
+ 'type',
75
+ 'entryGlobalName',
76
+ 'buildVersion'
77
+ ].map((key)=>[
78
+ key,
79
+ info[key]
80
+ ]));
81
+ const entryCoordinates = (info)=>JSON.stringify([
82
+ 'name',
83
+ 'entry',
84
+ 'type',
85
+ 'entryGlobalName'
86
+ ].map((key)=>[
87
+ key,
88
+ info[key]
89
+ ]));
90
+ function rendererShareVersions(expected) {
91
+ const { profile, runtime, bootstrap } = expected;
92
+ if ('react' === profile.renderer) return new Map([
93
+ [
94
+ 'react',
95
+ runtime.version
96
+ ],
97
+ [
98
+ 'react-dom',
99
+ profile.hydration.version
100
+ ],
101
+ [
102
+ 'react-dom/client',
103
+ profile.hydration.version
104
+ ],
105
+ [
106
+ '@modern-js/runtime',
107
+ bootstrap.version
108
+ ]
109
+ ]);
110
+ const versions = new Map();
111
+ for (const [name, version] of [
112
+ [
113
+ runtime.name,
114
+ runtime.version
115
+ ],
116
+ [
117
+ profile.hydration.name,
118
+ profile.hydration.version
119
+ ],
120
+ [
121
+ bootstrap.name,
122
+ bootstrap.version
123
+ ],
124
+ [
125
+ profile.router.name,
126
+ profile.router.version
127
+ ],
128
+ [
129
+ profile.router.coreName,
130
+ profile.router.coreVersion
131
+ ]
132
+ ]){
133
+ const prior = versions.get(name);
134
+ if (void 0 !== prior && prior !== version) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)(`renderer tuple names ${name} with conflicting versions.`);
135
+ versions.set(name, version);
136
+ }
137
+ return versions;
138
+ }
139
+ function createRendererFederationRuntimePlugin(options) {
140
+ const expected = (0, external_renderer_contract_js_namespaceObject.readRendererFederationCompatibility)(options);
141
+ const selected = new Map();
142
+ const approvedRemoteInfos = new WeakMap();
143
+ const observedEntries = new WeakMap();
144
+ const acceptedEntries = new Set();
145
+ const versions = rendererShareVersions(expected);
146
+ return {
147
+ name: 'ultramodern-renderer-federation-contract',
148
+ beforeRegisterRemote (args) {
149
+ assertManifestRemote(args.remote);
150
+ return args;
151
+ },
152
+ async afterMatchRemote (args) {
153
+ if (!args.error) assertManifestRemote(args.remote);
154
+ return args;
155
+ },
156
+ async loadRemoteSnapshot (args) {
157
+ const snapshot = args.remoteSnapshot;
158
+ if ('manifest' === args.from) {
159
+ const manifest = args.manifestJson;
160
+ const metadata = record(manifest) && record(manifest.metaData) ? manifest.metaData[external_renderer_contract_js_namespaceObject.RENDERER_FEDERATION_METADATA_KEY] : void 0;
161
+ const contract = (0, external_renderer_contract_js_namespaceObject.readRendererFederationContract)(metadata);
162
+ if (!record(snapshot) || 'string' != typeof snapshot.remoteEntry) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('native remote entry coordinates are absent.');
163
+ const existing = Object.getOwnPropertyDescriptor(snapshot, ATTESTATION);
164
+ if (existing) {
165
+ const prior = attestation(snapshot);
166
+ if (JSON.stringify(prior.contract) !== JSON.stringify(contract)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('remote snapshot has conflicting publication ownership.');
167
+ } else Object.defineProperty(snapshot, ATTESTATION, {
168
+ value: Object.freeze({
169
+ contract,
170
+ coordinates: coordinates(snapshot)
171
+ })
172
+ });
173
+ } else (0, external_renderer_contract_js_namespaceObject.assertRendererFederationCompatibility)(expected, attestation(snapshot).contract);
174
+ return args;
175
+ },
176
+ async afterLoadSnapshot (args) {
177
+ (0, external_renderer_contract_js_namespaceObject.assertRendererFederationCompatibility)(expected, attestation(args.remoteSnapshot).contract);
178
+ const snapshot = args.remoteSnapshot;
179
+ const browser = sdk_namespaceObject.isBrowserEnvValue || (0, sdk_namespaceObject.isReactNativeEnv)() || !('ssrRemoteEntry' in snapshot);
180
+ const entry = browser ? snapshot.remoteEntry : snapshot.ssrRemoteEntry;
181
+ if ('string' != typeof entry || !entry) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('native projected remote entry is absent.');
182
+ let entryUrl = (0, sdk_namespaceObject.getResourceUrl)(snapshot, entry);
183
+ if (!sdk_namespaceObject.isBrowserEnvValue && !entryUrl.startsWith('http')) entryUrl = `https:${entryUrl}`;
184
+ acceptedEntries.add(entryCoordinates({
185
+ name: args.moduleInfo?.name ?? snapshot.globalName,
186
+ entry: entryUrl,
187
+ type: browser ? snapshot.remoteEntryType : snapshot.ssrRemoteEntryType || 'global',
188
+ entryGlobalName: snapshot.globalName
189
+ }));
190
+ return args;
191
+ },
192
+ async afterResolve (args) {
193
+ if (!args.remoteSnapshot) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('native remote resolution has no attested snapshot.');
194
+ (0, external_renderer_contract_js_namespaceObject.assertRendererFederationCompatibility)(expected, attestation(args.remoteSnapshot).contract);
195
+ const cached = args.origin.moduleCache.get(args.remote.name);
196
+ if (cached && (approvedRemoteInfos.get(cached.remoteInfo) !== containerCoordinates(cached.remoteInfo) || containerCoordinates(cached.remoteInfo) !== containerCoordinates(args.remoteInfo))) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('cached remote container has unattested or conflicting ownership.');
197
+ const priorCoordinates = approvedRemoteInfos.get(args.remoteInfo);
198
+ if (void 0 !== priorCoordinates && priorCoordinates !== containerCoordinates(args.remoteInfo)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('native remote container coordinates changed after attestation.');
199
+ approvedRemoteInfos.set(args.remoteInfo, containerCoordinates(args.remoteInfo));
200
+ return args;
201
+ },
202
+ loadEntry (args) {
203
+ if (!acceptedEntries.has(entryCoordinates(args.remoteInfo))) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('remote entry coordinates differ from the attested native snapshot.');
204
+ },
205
+ async afterLoadEntry (args) {
206
+ if (args.error && !args.recovered) return args;
207
+ const binding = containerCoordinates(args.remoteInfo);
208
+ const entryBinding = entryCoordinates(args.remoteInfo);
209
+ if (args.cached && approvedRemoteInfos.get(args.remoteInfo) !== binding) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('remote entry has no attested native container resolution.');
210
+ if (!acceptedEntries.has(entryBinding)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('remote entry coordinates differ from the attested native snapshot.');
211
+ const entry = args.remoteEntryExports;
212
+ if (('object' != typeof entry || null === entry) && 'function' != typeof entry) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('native container exports are absent.');
213
+ if (args.cached && observedEntries.get(entry) !== entryBinding) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)('cached native container exports have unattested ownership.');
214
+ approvedRemoteInfos.set(args.remoteInfo, binding);
215
+ observedEntries.set(entry, entryBinding);
216
+ return args;
217
+ },
218
+ resolveShare (args) {
219
+ const version = versions.get(args.pkgName);
220
+ if (void 0 === version) return args;
221
+ const resolve = args.resolver;
222
+ return {
223
+ ...args,
224
+ resolver () {
225
+ const result = resolve();
226
+ if (!result) return result;
227
+ const shared = result.useTreesShaking && record(result.shared.treeShaking) ? result.shared.treeShaking : result.shared;
228
+ if (result.shared.version !== version) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)(`shared ${args.pkgName} version must be ${version}.`);
229
+ const prior = selected.get(args.pkgName);
230
+ if (prior && !sameFactory(prior, shared)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)(`shared ${args.pkgName} has conflicting runtime ownership.`);
231
+ for (const scope of Object.values(args.shareScopeMap))for (const candidate of Object.values(scope[args.pkgName] ?? {})){
232
+ const active = record(candidate.treeShaking) && candidate.treeShaking.loaded ? candidate.treeShaking : candidate;
233
+ if ((active.loaded || active.lib) && !sameFactory(active, shared)) throw (0, external_renderer_contract_js_namespaceObject.rendererFederationError)(`shared ${args.pkgName} has duplicate loaded runtime identities.`);
234
+ }
235
+ selected.set(args.pkgName, Object.freeze({
236
+ lib: shared.lib,
237
+ get: shared.get
238
+ }));
239
+ return result;
240
+ }
241
+ };
242
+ },
243
+ afterLoadShare (args) {
244
+ if (versions.has(args.pkgName) && args.selectedShared) {
245
+ const shared = record(args.selectedShared.treeShaking) && args.selectedShared.treeShaking.loaded ? args.selectedShared.treeShaking : args.selectedShared;
246
+ selected.set(args.pkgName, Object.freeze({
247
+ lib: shared.lib,
248
+ get: shared.get
249
+ }));
250
+ }
251
+ }
252
+ };
253
+ }
254
+ const renderer_runtime_plugin = createRendererFederationRuntimePlugin;
255
+ exports.createRendererFederationRuntimePlugin = __webpack_exports__.createRendererFederationRuntimePlugin;
256
+ exports["default"] = __webpack_exports__["default"];
257
+ exports.rendererShareVersions = __webpack_exports__.rendererShareVersions;
258
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
259
+ "createRendererFederationRuntimePlugin",
260
+ "default",
261
+ "rendererShareVersions"
262
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
263
+ Object.defineProperty(exports, '__esModule', {
264
+ value: true
265
+ });
@@ -0,0 +1,214 @@
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
+ const MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT = 'modernjs:mf-runtime-fallback';
31
+ const MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT = 'modernjs:mf-runtime-recovery';
32
+ const DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT = '/_modern/contract-gates/runtime-fallback';
33
+ const DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER = 'x-modernjs-runtime-signal-token';
34
+ class ModuleFederationRemoteLoadTimeoutError extends Error {
35
+ constructor(remote, timeoutMs){
36
+ super(`Loading remote "${remote}" timed out after ${timeoutMs}ms`);
37
+ this.name = 'ModuleFederationRemoteLoadTimeoutError';
38
+ }
39
+ }
40
+ class ModuleFederationRemoteLoadError extends Error {
41
+ constructor(remote, attempts, causeError){
42
+ super(`Unable to load remote "${remote}" after ${attempts} attempt${attempts > 1 ? 's' : ''}: ${causeError.message}`);
43
+ this.name = 'ModuleFederationRemoteLoadError';
44
+ this.remote = remote;
45
+ this.attempts = attempts;
46
+ this.causeError = causeError;
47
+ }
48
+ }
49
+ class ModuleFederationRemoteComponentContractError extends Error {
50
+ constructor(remote, exportName){
51
+ super(`Remote "${remote}" export "${exportName}" is not a valid React component`);
52
+ this.name = 'ModuleFederationRemoteComponentContractError';
53
+ }
54
+ }
55
+ function toError(error) {
56
+ if (error instanceof Error) return error;
57
+ return new Error('string' == typeof error ? error : 'Unknown remote load error');
58
+ }
59
+ function classifyModuleFederationFallback(error) {
60
+ const normalizedError = toError(error);
61
+ if (normalizedError instanceof ModuleFederationRemoteLoadError) return classifyModuleFederationFallback(normalizedError.causeError);
62
+ if (normalizedError instanceof ModuleFederationRemoteLoadTimeoutError) return 'timeout';
63
+ if (normalizedError instanceof ModuleFederationRemoteComponentContractError) return 'contract';
64
+ const message = normalizedError.message;
65
+ if (/version|requiredVersion|singleton|share scope|shared module/i.test(message)) return 'version-skew';
66
+ if (/network|fetch|script|timeout|chunk|loading/i.test(message)) return 'network';
67
+ return 'remote-unavailable';
68
+ }
69
+ function createModuleFederationFallbackTelemetry(input) {
70
+ const error = void 0 !== input.error ? toError(input.error) : void 0;
71
+ const status = input.status ?? 'degraded';
72
+ const eventName = input.eventName ?? ('recovered' === status ? MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT : MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT);
73
+ const metadata = {
74
+ ...input.metadata ?? {},
75
+ classification: input.classification,
76
+ remote: input.remote,
77
+ status
78
+ };
79
+ if (void 0 !== input.exportName) metadata.exportName = input.exportName;
80
+ if (void 0 !== input.runtimeDigest) metadata.runtimeDigest = input.runtimeDigest;
81
+ if (void 0 !== error) {
82
+ metadata.errorName = error.name;
83
+ metadata.errorMessage = error.message;
84
+ }
85
+ const payload = {
86
+ appName: input.appName,
87
+ eventName,
88
+ metadata,
89
+ phase: input.phase,
90
+ reason: input.classification,
91
+ schemaVersion: 1
92
+ };
93
+ if (void 0 !== input.entry) payload.entry = input.entry;
94
+ if (void 0 !== input.runtimeDigest) payload.runtimeDigest = input.runtimeDigest;
95
+ return payload;
96
+ }
97
+ function toModuleFederationFallbackAttributes(payload) {
98
+ return {
99
+ 'data-mf-fallback-app': payload.appName,
100
+ 'data-mf-fallback-classification': payload.reason,
101
+ 'data-mf-fallback-phase': payload.phase,
102
+ 'data-mf-fallback-remote': String(payload.metadata.remote),
103
+ 'data-mf-fallback-status': String(payload.metadata.status),
104
+ 'data-mf-telemetry-event': payload.eventName
105
+ };
106
+ }
107
+ function emitModuleFederationFallbackTelemetry(input, options = {}) {
108
+ return emitModuleFederationFallbackPayload(createModuleFederationFallbackTelemetry(input), options);
109
+ }
110
+ function emitModuleFederationFallbackPayload(payload, options = {}) {
111
+ const delivery = deliver(payload, options);
112
+ try {
113
+ options.observe?.(payload, delivery);
114
+ } catch {}
115
+ return delivery;
116
+ }
117
+ async function deliver(payload, options) {
118
+ let dispatched = false;
119
+ let timer;
120
+ const controller = new AbortController();
121
+ try {
122
+ if ("u" > typeof window && 'function' == typeof window.dispatchEvent && "u" > typeof CustomEvent) {
123
+ window.dispatchEvent(new CustomEvent(payload.eventName, {
124
+ detail: payload
125
+ }));
126
+ dispatched = true;
127
+ }
128
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
129
+ if (!(true === options.postSignal || options.endpoint) || 'function' != typeof fetchImpl) return {
130
+ dispatched,
131
+ posted: false
132
+ };
133
+ const headers = new Headers({
134
+ 'content-type': 'application/json'
135
+ });
136
+ if (options.authToken) headers.set(options.authHeaderName ?? DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER, options.authToken);
137
+ const timeoutMs = Number.isSafeInteger(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? options.timeoutMs : 1000;
138
+ const expired = new Promise((resolve)=>{
139
+ timer = setTimeout(()=>{
140
+ controller.abort();
141
+ resolve(void 0);
142
+ }, timeoutMs);
143
+ });
144
+ const response = await Promise.race([
145
+ fetchImpl(options.endpoint ?? DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT, {
146
+ body: JSON.stringify(payload),
147
+ headers,
148
+ method: 'POST',
149
+ keepalive: true,
150
+ signal: controller.signal
151
+ }),
152
+ expired
153
+ ]);
154
+ return response ? {
155
+ dispatched,
156
+ posted: true,
157
+ postStatus: response.status
158
+ } : {
159
+ dispatched,
160
+ posted: false
161
+ };
162
+ } catch {
163
+ return {
164
+ dispatched,
165
+ posted: false
166
+ };
167
+ } finally{
168
+ if (void 0 !== timer) clearTimeout(timer);
169
+ }
170
+ }
171
+ __webpack_require__.d(__webpack_exports__, {
172
+ ModuleFederationRemoteComponentContractError: ()=>ModuleFederationRemoteComponentContractError,
173
+ ModuleFederationRemoteLoadError: ()=>ModuleFederationRemoteLoadError,
174
+ ModuleFederationRemoteLoadTimeoutError: ()=>ModuleFederationRemoteLoadTimeoutError,
175
+ classifyModuleFederationFallback: ()=>classifyModuleFederationFallback,
176
+ createModuleFederationFallbackTelemetry: ()=>createModuleFederationFallbackTelemetry,
177
+ emitModuleFederationFallbackPayload: ()=>emitModuleFederationFallbackPayload,
178
+ emitModuleFederationFallbackTelemetry: ()=>emitModuleFederationFallbackTelemetry,
179
+ toModuleFederationFallbackAttributes: ()=>toModuleFederationFallbackAttributes
180
+ }, {
181
+ DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER: DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER,
182
+ DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT: DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT,
183
+ MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT: MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT,
184
+ MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT: MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT
185
+ });
186
+ exports.DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER = __webpack_exports__.DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER;
187
+ exports.DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT = __webpack_exports__.DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT;
188
+ exports.MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT = __webpack_exports__.MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT;
189
+ exports.MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT = __webpack_exports__.MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT;
190
+ exports.ModuleFederationRemoteComponentContractError = __webpack_exports__.ModuleFederationRemoteComponentContractError;
191
+ exports.ModuleFederationRemoteLoadError = __webpack_exports__.ModuleFederationRemoteLoadError;
192
+ exports.ModuleFederationRemoteLoadTimeoutError = __webpack_exports__.ModuleFederationRemoteLoadTimeoutError;
193
+ exports.classifyModuleFederationFallback = __webpack_exports__.classifyModuleFederationFallback;
194
+ exports.createModuleFederationFallbackTelemetry = __webpack_exports__.createModuleFederationFallbackTelemetry;
195
+ exports.emitModuleFederationFallbackPayload = __webpack_exports__.emitModuleFederationFallbackPayload;
196
+ exports.emitModuleFederationFallbackTelemetry = __webpack_exports__.emitModuleFederationFallbackTelemetry;
197
+ exports.toModuleFederationFallbackAttributes = __webpack_exports__.toModuleFederationFallbackAttributes;
198
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
199
+ "DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER",
200
+ "DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT",
201
+ "MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT",
202
+ "MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT",
203
+ "ModuleFederationRemoteComponentContractError",
204
+ "ModuleFederationRemoteLoadError",
205
+ "ModuleFederationRemoteLoadTimeoutError",
206
+ "classifyModuleFederationFallback",
207
+ "createModuleFederationFallbackTelemetry",
208
+ "emitModuleFederationFallbackPayload",
209
+ "emitModuleFederationFallbackTelemetry",
210
+ "toModuleFederationFallbackAttributes"
211
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
212
+ Object.defineProperty(exports, '__esModule', {
213
+ value: true
214
+ });
@@ -1,5 +1,5 @@
1
- import { classifyModuleFederationFallback, createModuleFederationFallbackTelemetry, emitModuleFederationFallbackTelemetry } from "./index.mjs";
2
1
  import { createDiscoveryError, formatSurfaceRef, parseSurfaceRef, validateSurfaceRef } from "./surface-resolution-types.mjs";
2
+ import { classifyModuleFederationFallback, createModuleFederationFallbackTelemetry, emitModuleFederationFallbackPayload, emitModuleFederationFallbackTelemetry } from "./telemetry.mjs";
3
3
  function classifyDiscoveryError(code) {
4
4
  switch(code){
5
5
  case 'major-not-published':
@@ -38,17 +38,7 @@ async function reportFailure(options, ref, base) {
38
38
  remote,
39
39
  status: 'degraded'
40
40
  });
41
- try {
42
- await emitModuleFederationFallbackTelemetry({
43
- appName: options.appName,
44
- classification: base.classification,
45
- error: base.error ?? base.discoveryError,
46
- metadata: telemetry.metadata,
47
- phase: base.phase,
48
- remote,
49
- status: 'degraded'
50
- }, options.telemetry ?? {});
51
- } catch {}
41
+ emitModuleFederationFallbackPayload(telemetry, options.telemetry);
52
42
  const failure = {
53
43
  ref,
54
44
  env: options.env,
@@ -68,7 +58,7 @@ async function reportFailure(options, ref, base) {
68
58
  degradedValue = await options.degraded(failure);
69
59
  } catch (handlerError) {
70
60
  try {
71
- await emitModuleFederationFallbackTelemetry({
61
+ emitModuleFederationFallbackTelemetry({
72
62
  appName: options.appName,
73
63
  classification: base.classification,
74
64
  error: handlerError,
@@ -62,7 +62,12 @@ function DistributedSsrBoundary({ children, expose, fallback, fragmentProps, rem
62
62
  function createDistributedSsrComponent({ createComponent, expose, fallback, remote }) {
63
63
  let RemoteComponent;
64
64
  function DeferredRemoteComponent(props) {
65
- RemoteComponent ??= createComponent();
65
+ RemoteComponent ??= createComponent({
66
+ export: 'default',
67
+ fallback,
68
+ injectLink: false,
69
+ loading: null
70
+ });
66
71
  return /*#__PURE__*/ jsx(RemoteComponent, {
67
72
  ...props
68
73
  });
@@ -1,115 +1,5 @@
1
1
  export * from "./consume-surface.mjs";
2
- export * from "./distributed-ssr.mjs";
3
2
  export * from "./last-known-good.mjs";
4
3
  export * from "./manifest-recovery-runtime-plugin.mjs";
5
4
  export * from "./surface-resolution-types.mjs";
6
- const MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT = 'modernjs:mf-runtime-fallback';
7
- const MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT = 'modernjs:mf-runtime-recovery';
8
- const DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT = '/_modern/contract-gates/runtime-fallback';
9
- const DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER = 'x-modernjs-runtime-signal-token';
10
- class ModuleFederationRemoteLoadTimeoutError extends Error {
11
- constructor(remote, timeoutMs){
12
- super(`Loading remote "${remote}" timed out after ${timeoutMs}ms`);
13
- this.name = 'ModuleFederationRemoteLoadTimeoutError';
14
- }
15
- }
16
- class ModuleFederationRemoteLoadError extends Error {
17
- constructor(remote, attempts, causeError){
18
- super(`Unable to load remote "${remote}" after ${attempts} attempt${attempts > 1 ? 's' : ''}: ${causeError.message}`);
19
- this.name = 'ModuleFederationRemoteLoadError';
20
- this.remote = remote;
21
- this.attempts = attempts;
22
- this.causeError = causeError;
23
- }
24
- }
25
- class ModuleFederationRemoteComponentContractError extends Error {
26
- constructor(remote, exportName){
27
- super(`Remote "${remote}" export "${exportName}" is not a valid React component`);
28
- this.name = 'ModuleFederationRemoteComponentContractError';
29
- }
30
- }
31
- function toError(error) {
32
- if (error instanceof Error) return error;
33
- return new Error('string' == typeof error ? error : 'Unknown remote load error');
34
- }
35
- function classifyModuleFederationFallback(error) {
36
- const normalizedError = toError(error);
37
- if (normalizedError instanceof ModuleFederationRemoteLoadError) return classifyModuleFederationFallback(normalizedError.causeError);
38
- if (normalizedError instanceof ModuleFederationRemoteLoadTimeoutError) return 'timeout';
39
- if (normalizedError instanceof ModuleFederationRemoteComponentContractError) return 'contract';
40
- const message = normalizedError.message;
41
- if (/version|requiredVersion|singleton|share scope|shared module/i.test(message)) return 'version-skew';
42
- if (/network|fetch|script|timeout|chunk|loading/i.test(message)) return 'network';
43
- return 'remote-unavailable';
44
- }
45
- function createModuleFederationFallbackTelemetry(input) {
46
- const error = void 0 !== input.error ? toError(input.error) : void 0;
47
- const status = input.status ?? 'degraded';
48
- const eventName = input.eventName ?? ('recovered' === status ? MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT : MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT);
49
- const metadata = {
50
- ...input.metadata ?? {},
51
- classification: input.classification,
52
- remote: input.remote,
53
- status
54
- };
55
- if (void 0 !== input.exportName) metadata.exportName = input.exportName;
56
- if (void 0 !== input.runtimeDigest) metadata.runtimeDigest = input.runtimeDigest;
57
- if (void 0 !== error) {
58
- metadata.errorName = error.name;
59
- metadata.errorMessage = error.message;
60
- }
61
- const payload = {
62
- appName: input.appName,
63
- eventName,
64
- metadata,
65
- phase: input.phase,
66
- reason: input.classification,
67
- schemaVersion: 1
68
- };
69
- if (void 0 !== input.entry) payload.entry = input.entry;
70
- if (void 0 !== input.runtimeDigest) payload.runtimeDigest = input.runtimeDigest;
71
- return payload;
72
- }
73
- function toModuleFederationFallbackAttributes(payload) {
74
- return {
75
- 'data-mf-fallback-app': payload.appName,
76
- 'data-mf-fallback-classification': payload.reason,
77
- 'data-mf-fallback-phase': payload.phase,
78
- 'data-mf-fallback-remote': String(payload.metadata.remote),
79
- 'data-mf-fallback-status': String(payload.metadata.status),
80
- 'data-mf-telemetry-event': payload.eventName
81
- };
82
- }
83
- async function emitModuleFederationFallbackTelemetry(input, options = {}) {
84
- const payload = createModuleFederationFallbackTelemetry(input);
85
- if ("u" > typeof window && 'function' == typeof window.dispatchEvent && "u" > typeof CustomEvent) window.dispatchEvent(new CustomEvent(payload.eventName, {
86
- detail: payload
87
- }));
88
- const shouldPost = true === options.postSignal || Boolean(options.endpoint);
89
- if (!shouldPost) return {
90
- dispatched: true,
91
- posted: false
92
- };
93
- const fetchImpl = options.fetchImpl ?? globalThis.fetch;
94
- if ('function' != typeof fetchImpl) return {
95
- dispatched: true,
96
- posted: false
97
- };
98
- const headers = new Headers({
99
- 'content-type': 'application/json'
100
- });
101
- if (void 0 !== options.authToken && options.authToken.length > 0) headers.set(options.authHeaderName ?? DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER, options.authToken);
102
- const response = await fetchImpl(options.endpoint ?? DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT, {
103
- body: JSON.stringify(payload),
104
- headers,
105
- method: 'POST',
106
- keepalive: true
107
- });
108
- return {
109
- dispatched: true,
110
- posted: true,
111
- postStatus: response.status
112
- };
113
- }
114
- export { DISTRIBUTED_SSR_FRAGMENT_REQUEST_LOCALS_KEY, useDistributedSsrFragmentProps } from "./distributed-ssr.mjs";
115
- export { DEFAULT_RUNTIME_FALLBACK_SIGNAL_AUTH_HEADER, DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT, MODULE_FEDERATION_FALLBACK_SIGNAL_EVENT, MODULE_FEDERATION_RECOVERY_SIGNAL_EVENT, ModuleFederationRemoteComponentContractError, ModuleFederationRemoteLoadError, ModuleFederationRemoteLoadTimeoutError, classifyModuleFederationFallback, createModuleFederationFallbackTelemetry, emitModuleFederationFallbackTelemetry, toModuleFederationFallbackAttributes };
5
+ export * from "./telemetry.mjs";
@@ -31,7 +31,7 @@ const getErrorStatus = (error)=>{
31
31
  if ('object' == typeof error && null !== error && 'status' in error && 'number' == typeof error.status) return error.status;
32
32
  };
33
33
  const isRetryableError = (error)=>{
34
- if (error instanceof SyntaxError) return false;
34
+ if (error instanceof SyntaxError) return true;
35
35
  const message = getErrorMessage(error);
36
36
  if (NON_RETRYABLE_ERROR_PATTERNS.some((pattern)=>pattern.test(message))) return false;
37
37
  const status = getErrorStatus(error);