@bleedingdev/modern-js-plugin-bff-extensions 3.9.0-ultramodern.2 → 3.9.0-ultramodern.20
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.
- package/README.md +25 -5
- package/dist/cjs/backend-federation/edge-runtime.js +3 -15
- package/dist/cjs/backend-federation/edge.js +9 -10
- package/dist/cjs/backend-federation/identity.js +26 -31
- package/dist/cjs/backend-federation/index.js +5 -5
- package/dist/cjs/backend-federation/integrity-plugin.js +112 -0
- package/dist/cjs/backend-federation/load.js +3 -13
- package/dist/cjs/backend-federation/node-shared.js +85 -0
- package/dist/cjs/backend-federation/node.js +6 -1
- package/dist/cjs/backend-federation/plugin.js +40 -21
- package/dist/cjs/backend-federation/runtime.js +16 -84
- package/dist/cjs/backend-federation/validate-loaded.js +2 -4
- package/dist/cjs/backend-federation-manifest/load.js +40 -12
- package/dist/cjs/backend-federation-manifest/metadata.js +3 -3
- package/dist/cjs/backend-federation-manifest/node.js +3 -1
- package/dist/cjs/backend-federation-manifest/remote.js +3 -9
- package/dist/cjs/backend-federation-manifest/validation.js +16 -12
- package/dist/cjs/cross-project-policy/evaluation.js +3 -3
- package/dist/cjs/cross-project-policy/node.js +11 -30
- package/dist/cjs/{backend-federation/legacy-warning.js → cross-project-policy/producer-runtime.js} +23 -5
- package/dist/cjs/{effect-adapter → effect-server}/cross-project-policy.js +5 -5
- package/dist/cjs/effect-server/entry.js +63 -0
- package/dist/cjs/{effect-adapter → effect-server}/error-response.js +4 -4
- package/dist/cjs/effect-server/index.js +199 -0
- package/dist/cjs/{client-generator → effect-source-loader}/built-entry.js +5 -6
- package/dist/cjs/{client-generator/runtime.js → effect-source-loader/http-api-runtime.js} +12 -20
- package/dist/cjs/effect-source-loader/index.js +18 -6
- package/dist/cjs/effect-source-loader/loader.js +17 -30
- package/dist/cjs/effect-source-loader/operation-contracts.js +60 -0
- package/dist/cjs/effect-source-loader/paths.js +90 -0
- package/dist/cjs/effect-source-loader/rspack-loader.js +73 -0
- package/dist/cjs/effect-source-loader/worker-runtime-source.js +71 -0
- package/dist/cjs/effect-source-loader/worker-runtime-wrapper.js +7 -50
- package/dist/cjs/hono/cross-project-policy.js +2 -1
- package/dist/cjs/{client-generator/paths.js → hono/node.js} +14 -25
- package/dist/esm/backend-federation/edge-runtime.mjs +2 -11
- package/dist/esm/backend-federation/edge.mjs +5 -6
- package/dist/esm/backend-federation/identity.mjs +21 -32
- package/dist/esm/backend-federation/index.mjs +1 -1
- package/dist/esm/backend-federation/integrity-plugin.mjs +68 -0
- package/dist/esm/backend-federation/load.mjs +2 -12
- package/dist/esm/backend-federation/node-shared.mjs +41 -0
- package/dist/esm/backend-federation/node.mjs +4 -2
- package/dist/esm/backend-federation/plugin.mjs +37 -18
- package/dist/esm/backend-federation/runtime.mjs +16 -84
- package/dist/esm/backend-federation/validate-loaded.mjs +2 -4
- package/dist/esm/backend-federation-manifest/load.mjs +40 -12
- package/dist/esm/backend-federation-manifest/metadata.mjs +1 -1
- package/dist/esm/backend-federation-manifest/node.mjs +3 -1
- package/dist/esm/backend-federation-manifest/remote.mjs +2 -8
- package/dist/esm/backend-federation-manifest/validation.mjs +15 -11
- package/dist/esm/cross-project-policy/evaluation.mjs +1 -1
- package/dist/esm/cross-project-policy/node.mjs +10 -19
- package/dist/esm/cross-project-policy/producer-runtime.mjs +20 -0
- package/dist/esm/{effect-adapter → effect-server}/cross-project-policy.mjs +3 -3
- package/dist/esm/effect-server/entry.mjs +15 -0
- package/dist/esm/{effect-adapter → effect-server}/error-response.mjs +2 -2
- package/dist/esm/effect-server/index.mjs +151 -0
- package/dist/esm/{client-generator → effect-source-loader}/built-entry.mjs +6 -7
- package/dist/esm/effect-source-loader/http-api-runtime.mjs +19 -0
- package/dist/esm/effect-source-loader/index.mjs +5 -2
- package/dist/esm/effect-source-loader/loader.mjs +17 -30
- package/dist/esm/effect-source-loader/operation-contracts.mjs +22 -0
- package/dist/esm/effect-source-loader/paths.mjs +43 -0
- package/dist/esm/effect-source-loader/rspack-loader.mjs +35 -0
- package/dist/esm/effect-source-loader/worker-runtime-source.mjs +23 -0
- package/dist/esm/effect-source-loader/worker-runtime-wrapper.mjs +5 -45
- package/dist/esm/hono/cross-project-policy.mjs +2 -1
- package/dist/esm-node/backend-federation/edge-runtime.mjs +2 -11
- package/dist/esm-node/backend-federation/edge.mjs +5 -6
- package/dist/esm-node/backend-federation/identity.mjs +21 -32
- package/dist/esm-node/backend-federation/index.mjs +1 -1
- package/dist/esm-node/backend-federation/integrity-plugin.mjs +69 -0
- package/dist/esm-node/backend-federation/load.mjs +2 -12
- package/dist/esm-node/backend-federation/node-shared.mjs +42 -0
- package/dist/esm-node/backend-federation/node.mjs +4 -2
- package/dist/esm-node/backend-federation/plugin.mjs +37 -18
- package/dist/esm-node/backend-federation/runtime.mjs +16 -84
- package/dist/esm-node/backend-federation/validate-loaded.mjs +2 -4
- package/dist/esm-node/backend-federation-manifest/load.mjs +40 -12
- package/dist/esm-node/backend-federation-manifest/metadata.mjs +1 -1
- package/dist/esm-node/backend-federation-manifest/node.mjs +3 -1
- package/dist/esm-node/backend-federation-manifest/remote.mjs +2 -8
- package/dist/esm-node/backend-federation-manifest/validation.mjs +15 -11
- package/dist/esm-node/cross-project-policy/evaluation.mjs +1 -1
- package/dist/esm-node/cross-project-policy/node.mjs +10 -19
- package/dist/esm-node/cross-project-policy/producer-runtime.mjs +21 -0
- package/dist/esm-node/{effect-adapter → effect-server}/cross-project-policy.mjs +3 -3
- package/dist/esm-node/effect-server/entry.mjs +16 -0
- package/dist/esm-node/{effect-adapter → effect-server}/error-response.mjs +2 -2
- package/dist/esm-node/effect-server/index.mjs +152 -0
- package/dist/esm-node/{client-generator → effect-source-loader}/built-entry.mjs +6 -7
- package/dist/esm-node/effect-source-loader/http-api-runtime.mjs +20 -0
- package/dist/esm-node/effect-source-loader/index.mjs +5 -2
- package/dist/esm-node/effect-source-loader/loader.mjs +17 -30
- package/dist/esm-node/effect-source-loader/operation-contracts.mjs +23 -0
- package/dist/esm-node/effect-source-loader/paths.mjs +44 -0
- package/dist/esm-node/effect-source-loader/rspack-loader.mjs +37 -0
- package/dist/esm-node/effect-source-loader/worker-runtime-source.mjs +24 -0
- package/dist/esm-node/effect-source-loader/worker-runtime-wrapper.mjs +5 -45
- package/dist/esm-node/hono/cross-project-policy.mjs +2 -1
- package/dist/esm-node/hono/node.mjs +14 -0
- package/dist/types/backend-federation/edge-runtime.d.ts +0 -5
- package/dist/types/backend-federation/edge.d.ts +5 -5
- package/dist/types/backend-federation/identity.d.ts +4 -16
- package/dist/types/backend-federation/index.d.ts +1 -1
- package/dist/types/backend-federation/integrity-plugin.d.ts +13 -0
- package/dist/types/backend-federation/load.d.ts +1 -7
- package/dist/types/backend-federation/node-shared.d.ts +20 -0
- package/dist/types/backend-federation/node.d.ts +4 -3
- package/dist/types/backend-federation/plugin.d.ts +4 -0
- package/dist/types/backend-federation/types.d.ts +3 -14
- package/dist/types/backend-federation/validate-loaded.d.ts +1 -2
- package/dist/types/backend-federation-manifest/metadata.d.ts +0 -6
- package/dist/types/backend-federation-manifest/types.d.ts +2 -1
- package/dist/types/cross-project-policy/evaluation.d.ts +1 -1
- package/dist/types/cross-project-policy/node.d.ts +3 -2
- package/dist/types/cross-project-policy/producer-runtime.d.ts +20 -0
- package/dist/types/effect-server/cross-project-policy.d.ts +5 -0
- package/dist/types/effect-server/entry.d.ts +3 -0
- package/dist/types/effect-server/error-response.d.ts +2 -0
- package/dist/types/effect-server/index.d.ts +4 -0
- package/dist/types/effect-source-loader/index.d.ts +5 -2
- package/dist/types/effect-source-loader/operation-contracts.d.ts +8 -0
- package/dist/types/effect-source-loader/paths.d.ts +23 -0
- package/dist/types/effect-source-loader/rspack-loader.d.ts +9 -0
- package/dist/types/effect-source-loader/worker-runtime-source.d.ts +4 -0
- package/dist/types/effect-source-loader/worker-runtime-wrapper.d.ts +4 -22
- package/dist/types/hono/node.d.ts +4 -0
- package/package.json +64 -36
- package/src/backend-federation/edge-runtime.ts +2 -13
- package/src/backend-federation/edge.ts +16 -21
- package/src/backend-federation/identity.ts +39 -65
- package/src/backend-federation/index.ts +1 -1
- package/src/backend-federation/integrity-plugin.ts +157 -0
- package/src/backend-federation/load.ts +7 -35
- package/src/backend-federation/node-shared.ts +76 -0
- package/src/backend-federation/node.ts +7 -14
- package/src/backend-federation/plugin.ts +73 -25
- package/src/backend-federation/runtime.ts +16 -90
- package/src/backend-federation/types.ts +3 -18
- package/src/backend-federation/validate-loaded.ts +2 -7
- package/src/backend-federation-manifest/load.ts +93 -38
- package/src/backend-federation-manifest/metadata.ts +1 -7
- package/src/backend-federation-manifest/node.ts +3 -2
- package/src/backend-federation-manifest/remote.ts +1 -7
- package/src/backend-federation-manifest/types.ts +2 -0
- package/src/backend-federation-manifest/validation.ts +29 -39
- package/src/cross-project-policy/evaluation.ts +1 -1
- package/src/cross-project-policy/node.ts +10 -41
- package/src/cross-project-policy/producer-runtime.ts +43 -0
- package/src/{effect-adapter → effect-server}/cross-project-policy.ts +8 -2
- package/src/effect-server/entry.ts +18 -0
- package/src/{effect-adapter → effect-server}/error-response.ts +1 -1
- package/src/effect-server/index.ts +242 -0
- package/src/{client-generator → effect-source-loader}/built-entry.ts +12 -12
- package/src/effect-source-loader/http-api-runtime.ts +39 -0
- package/src/effect-source-loader/index.ts +8 -5
- package/src/effect-source-loader/loader.ts +47 -52
- package/src/effect-source-loader/operation-contracts.ts +38 -0
- package/src/effect-source-loader/paths.ts +74 -0
- package/src/effect-source-loader/rspack-loader.ts +71 -0
- package/src/effect-source-loader/worker-runtime-source.ts +34 -0
- package/src/effect-source-loader/worker-runtime-wrapper.ts +5 -75
- package/src/hono/cross-project-policy.ts +2 -1
- package/src/hono/node.ts +24 -0
- package/dist/cjs/backend-federation/entry.js +0 -94
- package/dist/cjs/client-generator/generator.js +0 -73
- package/dist/cjs/client-generator/index.js +0 -54
- package/dist/cjs/client-generator/rendering.js +0 -253
- package/dist/cjs/client-generator/types.js +0 -18
- package/dist/cjs/effect-adapter/entry.js +0 -98
- package/dist/cjs/effect-adapter/index.js +0 -187
- package/dist/esm/backend-federation/entry.mjs +0 -56
- package/dist/esm/backend-federation/legacy-warning.mjs +0 -2
- package/dist/esm/client-generator/generator.mjs +0 -32
- package/dist/esm/client-generator/index.mjs +0 -3
- package/dist/esm/client-generator/paths.mjs +0 -24
- package/dist/esm/client-generator/rendering.mjs +0 -209
- package/dist/esm/client-generator/runtime.mjs +0 -27
- package/dist/esm/client-generator/types.mjs +0 -0
- package/dist/esm/effect-adapter/entry.mjs +0 -50
- package/dist/esm/effect-adapter/index.mjs +0 -139
- package/dist/esm-node/backend-federation/entry.mjs +0 -57
- package/dist/esm-node/backend-federation/legacy-warning.mjs +0 -3
- package/dist/esm-node/client-generator/generator.mjs +0 -33
- package/dist/esm-node/client-generator/index.mjs +0 -4
- package/dist/esm-node/client-generator/paths.mjs +0 -25
- package/dist/esm-node/client-generator/rendering.mjs +0 -210
- package/dist/esm-node/client-generator/runtime.mjs +0 -29
- package/dist/esm-node/client-generator/types.mjs +0 -1
- package/dist/esm-node/effect-adapter/entry.mjs +0 -51
- package/dist/esm-node/effect-adapter/index.mjs +0 -140
- package/dist/types/backend-federation/entry.d.ts +0 -2
- package/dist/types/backend-federation/legacy-warning.d.ts +0 -1
- package/dist/types/client-generator/generator.d.ts +0 -3
- package/dist/types/client-generator/index.d.ts +0 -4
- package/dist/types/client-generator/paths.d.ts +0 -5
- package/dist/types/client-generator/rendering.d.ts +0 -24
- package/dist/types/client-generator/types.d.ts +0 -33
- package/dist/types/effect-adapter/cross-project-policy.d.ts +0 -4
- package/dist/types/effect-adapter/entry.d.ts +0 -2
- package/dist/types/effect-adapter/error-response.d.ts +0 -2
- package/dist/types/effect-adapter/index.d.ts +0 -19
- package/src/backend-federation/entry.ts +0 -125
- package/src/backend-federation/legacy-warning.ts +0 -2
- package/src/client-generator/generator.ts +0 -52
- package/src/client-generator/index.ts +0 -10
- package/src/client-generator/paths.ts +0 -40
- package/src/client-generator/rendering.ts +0 -307
- package/src/client-generator/runtime.ts +0 -69
- package/src/client-generator/types.ts +0 -35
- package/src/effect-adapter/entry.ts +0 -95
- package/src/effect-adapter/index.ts +0 -246
- /package/dist/types/{client-generator → effect-source-loader}/built-entry.d.ts +0 -0
- /package/dist/types/{client-generator/runtime.d.ts → effect-source-loader/http-api-runtime.d.ts} +0 -0
|
@@ -31,93 +31,25 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
createBackendFederationRuntime: ()=>createBackendFederationRuntime
|
|
32
32
|
});
|
|
33
33
|
const runtime_namespaceObject = require("@module-federation/runtime");
|
|
34
|
-
const
|
|
35
|
-
const external_plugin_js_namespaceObject = require("./plugin.js");
|
|
34
|
+
const external_integrity_plugin_js_namespaceObject = require("./integrity-plugin.js");
|
|
36
35
|
const external_remotes_js_namespaceObject = require("./remotes.js");
|
|
37
|
-
function _check_private_redeclaration(obj, privateCollection) {
|
|
38
|
-
if (privateCollection.has(obj)) throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
39
|
-
}
|
|
40
|
-
function _class_apply_descriptor_get(receiver, descriptor) {
|
|
41
|
-
if (descriptor.get) return descriptor.get.call(receiver);
|
|
42
|
-
return descriptor.value;
|
|
43
|
-
}
|
|
44
|
-
function _class_apply_descriptor_set(receiver, descriptor, value) {
|
|
45
|
-
if (descriptor.set) descriptor.set.call(receiver, value);
|
|
46
|
-
else {
|
|
47
|
-
if (!descriptor.writable) throw new TypeError("attempted to set read only private field");
|
|
48
|
-
descriptor.value = value;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function _class_extract_field_descriptor(receiver, privateMap, action) {
|
|
52
|
-
if (!privateMap.has(receiver)) throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
53
|
-
return privateMap.get(receiver);
|
|
54
|
-
}
|
|
55
|
-
function _class_private_field_get(receiver, privateMap) {
|
|
56
|
-
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
|
|
57
|
-
return _class_apply_descriptor_get(receiver, descriptor);
|
|
58
|
-
}
|
|
59
|
-
function _class_private_field_init(obj, privateMap, value) {
|
|
60
|
-
_check_private_redeclaration(obj, privateMap);
|
|
61
|
-
privateMap.set(obj, value);
|
|
62
|
-
}
|
|
63
|
-
function _class_private_field_set(receiver, privateMap, value) {
|
|
64
|
-
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
|
|
65
|
-
_class_apply_descriptor_set(receiver, descriptor, value);
|
|
66
|
-
return value;
|
|
67
|
-
}
|
|
68
|
-
let nextRuntimeId = 0;
|
|
69
|
-
function parseRemoteRequest(request) {
|
|
70
|
-
const [remoteName, ...exposeParts] = request.split('/');
|
|
71
|
-
if (void 0 === remoteName || 0 === remoteName.length || 0 === exposeParts.length) return;
|
|
72
|
-
return remoteName;
|
|
73
|
-
}
|
|
74
|
-
function createLocalEntryPlugin(options, remotes) {
|
|
75
|
-
return (0, external_plugin_js_namespaceObject.createBackendFederationLoadEntryPlugin)({
|
|
76
|
-
resolveEntry (resolvedRemote) {
|
|
77
|
-
const remote = remotes.find((candidate)=>candidate.name === resolvedRemote.name);
|
|
78
|
-
if (void 0 === remote) return;
|
|
79
|
-
return {
|
|
80
|
-
get (expose) {
|
|
81
|
-
return ()=>(0, external_entry_js_namespaceObject.loadBackendFederationExpose)(remote, expose, options);
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
function isolateRegisteredRemoteEntries(remotes) {
|
|
88
|
-
const runtimeId = nextRuntimeId;
|
|
89
|
-
nextRuntimeId += 1;
|
|
90
|
-
return remotes.map((remote)=>({
|
|
91
|
-
...remote,
|
|
92
|
-
entry: `${remote.entry}#modernjs-backend-runtime-${runtimeId}`
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
var _remoteNames = /*#__PURE__*/ new WeakMap();
|
|
96
|
-
class BackendFederationRuntime extends runtime_namespaceObject.ModuleFederation {
|
|
97
|
-
loadRemote(request, loadOptions) {
|
|
98
|
-
const remoteName = parseRemoteRequest(request);
|
|
99
|
-
if (void 0 === remoteName) return Promise.reject(new Error(`[BFF][Effect] Invalid backend federation request ${request}.`));
|
|
100
|
-
if (!_class_private_field_get(this, _remoteNames).has(remoteName)) return Promise.reject(new Error(`[BFF][Effect] Missing backend federation remote ${remoteName}.`));
|
|
101
|
-
return super.loadRemote(request, loadOptions);
|
|
102
|
-
}
|
|
103
|
-
constructor(options, remotes){
|
|
104
|
-
super({
|
|
105
|
-
name: options.hostName,
|
|
106
|
-
remotes: isolateRegisteredRemoteEntries(remotes),
|
|
107
|
-
shared: {},
|
|
108
|
-
plugins: [
|
|
109
|
-
createLocalEntryPlugin(options, remotes)
|
|
110
|
-
]
|
|
111
|
-
}), _class_private_field_init(this, _remoteNames, {
|
|
112
|
-
writable: true,
|
|
113
|
-
value: void 0
|
|
114
|
-
});
|
|
115
|
-
_class_private_field_set(this, _remoteNames, new Set(remotes.map((remote)=>remote.name)));
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
36
|
function createBackendFederationRuntime(options) {
|
|
119
37
|
const remotes = (0, external_remotes_js_namespaceObject.collectRemotes)(options);
|
|
120
|
-
return new
|
|
38
|
+
return new runtime_namespaceObject.ModuleFederation({
|
|
39
|
+
name: options.hostName,
|
|
40
|
+
remotes: remotes.map(({ name, entry, type })=>({
|
|
41
|
+
name,
|
|
42
|
+
entry,
|
|
43
|
+
...type ? {
|
|
44
|
+
type
|
|
45
|
+
} : {}
|
|
46
|
+
})),
|
|
47
|
+
shared: options.shared ?? {},
|
|
48
|
+
plugins: [
|
|
49
|
+
...options.plugins ?? [],
|
|
50
|
+
(0, external_integrity_plugin_js_namespaceObject.createBackendFederationIntegrityPlugin)(options, remotes)
|
|
51
|
+
]
|
|
52
|
+
});
|
|
121
53
|
}
|
|
122
54
|
exports.createBackendFederationRuntime = __webpack_exports__.createBackendFederationRuntime;
|
|
123
55
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
@@ -39,10 +39,8 @@ function validateLoadedBackendFederatedEffectApi(loaded, options) {
|
|
|
39
39
|
if ('effect' !== backendContract.runtimeFramework) throw new Error(`[BFF][Effect] Backend federation expose ${options.remoteRequest} must expose strict Effect metadata (runtimeFramework: "effect").`);
|
|
40
40
|
if ('string' == typeof backendContract.name && backendContract.name !== options.remoteName) throw new Error(`[BFF][Effect] Backend federation expose ${options.remoteRequest} metadata name mismatch: expected ${options.remoteName}, received ${backendContract.name}.`);
|
|
41
41
|
if (!('runtime' in loaded)) throw new Error(`[BFF][Effect] Backend federation expose ${options.remoteRequest} must expose runtime.`);
|
|
42
|
-
|
|
43
|
-
const issues = (0, external_identity_js_namespaceObject.validateExpectedBackendFederationIdentity)(loaded, options.expected
|
|
44
|
-
allowMissingIdentityMetadata: true === options.allowMissingIdentityMetadata
|
|
45
|
-
});
|
|
42
|
+
{
|
|
43
|
+
const issues = (0, external_identity_js_namespaceObject.validateExpectedBackendFederationIdentity)(loaded, options.expected);
|
|
46
44
|
if (issues.length > 0) throw new Error(`[BFF][Effect] Backend federation expose ${options.remoteRequest} delivery-unit identity mismatch: ${(0, external_identity_js_namespaceObject.formatBackendFederationIdentityIssues)(issues)}.`);
|
|
47
45
|
}
|
|
48
46
|
return loaded;
|
|
@@ -33,9 +33,11 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
33
33
|
const index_js_namespaceObject = require("../backend-federation/index.js");
|
|
34
34
|
const load_js_namespaceObject = require("../backend-federation/load.js");
|
|
35
35
|
const external_errors_js_namespaceObject = require("./errors.js");
|
|
36
|
+
const external_metadata_js_namespaceObject = require("./metadata.js");
|
|
36
37
|
const external_reference_js_namespaceObject = require("./reference.js");
|
|
37
38
|
const external_remote_js_namespaceObject = require("./remote.js");
|
|
38
39
|
const external_validation_js_namespaceObject = require("./validation.js");
|
|
40
|
+
const DEFAULT_SHARED_MANIFEST_LOAD_TIMEOUT_MS = 10000;
|
|
39
41
|
function createManifestLoadScope(options) {
|
|
40
42
|
const controller = new AbortController();
|
|
41
43
|
const policyTimeouts = [
|
|
@@ -47,7 +49,8 @@ function createManifestLoadScope(options) {
|
|
|
47
49
|
...policyTimeouts
|
|
48
50
|
].filter((timeout)=>void 0 !== timeout);
|
|
49
51
|
for (const timeout of configuredTimeouts)if (!Number.isSafeInteger(timeout) || timeout < 0) throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('manifest_invalid', '[BFF][Effect] Backend federation timeoutMs must be a non-negative safe integer.');
|
|
50
|
-
const
|
|
52
|
+
const positivePolicyTimeouts = policyTimeouts.filter((timeout)=>timeout > 0);
|
|
53
|
+
const timeoutMs = options.timeoutMs ?? (0 === policyTimeouts.length ? DEFAULT_SHARED_MANIFEST_LOAD_TIMEOUT_MS : positivePolicyTimeouts.length > 0 ? Math.min(...positivePolicyTimeouts) : 0);
|
|
51
54
|
const inputSignals = [
|
|
52
55
|
options.signal,
|
|
53
56
|
options.manifestPolicy?.signal,
|
|
@@ -101,6 +104,27 @@ function isCallerPinnedStaticRemote(options, remote) {
|
|
|
101
104
|
function throwIfManifestLoadAborted(signal) {
|
|
102
105
|
if (signal.aborted) throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('remote_unavailable', '[BFF][Effect] Backend federation load was aborted before remote execution.', signal.reason);
|
|
103
106
|
}
|
|
107
|
+
function settleOnSharedAbort(promise, signal) {
|
|
108
|
+
if (signal.aborted) {
|
|
109
|
+
promise.catch(()=>{});
|
|
110
|
+
throwIfManifestLoadAborted(signal);
|
|
111
|
+
}
|
|
112
|
+
let onAbort;
|
|
113
|
+
const aborted = new Promise((_resolve, reject)=>{
|
|
114
|
+
onAbort = ()=>{
|
|
115
|
+
reject(new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('remote_unavailable', '[BFF][Effect] Backend federation load was aborted before remote execution.', signal.reason));
|
|
116
|
+
};
|
|
117
|
+
signal.addEventListener('abort', onAbort, {
|
|
118
|
+
once: true
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
return Promise.race([
|
|
122
|
+
promise,
|
|
123
|
+
aborted
|
|
124
|
+
]).finally(()=>{
|
|
125
|
+
if (onAbort) signal.removeEventListener('abort', onAbort);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
104
128
|
async function loadBackendFederatedEffectApiFromManifest(options) {
|
|
105
129
|
let manifest;
|
|
106
130
|
let remote;
|
|
@@ -108,7 +132,7 @@ async function loadBackendFederatedEffectApiFromManifest(options) {
|
|
|
108
132
|
try {
|
|
109
133
|
scope = createManifestLoadScope(options);
|
|
110
134
|
throwIfManifestLoadAborted(scope.signal);
|
|
111
|
-
manifest = await (0, external_reference_js_namespaceObject.loadBackendFederationManifest)({
|
|
135
|
+
manifest = await settleOnSharedAbort((0, external_reference_js_namespaceObject.loadBackendFederationManifest)({
|
|
112
136
|
...options,
|
|
113
137
|
manifestPolicy: {
|
|
114
138
|
...options.manifestPolicy,
|
|
@@ -117,7 +141,7 @@ async function loadBackendFederatedEffectApiFromManifest(options) {
|
|
|
117
141
|
},
|
|
118
142
|
signal: scope.signal,
|
|
119
143
|
timeoutMs: 0
|
|
120
|
-
});
|
|
144
|
+
}), scope.signal);
|
|
121
145
|
(0, external_validation_js_namespaceObject.validateBackendFederationManifest)(manifest, options.expected);
|
|
122
146
|
remote = (0, external_remote_js_namespaceObject.resolveBackendFederationRemoteFromManifest)(manifest, options.remote);
|
|
123
147
|
throwIfManifestLoadAborted(scope.signal);
|
|
@@ -127,12 +151,19 @@ async function loadBackendFederatedEffectApiFromManifest(options) {
|
|
|
127
151
|
if (remoteManifest && /^https?:\/\//iu.test(remote.entry) && !hasPinnedRemoteEntryExpectation(options)) throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('manifest_invalid', `[BFF][Effect] Backend federation remote ${remote.name} from a network manifest requires caller-pinned entryUrl, remoteName, sha256, and byteLength values.`);
|
|
128
152
|
if (/^https?:\/\//iu.test(remote.entry) && void 0 === remote.verification && options.entryPolicy?.expected === void 0) throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('manifest_invalid', `[BFF][Effect] Backend federation remote ${remote.name} requires entry.sha256 and entry.byteLength before network execution.`);
|
|
129
153
|
if (/^https?:\/\//iu.test(remote.entry) && void 0 !== options.runtime) throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('manifest_invalid', `[BFF][Effect] Backend federation remote ${remote.name} cannot use a custom runtime for network entry execution.`);
|
|
130
|
-
const
|
|
154
|
+
const deliveryUnit = (0, external_metadata_js_namespaceObject.manifestDeliveryUnit)((0, external_metadata_js_namespaceObject.backendFederationMetadata)(manifest), (0, external_metadata_js_namespaceObject.versionBoundaryMetadata)(manifest));
|
|
155
|
+
const unitId = (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.unitId) ?? (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.top?.unitId);
|
|
156
|
+
const buildMarker = (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.buildMarker);
|
|
157
|
+
if (!unitId || !buildMarker) throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError('manifest_invalid', 'Backend federation manifest requires delivery-unit identity.');
|
|
158
|
+
const loaded = await settleOnSharedAbort((0, load_js_namespaceObject.loadBackendFederatedEffectApi)({
|
|
131
159
|
hostName: options.hostName,
|
|
132
160
|
remote,
|
|
133
161
|
...options.plugins ? {
|
|
134
162
|
plugins: options.plugins
|
|
135
163
|
} : {},
|
|
164
|
+
...options.shared ? {
|
|
165
|
+
shared: options.shared
|
|
166
|
+
} : {},
|
|
136
167
|
entryPolicy: {
|
|
137
168
|
...options.entryPolicy,
|
|
138
169
|
signal: scope.signal,
|
|
@@ -141,16 +172,13 @@ async function loadBackendFederatedEffectApiFromManifest(options) {
|
|
|
141
172
|
...options.runtime ? {
|
|
142
173
|
runtime: options.runtime
|
|
143
174
|
} : {},
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
},
|
|
149
|
-
allowMissingIdentityMetadata: true
|
|
150
|
-
} : {}
|
|
175
|
+
expected: {
|
|
176
|
+
unitId,
|
|
177
|
+
buildMarker
|
|
178
|
+
}
|
|
151
179
|
}).catch((error)=>{
|
|
152
180
|
throw new external_errors_js_namespaceObject.BackendFederationManifestAdapterError(scope?.timedOut() === true ? 'timeout' : (0, external_validation_js_namespaceObject.classifyLoadError)(error), `[BFF][Effect] Backend federation remote ${remote?.name ?? 'unknown'} could not load ${remote?.expose ?? index_js_namespaceObject.BACKEND_FEDERATION_EFFECT_EXPOSE}.`, error);
|
|
153
|
-
});
|
|
181
|
+
}), scope.signal);
|
|
154
182
|
(0, external_validation_js_namespaceObject.validateLoadedBackendFederationContract)(loaded, manifest, remote);
|
|
155
183
|
return loaded;
|
|
156
184
|
} catch (error) {
|
|
@@ -37,7 +37,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
37
37
|
stringValue: ()=>stringValue,
|
|
38
38
|
versionBoundaryMetadata: ()=>versionBoundaryMetadata
|
|
39
39
|
});
|
|
40
|
-
const
|
|
40
|
+
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
41
41
|
function stringValue(value) {
|
|
42
42
|
return 'string' == typeof value && value.length > 0 ? value : void 0;
|
|
43
43
|
}
|
|
@@ -64,10 +64,10 @@ function resolveRemoteEntryFromMetadata(manifest) {
|
|
|
64
64
|
].filter(Boolean).join('/');
|
|
65
65
|
}
|
|
66
66
|
function backendFederationMetadata(manifest) {
|
|
67
|
-
return (0,
|
|
67
|
+
return (0, backend_federation_contracts_namespaceObject.backendFederationMetadata)(manifest);
|
|
68
68
|
}
|
|
69
69
|
function versionBoundaryMetadata(manifest) {
|
|
70
|
-
return (0,
|
|
70
|
+
return (0, backend_federation_contracts_namespaceObject.backendFederationVersionBoundary)(manifest);
|
|
71
71
|
}
|
|
72
72
|
function deliveryUnitMetadata(record) {
|
|
73
73
|
return recordField(record, 'deliveryUnit');
|
|
@@ -31,10 +31,12 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
loadBackendFederatedEffectApiFromManifest: ()=>loadBackendFederatedEffectApiFromManifest
|
|
32
32
|
});
|
|
33
33
|
const node_namespaceObject = require("@modern-js/server-runtime-extensions/backend-federation-security/node");
|
|
34
|
+
const node_shared_js_namespaceObject = require("../backend-federation/node-shared.js");
|
|
34
35
|
const external_load_js_namespaceObject = require("./load.js");
|
|
35
|
-
function loadBackendFederatedEffectApiFromManifest(options) {
|
|
36
|
+
async function loadBackendFederatedEffectApiFromManifest(options) {
|
|
36
37
|
return (0, external_load_js_namespaceObject.loadBackendFederatedEffectApiFromManifest)({
|
|
37
38
|
...options,
|
|
39
|
+
shared: (0, node_shared_js_namespaceObject.withEffectBffHostShared)(options.shared),
|
|
38
40
|
entryPolicy: {
|
|
39
41
|
...options.entryPolicy,
|
|
40
42
|
evaluateCommonJs: options.entryPolicy?.evaluateCommonJs ?? node_namespaceObject.evaluateNodeBackendFederationCommonJs
|
|
@@ -30,8 +30,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
30
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
31
|
resolveBackendFederationRemoteFromManifest: ()=>resolveBackendFederationRemoteFromManifest
|
|
32
32
|
});
|
|
33
|
+
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
33
34
|
const backend_federation_security_namespaceObject = require("@modern-js/server-runtime-extensions/backend-federation-security");
|
|
34
|
-
const universal_namespaceObject = require("@modern-js/utils/universal");
|
|
35
35
|
const index_js_namespaceObject = require("../backend-federation/index.js");
|
|
36
36
|
const external_errors_js_namespaceObject = require("./errors.js");
|
|
37
37
|
const external_metadata_js_namespaceObject = require("./metadata.js");
|
|
@@ -44,7 +44,7 @@ function resolveBackendFederationRemoteFromManifest(manifest, remoteOverride = {
|
|
|
44
44
|
const manifestEntryUrl = (0, external_metadata_js_namespaceObject.stringValue)(backendFederation?.containerEntry) ?? (0, external_metadata_js_namespaceObject.stringValue)(entry?.url) ?? (0, external_metadata_js_namespaceObject.resolveRemoteEntryFromMetadata)(manifest);
|
|
45
45
|
const remoteEntryUrl = remoteOverride.entry ?? manifestEntryUrl;
|
|
46
46
|
const remoteType = remoteOverride.type ?? (0, external_metadata_js_namespaceObject.stringValue)(backendFederation?.remoteType) ?? (0, external_metadata_js_namespaceObject.stringValue)(entry?.type) ?? (0, external_metadata_js_namespaceObject.stringValue)(remoteEntry?.type) ?? 'module';
|
|
47
|
-
const expose = remoteOverride.expose ?? (0,
|
|
47
|
+
const expose = remoteOverride.expose ?? (0, backend_federation_contracts_namespaceObject.backendFederationExposeNames)(backendFederation)[0] ?? index_js_namespaceObject.BACKEND_FEDERATION_EFFECT_EXPOSE;
|
|
48
48
|
let verification;
|
|
49
49
|
try {
|
|
50
50
|
const manifestVerification = (0, backend_federation_security_namespaceObject.resolveBackendFederationRemoteEntryVerification)(manifest);
|
|
@@ -63,13 +63,7 @@ function resolveBackendFederationRemoteFromManifest(manifest, remoteOverride = {
|
|
|
63
63
|
...verification ? {
|
|
64
64
|
verification
|
|
65
65
|
} : {},
|
|
66
|
-
|
|
67
|
-
entryGlobalName: remoteOverride.entryGlobalName
|
|
68
|
-
} : {},
|
|
69
|
-
expose,
|
|
70
|
-
...remoteOverride.shareScope ? {
|
|
71
|
-
shareScope: remoteOverride.shareScope
|
|
72
|
-
} : {}
|
|
66
|
+
expose
|
|
73
67
|
};
|
|
74
68
|
}
|
|
75
69
|
exports.resolveBackendFederationRemoteFromManifest = __webpack_exports__.resolveBackendFederationRemoteFromManifest;
|
|
@@ -32,8 +32,9 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
32
32
|
validateBackendFederationManifest: ()=>validateBackendFederationManifest,
|
|
33
33
|
validateLoadedBackendFederationContract: ()=>validateLoadedBackendFederationContract
|
|
34
34
|
});
|
|
35
|
-
const
|
|
35
|
+
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
36
36
|
const index_js_namespaceObject = require("../backend-federation/index.js");
|
|
37
|
+
const identity_js_namespaceObject = require("../backend-federation/identity.js");
|
|
37
38
|
const external_errors_js_namespaceObject = require("./errors.js");
|
|
38
39
|
const external_metadata_js_namespaceObject = require("./metadata.js");
|
|
39
40
|
function resolveExpectedBuildMarker(expected) {
|
|
@@ -48,12 +49,11 @@ function validateBackendFederationManifest(manifest, expected = {}) {
|
|
|
48
49
|
const expectedBuildMarker = resolveExpectedBuildMarker(expected);
|
|
49
50
|
const backendFederation = (0, external_metadata_js_namespaceObject.backendFederationMetadata)(manifest);
|
|
50
51
|
(0, external_errors_js_namespaceObject.assertManifestAdapter)(backendFederation, 'manifest_invalid', '[BFF][Effect] Backend federation manifest must declare backendFederation metadata.');
|
|
51
|
-
const manifestShape = (0,
|
|
52
|
+
const manifestShape = (0, backend_federation_contracts_namespaceObject.validateBackendFederationManifest)(manifest, {
|
|
52
53
|
expectedContractVersion: false,
|
|
53
|
-
expectedNodeAdapterVersion: false
|
|
54
|
-
validateDeliveryUnit: false
|
|
54
|
+
expectedNodeAdapterVersion: false
|
|
55
55
|
});
|
|
56
|
-
(0, external_errors_js_namespaceObject.assertManifestAdapter)(manifestShape.ok, 'manifest_invalid', `[BFF][Effect] Backend federation manifest schema invalid: ${(0,
|
|
56
|
+
(0, external_errors_js_namespaceObject.assertManifestAdapter)(manifestShape.ok, 'manifest_invalid', `[BFF][Effect] Backend federation manifest schema invalid: ${(0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(manifestShape.errors)}.`);
|
|
57
57
|
(0, external_errors_js_namespaceObject.assertManifestAdapter)('effect' === backendFederation.runtimeFramework, 'strict_effect_required', '[BFF][Effect] Backend federation manifest must declare runtimeFramework: "effect".');
|
|
58
58
|
(0, external_errors_js_namespaceObject.assertManifestAdapter)(true === backendFederation.strictEffectApproach, 'strict_effect_required', '[BFF][Effect] Backend federation manifest must declare strictEffectApproach: true.');
|
|
59
59
|
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(backendFederation.contractVersion), expected.contractVersion ?? index_js_namespaceObject.BACKEND_FEDERATION_CONTRACT_VERSION, 'manifest contractVersion');
|
|
@@ -69,6 +69,7 @@ function validateBackendFederationManifest(manifest, expected = {}) {
|
|
|
69
69
|
(0, external_errors_js_namespaceObject.assertConsistentValue)((0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.buildMarker), (0, external_metadata_js_namespaceObject.stringValue)(boundary?.buildVersion), 'versionBoundary.deliveryUnit.buildMarker vs versionBoundary.buildVersion');
|
|
70
70
|
(0, external_errors_js_namespaceObject.assertConsistentValue)((0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.top?.unitId), (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.unitId), 'backendFederation.deliveryUnit.unitId vs versionBoundary.deliveryUnit.unitId');
|
|
71
71
|
const manifestUnitId = (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.unitId) ?? (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.top?.unitId);
|
|
72
|
+
(0, external_errors_js_namespaceObject.assertManifestAdapter)(manifestUnitId && (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.buildMarker), 'manifest_invalid', 'Backend federation manifest requires delivery-unit unitId and buildMarker.');
|
|
72
73
|
(0, external_errors_js_namespaceObject.assertVersionValue)(manifestUnitId, expected.unitId, 'deliveryUnit.unitId');
|
|
73
74
|
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.buildMarker), expectedBuildMarker, 'deliveryUnit.buildMarker');
|
|
74
75
|
}
|
|
@@ -76,19 +77,22 @@ function validateLoadedBackendFederationContract(loaded, manifest, remote) {
|
|
|
76
77
|
const loadedContract = loaded.backendFederationContract;
|
|
77
78
|
const backendFederation = (0, external_metadata_js_namespaceObject.backendFederationMetadata)(manifest);
|
|
78
79
|
const boundary = (0, external_metadata_js_namespaceObject.versionBoundaryMetadata)(manifest);
|
|
79
|
-
const compatibility = (0,
|
|
80
|
+
const compatibility = (0, identity_js_namespaceObject.backendFederationCompatibility)(loaded);
|
|
80
81
|
(0, external_errors_js_namespaceObject.assertManifestAdapter)(compatibility, 'version_mismatch', `[BFF][Effect] Backend federation expose ${remote.name}/${remote.expose?.replace(/^\.\//u, '')} must declare compatibility metadata.`);
|
|
81
82
|
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(loadedContract?.role), 'microvertical-server', 'expose role');
|
|
82
83
|
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(loadedContract?.name), remote.name, 'expose name');
|
|
83
|
-
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(compatibility.contractVersion), (0, external_metadata_js_namespaceObject.stringValue)(backendFederation?.contractVersion), 'expose contractVersion');
|
|
84
|
-
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(compatibility.nodeAdapterVersion), (0, external_metadata_js_namespaceObject.stringValue)(backendFederation?.nodeAdapterVersion), 'expose nodeAdapterVersion');
|
|
85
|
-
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(compatibility.packageName), (0, external_metadata_js_namespaceObject.stringValue)(boundary?.packageName), 'expose packageName');
|
|
86
|
-
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(compatibility.build), (0, external_metadata_js_namespaceObject.stringValue)(boundary?.buildVersion), 'expose buildVersion');
|
|
87
84
|
const deliveryUnit = (0, external_metadata_js_namespaceObject.manifestDeliveryUnit)(backendFederation, boundary);
|
|
88
85
|
const manifestUnitId = (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.unitId) ?? (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.top?.unitId);
|
|
89
86
|
const manifestBuildMarker = (0, external_metadata_js_namespaceObject.stringValue)(deliveryUnit.boundary?.buildMarker);
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
const issues = (0, identity_js_namespaceObject.validateBackendFederationCompatibility)(compatibility, {
|
|
88
|
+
contractVersion: (0, external_metadata_js_namespaceObject.stringValue)(backendFederation?.contractVersion),
|
|
89
|
+
nodeAdapterVersion: (0, external_metadata_js_namespaceObject.stringValue)(backendFederation?.nodeAdapterVersion),
|
|
90
|
+
packageName: (0, external_metadata_js_namespaceObject.stringValue)(boundary?.packageName),
|
|
91
|
+
unitId: manifestUnitId,
|
|
92
|
+
build: manifestBuildMarker ?? (0, external_metadata_js_namespaceObject.stringValue)(boundary?.buildVersion)
|
|
93
|
+
});
|
|
94
|
+
(0, external_errors_js_namespaceObject.assertVersionValue)((0, external_metadata_js_namespaceObject.stringValue)(compatibility.build), (0, external_metadata_js_namespaceObject.stringValue)(boundary?.buildVersion), 'expose buildVersion');
|
|
95
|
+
(0, external_errors_js_namespaceObject.assertManifestAdapter)(0 === issues.length, 'version_mismatch', `[BFF][Effect] ${(0, identity_js_namespaceObject.formatBackendFederationIdentityIssues)(issues)}.`);
|
|
92
96
|
}
|
|
93
97
|
function classifyLoadError(error) {
|
|
94
98
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -31,13 +31,13 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
checkCrossProjectPolicyForRequest: ()=>checkCrossProjectPolicyForRequest,
|
|
32
32
|
checkCrossProjectPolicyResponse: ()=>checkCrossProjectPolicyResponse
|
|
33
33
|
});
|
|
34
|
-
const
|
|
34
|
+
const bff_policy_namespaceObject = require("@modern-js/server-runtime-extensions/bff-policy");
|
|
35
35
|
const DENIAL_HEADERS = {
|
|
36
36
|
'content-type': 'application/json; charset=utf-8'
|
|
37
37
|
};
|
|
38
38
|
const checkCrossProjectPolicyResponse = (headers, policy, observedRequest)=>{
|
|
39
39
|
if (!policy?.enabled) return null;
|
|
40
|
-
const violation = (0,
|
|
40
|
+
const violation = (0, bff_policy_namespaceObject.evaluateCrossProjectPolicy)(headers, policy, observedRequest);
|
|
41
41
|
if (!violation) return null;
|
|
42
42
|
return new Response(JSON.stringify({
|
|
43
43
|
code: violation.code,
|
|
@@ -54,7 +54,7 @@ const checkCrossProjectPolicyForRequest = (request, policy)=>{
|
|
|
54
54
|
method: request.method,
|
|
55
55
|
pathname: new URL(request.url).pathname
|
|
56
56
|
};
|
|
57
|
-
const observedRequest = (0,
|
|
57
|
+
const observedRequest = (0, bff_policy_namespaceObject.resolveCrossProjectRequestObservation)(requestTarget, policy) ?? {
|
|
58
58
|
method: requestTarget.method,
|
|
59
59
|
routePath: requestTarget.pathname
|
|
60
60
|
};
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __webpack_require__ = {};
|
|
3
|
-
(()=>{
|
|
4
|
-
__webpack_require__.n = (module)=>{
|
|
5
|
-
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
-
__webpack_require__.d(getter, {
|
|
7
|
-
a: getter
|
|
8
|
-
});
|
|
9
|
-
return getter;
|
|
10
|
-
};
|
|
11
|
-
})();
|
|
12
3
|
(()=>{
|
|
13
4
|
__webpack_require__.d = (exports1, getters, values)=>{
|
|
14
5
|
var define = (defs, kind)=>{
|
|
@@ -39,32 +30,22 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
39
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
40
31
|
resolveAdapterCrossProjectPolicy: ()=>resolveAdapterCrossProjectPolicy
|
|
41
32
|
});
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
const bff_core_namespaceObject = require("@modern-js/bff-core");
|
|
46
|
-
const readNearestPackageVersion = (startDir)=>{
|
|
47
|
-
if (!startDir) return;
|
|
48
|
-
let current = external_node_path_default().resolve(startDir);
|
|
49
|
-
for(let depth = 0; depth < 10; depth += 1){
|
|
50
|
-
try {
|
|
51
|
-
const packageJson = JSON.parse((0, external_node_fs_namespaceObject.readFileSync)(external_node_path_default().join(current, 'package.json'), 'utf8'));
|
|
52
|
-
if ('string' == typeof packageJson.version) return packageJson.version;
|
|
53
|
-
} catch {}
|
|
54
|
-
const parent = external_node_path_default().dirname(current);
|
|
55
|
-
if (parent === current) break;
|
|
56
|
-
current = parent;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
const resolveAdapterCrossProjectPolicy = (api, handlers)=>{
|
|
33
|
+
require("@modern-js/server-runtime-extensions/server-config");
|
|
34
|
+
const node_namespaceObject = require("@modern-js/server-runtime-extensions/bff-policy/node");
|
|
35
|
+
const resolveAdapterCrossProjectPolicy = (api, handlers, producer)=>{
|
|
60
36
|
const bff = api.getServerConfig()?.bff;
|
|
61
37
|
const { apiDirectory, appDirectory } = api.getServerContext();
|
|
62
|
-
return (0,
|
|
38
|
+
return (0, node_namespaceObject.resolveCrossProjectPolicy)({
|
|
63
39
|
crossProjectPolicy: bff?.crossProjectPolicy,
|
|
64
40
|
handlers,
|
|
65
|
-
requestId: bff?.requestId,
|
|
66
41
|
isCrossProjectServer: bff?.isCrossProjectServer,
|
|
67
|
-
|
|
42
|
+
...producer ?? (0, node_namespaceObject.resolveOperationProducer)({
|
|
43
|
+
directories: [
|
|
44
|
+
apiDirectory,
|
|
45
|
+
appDirectory
|
|
46
|
+
],
|
|
47
|
+
requestId: bff?.requestId || 'default'
|
|
48
|
+
})
|
|
68
49
|
});
|
|
69
50
|
};
|
|
70
51
|
exports.resolveAdapterCrossProjectPolicy = __webpack_exports__.resolveAdapterCrossProjectPolicy;
|
package/dist/cjs/{backend-federation/legacy-warning.js → cross-project-policy/producer-runtime.js}
RENAMED
|
@@ -27,13 +27,31 @@ var __webpack_require__ = {};
|
|
|
27
27
|
})();
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
function createProducerClient(configure, { requestId }) {
|
|
31
|
+
return (options)=>configure({
|
|
32
|
+
requestId,
|
|
33
|
+
requireEnvelope: true,
|
|
34
|
+
...options,
|
|
35
|
+
identityBinding: {
|
|
36
|
+
enabled: true,
|
|
37
|
+
strict: true,
|
|
38
|
+
...options?.identityBinding
|
|
39
|
+
},
|
|
40
|
+
operationContract: {
|
|
41
|
+
enabled: true,
|
|
42
|
+
strict: true,
|
|
43
|
+
requireSchemaHash: true,
|
|
44
|
+
requireOperationVersion: true,
|
|
45
|
+
...options?.operationContract
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
50
|
+
createProducerClient: ()=>createProducerClient
|
|
33
51
|
});
|
|
34
|
-
exports.
|
|
52
|
+
exports.createProducerClient = __webpack_exports__.createProducerClient;
|
|
35
53
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
36
|
-
"
|
|
54
|
+
"createProducerClient"
|
|
37
55
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
38
56
|
Object.defineProperty(exports, '__esModule', {
|
|
39
57
|
value: true
|
|
@@ -28,13 +28,13 @@ var __webpack_require__ = {};
|
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
|
|
31
|
+
resolveEffectServerCrossProjectPolicy: ()=>resolveEffectServerCrossProjectPolicy
|
|
32
32
|
});
|
|
33
33
|
const effect_namespaceObject = require("@modern-js/bff-effect/effect");
|
|
34
34
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
35
35
|
const httpapi_namespaceObject = require("effect/unstable/httpapi");
|
|
36
36
|
const index_js_namespaceObject = require("../cross-project-policy/index.js");
|
|
37
|
-
function
|
|
37
|
+
function resolveEffectServerCrossProjectPolicy(api, prefix, mod, producer) {
|
|
38
38
|
const contractSourcesPromise = null === mod ? Promise.resolve([]) : Promise.resolve().then(()=>(0, effect_namespaceObject.extractHttpApiFromModule)(mod, httpapi_namespaceObject.HttpApi.isHttpApi)).then((effectApi)=>{
|
|
39
39
|
if (null === effectApi) return [];
|
|
40
40
|
const reflect = (apiValue, handlers)=>{
|
|
@@ -50,14 +50,14 @@ function resolveEffectAdapterCrossProjectPolicy(api, prefix, mod) {
|
|
|
50
50
|
return [];
|
|
51
51
|
});
|
|
52
52
|
return contractSourcesPromise.then((contractSources)=>{
|
|
53
|
-
const policy = (0, index_js_namespaceObject.resolveAdapterCrossProjectPolicy)(api, contractSources);
|
|
53
|
+
const policy = (0, index_js_namespaceObject.resolveAdapterCrossProjectPolicy)(api, contractSources, producer);
|
|
54
54
|
if (policy?.enabled === true && 0 === contractSources.length) utils_namespaceObject.logger.warn('[BFF][Effect] Cross-project policy enabled but no HttpApi endpoints could be reflected; requests fail operation-contract matching unless allowUnknownOperations is enabled.');
|
|
55
55
|
return policy;
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
-
exports.
|
|
58
|
+
exports.resolveEffectServerCrossProjectPolicy = __webpack_exports__.resolveEffectServerCrossProjectPolicy;
|
|
59
59
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
60
|
-
"
|
|
60
|
+
"resolveEffectServerCrossProjectPolicy"
|
|
61
61
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
62
62
|
Object.defineProperty(exports, '__esModule', {
|
|
63
63
|
value: true
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
14
|
+
var define = (defs, kind)=>{
|
|
15
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
[kind]: defs[key]
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
define(getters, "get");
|
|
21
|
+
define(values, "value");
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
(()=>{
|
|
25
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
26
|
+
})();
|
|
27
|
+
(()=>{
|
|
28
|
+
__webpack_require__.r = (exports1)=>{
|
|
29
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
30
|
+
value: 'Module'
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
33
|
+
value: true
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
var __webpack_exports__ = {};
|
|
38
|
+
__webpack_require__.r(__webpack_exports__);
|
|
39
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
40
|
+
resolveEffectServerEntryFile: ()=>resolveEffectServerEntryFile
|
|
41
|
+
});
|
|
42
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
43
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
44
|
+
require("@modern-js/server-runtime-extensions/server-config");
|
|
45
|
+
const utils_namespaceObject = require("@modern-js/utils");
|
|
46
|
+
const paths_js_namespaceObject = require("../effect-source-loader/paths.js");
|
|
47
|
+
function resolveEffectServerEntryFile(api) {
|
|
48
|
+
const { appDirectory, apiDirectory, distDirectory } = api.getServerContext();
|
|
49
|
+
const appDir = external_node_path_default().resolve(appDirectory || process.cwd());
|
|
50
|
+
return (0, paths_js_namespaceObject.resolveEffectEntry)({
|
|
51
|
+
appDir,
|
|
52
|
+
apiDir: external_node_path_default().resolve(appDir, apiDirectory || utils_namespaceObject.API_DIR),
|
|
53
|
+
effectEntry: api.getServerConfig()?.bff?.effect?.entry,
|
|
54
|
+
distDir: (0, utils_namespaceObject.isProd)() && distDirectory ? external_node_path_default().resolve(distDirectory) : void 0
|
|
55
|
+
}).path;
|
|
56
|
+
}
|
|
57
|
+
exports.resolveEffectServerEntryFile = __webpack_exports__.resolveEffectServerEntryFile;
|
|
58
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
59
|
+
"resolveEffectServerEntryFile"
|
|
60
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
61
|
+
Object.defineProperty(exports, '__esModule', {
|
|
62
|
+
value: true
|
|
63
|
+
});
|
|
@@ -28,11 +28,11 @@ var __webpack_require__ = {};
|
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
|
|
31
|
+
createEffectServerRuntimeErrorResponse: ()=>createEffectServerRuntimeErrorResponse
|
|
32
32
|
});
|
|
33
33
|
const safe_failure_namespaceObject = require("@modern-js/runtime-extensions/safe-failure");
|
|
34
34
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
35
|
-
function
|
|
35
|
+
function createEffectServerRuntimeErrorResponse(api, error, context) {
|
|
36
36
|
try {
|
|
37
37
|
const onError = api.getServerConfig()?.onError;
|
|
38
38
|
if (void 0 !== onError) return Promise.resolve(onError(error instanceof Error ? error : new Error(String(error)), ensureJsonContext(context))).then((result)=>result instanceof Response ? result : (0, safe_failure_namespaceObject.createSafeFailureResponse)(error)).catch((configError)=>{
|
|
@@ -66,9 +66,9 @@ function ensureJsonContext(context) {
|
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
exports.
|
|
69
|
+
exports.createEffectServerRuntimeErrorResponse = __webpack_exports__.createEffectServerRuntimeErrorResponse;
|
|
70
70
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
71
|
-
"
|
|
71
|
+
"createEffectServerRuntimeErrorResponse"
|
|
72
72
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
73
73
|
Object.defineProperty(exports, '__esModule', {
|
|
74
74
|
value: true
|