@bleedingdev/modern-js-plugin-bff 3.2.0-ultramodern.12 → 3.2.0-ultramodern.121
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/dist/cjs/cli.js +9 -5
- package/dist/cjs/constants.js +13 -9
- package/dist/cjs/index.js +9 -5
- package/dist/cjs/loader.js +32 -5
- package/dist/cjs/runtime/create-request/index.js +9 -5
- package/dist/cjs/runtime/data-platform/index.js +50 -26
- package/dist/cjs/runtime/effect/adapter.js +99 -93
- package/dist/cjs/runtime/effect/context.js +19 -7
- package/dist/cjs/runtime/effect/edge.js +169 -0
- package/dist/cjs/runtime/effect/endpoint-contracts.js +130 -0
- package/dist/cjs/runtime/effect/handler.js +642 -0
- package/dist/cjs/runtime/effect/index.js +30 -547
- package/dist/cjs/runtime/effect/module.js +151 -0
- package/dist/cjs/runtime/effect/operation-context.js +103 -0
- package/dist/cjs/runtime/effect-client/index.js +22 -6
- package/dist/cjs/runtime/effect-client/runtime.js +266 -0
- package/dist/cjs/runtime/hono/adapter.js +30 -14
- package/dist/cjs/runtime/hono/index.js +9 -5
- package/dist/cjs/runtime/hono/operators.js +9 -5
- package/dist/cjs/runtime/safe-failure.js +83 -0
- package/dist/cjs/server.js +9 -5
- package/dist/cjs/utils/clientGenerator.js +13 -9
- package/dist/cjs/utils/createHonoRoutes.js +9 -5
- package/dist/cjs/utils/crossProjectApiPlugin.js +9 -5
- package/dist/cjs/utils/crossProjectServerPolicy.js +104 -0
- package/dist/cjs/utils/effectClientGenerator.js +116 -488
- package/dist/cjs/utils/pluginGenerator.js +9 -5
- package/dist/cjs/utils/runtimeGenerator.js +9 -5
- package/dist/esm/loader.mjs +23 -0
- package/dist/esm/runtime/data-platform/index.mjs +33 -22
- package/dist/esm/runtime/effect/adapter.mjs +91 -89
- package/dist/esm/runtime/effect/context.mjs +3 -1
- package/dist/esm/runtime/effect/edge.mjs +83 -0
- package/dist/esm/runtime/effect/endpoint-contracts.mjs +68 -0
- package/dist/esm/runtime/effect/handler.mjs +470 -0
- package/dist/esm/runtime/effect/index.mjs +3 -437
- package/dist/esm/runtime/effect/module.mjs +113 -0
- package/dist/esm/runtime/effect/operation-context.mjs +65 -0
- package/dist/esm/runtime/effect-client/index.mjs +14 -2
- package/dist/esm/runtime/effect-client/runtime.mjs +228 -0
- package/dist/esm/runtime/hono/adapter.mjs +21 -9
- package/dist/esm/runtime/safe-failure.mjs +45 -0
- package/dist/esm/utils/clientGenerator.mjs +5 -5
- package/dist/esm/utils/crossProjectServerPolicy.mjs +50 -0
- package/dist/esm/utils/effectClientGenerator.mjs +105 -484
- package/dist/esm-node/loader.mjs +23 -0
- package/dist/esm-node/runtime/data-platform/index.mjs +33 -22
- package/dist/esm-node/runtime/effect/adapter.mjs +91 -89
- package/dist/esm-node/runtime/effect/context.mjs +3 -1
- package/dist/esm-node/runtime/effect/edge.mjs +84 -0
- package/dist/esm-node/runtime/effect/endpoint-contracts.mjs +69 -0
- package/dist/esm-node/runtime/effect/handler.mjs +471 -0
- package/dist/esm-node/runtime/effect/index.mjs +3 -437
- package/dist/esm-node/runtime/effect/module.mjs +114 -0
- package/dist/esm-node/runtime/effect/operation-context.mjs +66 -0
- package/dist/esm-node/runtime/effect-client/index.mjs +14 -2
- package/dist/esm-node/runtime/effect-client/runtime.mjs +229 -0
- package/dist/esm-node/runtime/hono/adapter.mjs +21 -9
- package/dist/esm-node/runtime/safe-failure.mjs +46 -0
- package/dist/esm-node/utils/clientGenerator.mjs +5 -5
- package/dist/esm-node/utils/crossProjectServerPolicy.mjs +52 -0
- package/dist/esm-node/utils/effectClientGenerator.mjs +105 -484
- package/dist/types/runtime/create-request/index.d.ts +1 -0
- package/dist/types/runtime/data-platform/index.d.ts +4 -0
- package/dist/types/runtime/effect/adapter.d.ts +25 -0
- package/dist/types/runtime/effect/context.d.ts +3 -6
- package/dist/types/runtime/effect/edge.d.ts +25 -0
- package/dist/types/runtime/effect/endpoint-contracts.d.ts +62 -0
- package/dist/types/runtime/effect/handler.d.ts +203 -0
- package/dist/types/runtime/effect/index.d.ts +2 -170
- package/dist/types/runtime/effect/module.d.ts +48 -0
- package/dist/types/runtime/effect/operation-context.d.ts +10 -0
- package/dist/types/runtime/effect-client/index.d.ts +6 -1
- package/dist/types/runtime/effect-client/runtime.d.ts +71 -0
- package/dist/types/runtime/hono/adapter.d.ts +3 -0
- package/dist/types/runtime/safe-failure.d.ts +1 -0
- package/dist/types/utils/createHonoRoutes.d.ts +3 -3
- package/dist/types/utils/crossProjectServerPolicy.d.ts +35 -0
- package/dist/types/utils/effectClientGenerator.d.ts +16 -2
- package/package.json +41 -20
package/dist/cjs/cli.js
CHANGED
|
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
|
|
|
10
10
|
};
|
|
11
11
|
})();
|
|
12
12
|
(()=>{
|
|
13
|
-
__webpack_require__.d = (exports1,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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");
|
|
18
22
|
};
|
|
19
23
|
})();
|
|
20
24
|
(()=>{
|
package/dist/cjs/constants.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __webpack_require__ = {};
|
|
3
3
|
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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");
|
|
9
13
|
};
|
|
10
14
|
})();
|
|
11
15
|
(()=>{
|
|
@@ -23,10 +27,6 @@ var __webpack_require__ = {};
|
|
|
23
27
|
})();
|
|
24
28
|
var __webpack_exports__ = {};
|
|
25
29
|
__webpack_require__.r(__webpack_exports__);
|
|
26
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
-
API_APP_NAME: ()=>API_APP_NAME,
|
|
28
|
-
BUILD_FILES: ()=>BUILD_FILES
|
|
29
|
-
});
|
|
30
30
|
const API_APP_NAME = '_app';
|
|
31
31
|
const BUILD_FILES = [
|
|
32
32
|
'**/*.[tj]sx?',
|
|
@@ -37,6 +37,10 @@ const BUILD_FILES = [
|
|
|
37
37
|
'!__tests__/*.tsx?',
|
|
38
38
|
'!__tests__/*.jsx?'
|
|
39
39
|
];
|
|
40
|
+
__webpack_require__.d(__webpack_exports__, {}, {
|
|
41
|
+
API_APP_NAME: API_APP_NAME,
|
|
42
|
+
BUILD_FILES: BUILD_FILES
|
|
43
|
+
});
|
|
40
44
|
exports.API_APP_NAME = __webpack_exports__.API_APP_NAME;
|
|
41
45
|
exports.BUILD_FILES = __webpack_exports__.BUILD_FILES;
|
|
42
46
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
package/dist/cjs/index.js
CHANGED
|
@@ -24,11 +24,15 @@ function __webpack_require__(moduleId) {
|
|
|
24
24
|
};
|
|
25
25
|
})();
|
|
26
26
|
(()=>{
|
|
27
|
-
__webpack_require__.d = (exports1,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
28
|
+
var define = (defs, kind)=>{
|
|
29
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
[kind]: defs[key]
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
define(getters, "get");
|
|
35
|
+
define(values, "value");
|
|
32
36
|
};
|
|
33
37
|
})();
|
|
34
38
|
(()=>{
|
package/dist/cjs/loader.js
CHANGED
|
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
|
|
|
10
10
|
};
|
|
11
11
|
})();
|
|
12
12
|
(()=>{
|
|
13
|
-
__webpack_require__.d = (exports1,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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");
|
|
18
22
|
};
|
|
19
23
|
})();
|
|
20
24
|
(()=>{
|
|
@@ -40,6 +44,24 @@ const utils_namespaceObject = require("@modern-js/utils");
|
|
|
40
44
|
const external_path_namespaceObject = require("path");
|
|
41
45
|
var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
|
|
42
46
|
const effectClientGenerator_js_namespaceObject = require("./utils/effectClientGenerator.js");
|
|
47
|
+
async function transformEffectRuntimeSource(source, filename) {
|
|
48
|
+
const swc = await import("@swc/core");
|
|
49
|
+
const result = await swc.transform(source, {
|
|
50
|
+
filename,
|
|
51
|
+
sourceMaps: false,
|
|
52
|
+
jsc: {
|
|
53
|
+
parser: {
|
|
54
|
+
syntax: "typescript",
|
|
55
|
+
tsx: filename.endsWith('.tsx') || filename.endsWith('.jsx')
|
|
56
|
+
},
|
|
57
|
+
target: 'es2022'
|
|
58
|
+
},
|
|
59
|
+
module: {
|
|
60
|
+
type: 'es6'
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return result.code;
|
|
64
|
+
}
|
|
43
65
|
async function loader(source) {
|
|
44
66
|
this.cacheable();
|
|
45
67
|
const { resourcePath } = this;
|
|
@@ -51,6 +73,11 @@ async function loader(source) {
|
|
|
51
73
|
apiDir: draftOptions.apiDir,
|
|
52
74
|
effectEntry: draftOptions.effectEntry
|
|
53
75
|
});
|
|
76
|
+
if ('effect' === draftOptions.bffRuntimeFramework && effectEntryFile && external_path_default().resolve(effectEntryFile) === external_path_default().resolve(resourcePath) && this.resourceQuery.includes('modern-bff-runtime')) {
|
|
77
|
+
const code = await transformEffectRuntimeSource(source, resourcePath);
|
|
78
|
+
callback(void 0, code);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
54
81
|
if ('effect' === draftOptions.bffRuntimeFramework && effectEntryFile && external_path_default().resolve(effectEntryFile) === external_path_default().resolve(resourcePath)) {
|
|
55
82
|
const code = await (0, effectClientGenerator_js_namespaceObject.generateEffectClientCode)({
|
|
56
83
|
appDir: draftOptions.appDir,
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __webpack_require__ = {};
|
|
3
3
|
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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");
|
|
9
13
|
};
|
|
10
14
|
})();
|
|
11
15
|
(()=>{
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __webpack_require__ = {};
|
|
3
3
|
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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");
|
|
9
13
|
};
|
|
10
14
|
})();
|
|
11
15
|
(()=>{
|
|
@@ -24,18 +28,21 @@ var __webpack_require__ = {};
|
|
|
24
28
|
var __webpack_exports__ = {};
|
|
25
29
|
__webpack_require__.r(__webpack_exports__);
|
|
26
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
+
DATA_BATCH_TRANSPORT_OTEL_EVENT: ()=>DATA_BATCH_TRANSPORT_OTEL_EVENT,
|
|
27
32
|
DEFAULT_DATA_BATCH_ENDPOINT: ()=>DEFAULT_DATA_BATCH_ENDPOINT,
|
|
28
33
|
DEFAULT_DATA_BATCH_HEADER: ()=>DEFAULT_DATA_BATCH_HEADER,
|
|
29
34
|
DEFAULT_DATA_ENVELOPE_HEADER: ()=>DEFAULT_DATA_ENVELOPE_HEADER,
|
|
30
35
|
buildQueryKey: ()=>buildQueryKey,
|
|
31
36
|
buildScopeKey: ()=>buildScopeKey,
|
|
32
37
|
createDataBatchTransport: ()=>createDataBatchTransport,
|
|
38
|
+
createDataBatchTransportTelemetryAttributes: ()=>createDataBatchTransportTelemetryAttributes,
|
|
33
39
|
createHydrationEnvelope: ()=>createHydrationEnvelope,
|
|
34
40
|
createInvalidationEvent: ()=>createInvalidationEvent,
|
|
35
41
|
createOperationId: ()=>createOperationId,
|
|
36
42
|
createRequestEnvelope: ()=>createRequestEnvelope,
|
|
37
43
|
decodeRequestEnvelopeHeader: ()=>decodeRequestEnvelopeHeader,
|
|
38
44
|
deriveChildTraceContext: ()=>deriveChildTraceContext,
|
|
45
|
+
emitDataBatchTransportEvent: ()=>emitDataBatchTransportEvent,
|
|
39
46
|
encodeRequestEnvelopeHeader: ()=>encodeRequestEnvelopeHeader,
|
|
40
47
|
formatTraceparentHeader: ()=>formatTraceparentHeader,
|
|
41
48
|
normalizeOrigin: ()=>normalizeOrigin,
|
|
@@ -46,10 +53,32 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
46
53
|
validateRequestEnvelope: ()=>validateRequestEnvelope,
|
|
47
54
|
validateSelectionPlan: ()=>validateSelectionPlan
|
|
48
55
|
});
|
|
56
|
+
const create_request_namespaceObject = require("@modern-js/create-request");
|
|
57
|
+
const api_namespaceObject = require("@opentelemetry/api");
|
|
58
|
+
const DATA_BATCH_TRANSPORT_OTEL_EVENT = 'modernjs.data.batch';
|
|
59
|
+
function createDataBatchTransportTelemetryAttributes(event) {
|
|
60
|
+
return {
|
|
61
|
+
'modernjs.data.batch.type': event.type,
|
|
62
|
+
'modernjs.data.batch.endpoint': event.endpoint,
|
|
63
|
+
'modernjs.data.batch.degraded': 'fallback' === event.type || 'disable' === event.type,
|
|
64
|
+
...event.batchId ? {
|
|
65
|
+
'modernjs.data.batch.id': event.batchId
|
|
66
|
+
} : {},
|
|
67
|
+
...'number' == typeof event.size ? {
|
|
68
|
+
'modernjs.data.batch.size': event.size
|
|
69
|
+
} : {},
|
|
70
|
+
...event.reason ? {
|
|
71
|
+
'modernjs.data.batch.reason': event.reason
|
|
72
|
+
} : {}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function emitDataBatchTransportEvent(onEvent, event) {
|
|
76
|
+
onEvent?.(event);
|
|
77
|
+
api_namespaceObject.trace.getActiveSpan()?.addEvent(DATA_BATCH_TRANSPORT_OTEL_EVENT, createDataBatchTransportTelemetryAttributes(event));
|
|
78
|
+
}
|
|
49
79
|
const DEFAULT_DATA_ENVELOPE_HEADER = 'x-modernjs-data-envelope';
|
|
50
80
|
const DEFAULT_DATA_BATCH_ENDPOINT = '/_data/batch';
|
|
51
81
|
const DEFAULT_DATA_BATCH_HEADER = 'x-modernjs-data-batch';
|
|
52
|
-
const TRACEPARENT_REGEX = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/i;
|
|
53
82
|
function isPlainObject(value) {
|
|
54
83
|
if ('object' != typeof value || null === value || Array.isArray(value)) return false;
|
|
55
84
|
const proto = Object.getPrototypeOf(value);
|
|
@@ -146,18 +175,7 @@ function isValidHex(value, length) {
|
|
|
146
175
|
return value.length === length && /^[0-9a-f]+$/.test(value);
|
|
147
176
|
}
|
|
148
177
|
function parseTraceparentHeader(header) {
|
|
149
|
-
|
|
150
|
-
if (!match) return null;
|
|
151
|
-
const traceId = match[1].toLowerCase();
|
|
152
|
-
const spanId = match[2].toLowerCase();
|
|
153
|
-
const flags = match[3].toLowerCase();
|
|
154
|
-
if (isAllZeroHex(traceId) || isAllZeroHex(spanId)) return null;
|
|
155
|
-
const sampled = (0x1 & Number.parseInt(flags, 16)) === 1;
|
|
156
|
-
return {
|
|
157
|
-
traceId,
|
|
158
|
-
spanId,
|
|
159
|
-
sampled
|
|
160
|
-
};
|
|
178
|
+
return (0, create_request_namespaceObject.parseTraceparent)(header) ?? null;
|
|
161
179
|
}
|
|
162
180
|
function formatTraceparentHeader(trace) {
|
|
163
181
|
const traceId = trace.traceId.toLowerCase();
|
|
@@ -463,7 +481,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
463
481
|
bucket.items = [];
|
|
464
482
|
bucket.bytes = 0;
|
|
465
483
|
if (1 === items.length || disabledEndpoints.has(endpoint)) {
|
|
466
|
-
onEvent
|
|
484
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
467
485
|
type: disabledEndpoints.has(endpoint) ? 'fallback' : 'flush',
|
|
468
486
|
endpoint,
|
|
469
487
|
size: items.length,
|
|
@@ -480,7 +498,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
480
498
|
sentAt: Date.now(),
|
|
481
499
|
items: items.map((item)=>item.item)
|
|
482
500
|
};
|
|
483
|
-
onEvent
|
|
501
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
484
502
|
type: 'flush',
|
|
485
503
|
endpoint,
|
|
486
504
|
batchId,
|
|
@@ -507,7 +525,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
507
525
|
requestInit.signal = controller.signal;
|
|
508
526
|
timeoutHandle = setTimeout(()=>{
|
|
509
527
|
controller.abort();
|
|
510
|
-
onEvent
|
|
528
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
511
529
|
type: 'fallback',
|
|
512
530
|
endpoint,
|
|
513
531
|
batchId,
|
|
@@ -520,13 +538,13 @@ function createDataBatchTransport(options = {}) {
|
|
|
520
538
|
if (!response.ok) {
|
|
521
539
|
if (404 === response.status || 405 === response.status) {
|
|
522
540
|
disabledEndpoints.add(endpoint);
|
|
523
|
-
onEvent
|
|
541
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
524
542
|
type: 'disable',
|
|
525
543
|
endpoint,
|
|
526
544
|
batchId,
|
|
527
545
|
reason: `batch-endpoint-unavailable-${String(response.status)}`
|
|
528
546
|
});
|
|
529
|
-
} else onEvent
|
|
547
|
+
} else emitDataBatchTransportEvent(onEvent, {
|
|
530
548
|
type: 'fallback',
|
|
531
549
|
endpoint,
|
|
532
550
|
batchId,
|
|
@@ -539,7 +557,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
539
557
|
}
|
|
540
558
|
const result = await response.json();
|
|
541
559
|
if (!isBatchResponsePayload(result)) {
|
|
542
|
-
onEvent
|
|
560
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
543
561
|
type: 'fallback',
|
|
544
562
|
endpoint,
|
|
545
563
|
batchId,
|
|
@@ -562,7 +580,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
562
580
|
return parseResponseLikeCreateRequest(reconstructedResponse);
|
|
563
581
|
});
|
|
564
582
|
} catch (error) {
|
|
565
|
-
onEvent
|
|
583
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
566
584
|
type: 'fallback',
|
|
567
585
|
endpoint,
|
|
568
586
|
batchId,
|
|
@@ -629,7 +647,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
629
647
|
};
|
|
630
648
|
bucket.items.push(queued);
|
|
631
649
|
bucket.bytes += size;
|
|
632
|
-
onEvent
|
|
650
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
633
651
|
type: 'enqueue',
|
|
634
652
|
endpoint,
|
|
635
653
|
size: bucket.items.length
|
|
@@ -644,18 +662,21 @@ function createDataBatchTransport(options = {}) {
|
|
|
644
662
|
return promise;
|
|
645
663
|
};
|
|
646
664
|
}
|
|
665
|
+
exports.DATA_BATCH_TRANSPORT_OTEL_EVENT = __webpack_exports__.DATA_BATCH_TRANSPORT_OTEL_EVENT;
|
|
647
666
|
exports.DEFAULT_DATA_BATCH_ENDPOINT = __webpack_exports__.DEFAULT_DATA_BATCH_ENDPOINT;
|
|
648
667
|
exports.DEFAULT_DATA_BATCH_HEADER = __webpack_exports__.DEFAULT_DATA_BATCH_HEADER;
|
|
649
668
|
exports.DEFAULT_DATA_ENVELOPE_HEADER = __webpack_exports__.DEFAULT_DATA_ENVELOPE_HEADER;
|
|
650
669
|
exports.buildQueryKey = __webpack_exports__.buildQueryKey;
|
|
651
670
|
exports.buildScopeKey = __webpack_exports__.buildScopeKey;
|
|
652
671
|
exports.createDataBatchTransport = __webpack_exports__.createDataBatchTransport;
|
|
672
|
+
exports.createDataBatchTransportTelemetryAttributes = __webpack_exports__.createDataBatchTransportTelemetryAttributes;
|
|
653
673
|
exports.createHydrationEnvelope = __webpack_exports__.createHydrationEnvelope;
|
|
654
674
|
exports.createInvalidationEvent = __webpack_exports__.createInvalidationEvent;
|
|
655
675
|
exports.createOperationId = __webpack_exports__.createOperationId;
|
|
656
676
|
exports.createRequestEnvelope = __webpack_exports__.createRequestEnvelope;
|
|
657
677
|
exports.decodeRequestEnvelopeHeader = __webpack_exports__.decodeRequestEnvelopeHeader;
|
|
658
678
|
exports.deriveChildTraceContext = __webpack_exports__.deriveChildTraceContext;
|
|
679
|
+
exports.emitDataBatchTransportEvent = __webpack_exports__.emitDataBatchTransportEvent;
|
|
659
680
|
exports.encodeRequestEnvelopeHeader = __webpack_exports__.encodeRequestEnvelopeHeader;
|
|
660
681
|
exports.formatTraceparentHeader = __webpack_exports__.formatTraceparentHeader;
|
|
661
682
|
exports.normalizeOrigin = __webpack_exports__.normalizeOrigin;
|
|
@@ -666,18 +687,21 @@ exports.validateHydrationEnvelope = __webpack_exports__.validateHydrationEnvelop
|
|
|
666
687
|
exports.validateRequestEnvelope = __webpack_exports__.validateRequestEnvelope;
|
|
667
688
|
exports.validateSelectionPlan = __webpack_exports__.validateSelectionPlan;
|
|
668
689
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
690
|
+
"DATA_BATCH_TRANSPORT_OTEL_EVENT",
|
|
669
691
|
"DEFAULT_DATA_BATCH_ENDPOINT",
|
|
670
692
|
"DEFAULT_DATA_BATCH_HEADER",
|
|
671
693
|
"DEFAULT_DATA_ENVELOPE_HEADER",
|
|
672
694
|
"buildQueryKey",
|
|
673
695
|
"buildScopeKey",
|
|
674
696
|
"createDataBatchTransport",
|
|
697
|
+
"createDataBatchTransportTelemetryAttributes",
|
|
675
698
|
"createHydrationEnvelope",
|
|
676
699
|
"createInvalidationEvent",
|
|
677
700
|
"createOperationId",
|
|
678
701
|
"createRequestEnvelope",
|
|
679
702
|
"decodeRequestEnvelopeHeader",
|
|
680
703
|
"deriveChildTraceContext",
|
|
704
|
+
"emitDataBatchTransportEvent",
|
|
681
705
|
"encodeRequestEnvelopeHeader",
|
|
682
706
|
"formatTraceparentHeader",
|
|
683
707
|
"normalizeOrigin",
|
|
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
|
|
|
10
10
|
};
|
|
11
11
|
})();
|
|
12
12
|
(()=>{
|
|
13
|
-
__webpack_require__.d = (exports1,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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");
|
|
18
22
|
};
|
|
19
23
|
})();
|
|
20
24
|
(()=>{
|
|
@@ -35,12 +39,16 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
35
39
|
__webpack_require__.d(__webpack_exports__, {
|
|
36
40
|
EffectAdapter: ()=>EffectAdapter
|
|
37
41
|
});
|
|
42
|
+
const bff_core_namespaceObject = require("@modern-js/bff-core");
|
|
38
43
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
39
44
|
const httpapi_namespaceObject = require("effect/unstable/httpapi");
|
|
40
45
|
const external_path_namespaceObject = require("path");
|
|
41
46
|
var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
|
|
47
|
+
const crossProjectServerPolicy_js_namespaceObject = require("../../utils/crossProjectServerPolicy.js");
|
|
48
|
+
const external_safe_failure_js_namespaceObject = require("../safe-failure.js");
|
|
42
49
|
const external_context_js_namespaceObject = require("./context.js");
|
|
43
|
-
const
|
|
50
|
+
const external_endpoint_contracts_js_namespaceObject = require("./endpoint-contracts.js");
|
|
51
|
+
const external_module_js_namespaceObject = require("./module.js");
|
|
44
52
|
const before = [
|
|
45
53
|
'custom-server-hook',
|
|
46
54
|
'custom-server-middleware',
|
|
@@ -73,24 +81,9 @@ function createRequestForMountedPrefix(req, prefix) {
|
|
|
73
81
|
url.pathname = nextPath;
|
|
74
82
|
return new Request(url, req);
|
|
75
83
|
}
|
|
76
|
-
function isRequestHandler(value) {
|
|
77
|
-
return 'function' == typeof value;
|
|
78
|
-
}
|
|
79
84
|
function maybeResponse(value) {
|
|
80
85
|
return value instanceof Response;
|
|
81
86
|
}
|
|
82
|
-
function isRecord(value) {
|
|
83
|
-
return 'object' == typeof value && null !== value;
|
|
84
|
-
}
|
|
85
|
-
function includesRuntimeExports(value) {
|
|
86
|
-
return 'api' in value || 'layer' in value || 'createHandler' in value || 'handler' in value;
|
|
87
|
-
}
|
|
88
|
-
function isHttpApiWithProps(value) {
|
|
89
|
-
return httpapi_namespaceObject.HttpApi.isHttpApi(value) && isRecord(value) && 'string' == typeof value.identifier && isRecord(value.groups);
|
|
90
|
-
}
|
|
91
|
-
function isEffectApiDefinition(module) {
|
|
92
|
-
return isHttpApiWithProps(module.api) && void 0 !== module.layer;
|
|
93
|
-
}
|
|
94
87
|
class EffectAdapter {
|
|
95
88
|
resolveEntryFile() {
|
|
96
89
|
const { appDirectory, apiDirectory } = this.api.getServerContext();
|
|
@@ -100,71 +93,77 @@ class EffectAdapter {
|
|
|
100
93
|
const entryWithoutExt = configuredEntry ? external_path_default().isAbsolute(configuredEntry) ? configuredEntry : external_path_default().resolve(appDirectory || process.cwd(), configuredEntry) : defaultEntry;
|
|
101
94
|
return (0, utils_namespaceObject.findExists)(JS_OR_TS_EXTS.map((ext)=>`${entryWithoutExt}${ext}`));
|
|
102
95
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
};
|
|
124
|
-
mergeRuntimeExports(out);
|
|
125
|
-
}
|
|
126
|
-
if (isRecord(entry)) normalizedModule = {
|
|
127
|
-
...normalizedModule,
|
|
128
|
-
...entry
|
|
129
|
-
};
|
|
130
|
-
if (isRecord(entry) && 'handler' in entry) {
|
|
131
|
-
const maybeHandler = entry.handler;
|
|
132
|
-
if (isRequestHandler(maybeHandler)) normalizedModule = {
|
|
133
|
-
...normalizedModule,
|
|
134
|
-
handler: maybeHandler
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
if (isRequestHandler(normalizedModule.handler)) return {
|
|
138
|
-
handler: normalizedModule.handler
|
|
139
|
-
};
|
|
140
|
-
if ('function' == typeof normalizedModule.createHandler) {
|
|
141
|
-
const webHandler = normalizedModule.createHandler({
|
|
142
|
-
openapi: this.api.getServerConfig()?.bff?.effect?.openapi,
|
|
143
|
-
dataPlatform: this.api.getServerConfig()?.bff?.effect?.dataPlatform
|
|
96
|
+
isApiRequestPath(requestPath, prefix, enableHandleWeb) {
|
|
97
|
+
if (!enableHandleWeb) return true;
|
|
98
|
+
const normalized = normalizePrefix(prefix);
|
|
99
|
+
if (!normalized) return true;
|
|
100
|
+
return requestPath === normalized || requestPath.startsWith(`${normalized}/`);
|
|
101
|
+
}
|
|
102
|
+
async collectLambdaContractSources() {
|
|
103
|
+
try {
|
|
104
|
+
const serverContext = this.api.getServerContext();
|
|
105
|
+
const appDir = serverContext.distDirectory || serverContext.appDirectory;
|
|
106
|
+
if (!appDir) return [];
|
|
107
|
+
const apiDir = 'string' == typeof serverContext.apiDirectory ? serverContext.apiDirectory : external_path_default().resolve(appDir, utils_namespaceObject.API_DIR);
|
|
108
|
+
const lambdaDir = 'string' == typeof serverContext.lambdaDirectory ? serverContext.lambdaDirectory : external_path_default().join(apiDir, 'lambda');
|
|
109
|
+
if (!await utils_namespaceObject.fs.pathExists(lambdaDir)) return [];
|
|
110
|
+
const apiRouter = new bff_core_namespaceObject.ApiRouter({
|
|
111
|
+
appDir,
|
|
112
|
+
apiDir,
|
|
113
|
+
lambdaDir,
|
|
114
|
+
prefix: this.prefix,
|
|
115
|
+
httpMethodDecider: this.api.getServerConfig()?.bff?.httpMethodDecider
|
|
144
116
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
117
|
+
const handlerInfos = await apiRouter.getApiHandlers();
|
|
118
|
+
return handlerInfos.map((info)=>({
|
|
119
|
+
name: info.name,
|
|
120
|
+
httpMethod: info.httpMethod,
|
|
121
|
+
routePath: info.routePath,
|
|
122
|
+
filename: info.filename,
|
|
123
|
+
handler: info.handler
|
|
124
|
+
}));
|
|
125
|
+
} catch (error) {
|
|
126
|
+
utils_namespaceObject.logger.warn(`[BFF][Effect] Failed to derive lambda operation contracts for the cross-project policy: ${String(error)}`);
|
|
127
|
+
return [];
|
|
151
128
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
};
|
|
129
|
+
}
|
|
130
|
+
async refreshCrossProjectPolicy(mod) {
|
|
131
|
+
let contractSources = [];
|
|
132
|
+
if (mod) try {
|
|
133
|
+
const api = await (0, external_endpoint_contracts_js_namespaceObject.extractHttpApiFromModule)(mod, httpapi_namespaceObject.HttpApi.isHttpApi);
|
|
134
|
+
if (api) {
|
|
135
|
+
const reflect = (apiValue, handlers)=>httpapi_namespaceObject.HttpApi.reflect(apiValue, {
|
|
136
|
+
onGroup: handlers.onGroup ?? (()=>{}),
|
|
137
|
+
onEndpoint: handlers.onEndpoint
|
|
138
|
+
});
|
|
139
|
+
contractSources = (0, external_endpoint_contracts_js_namespaceObject.toOperationContractSources)((0, external_endpoint_contracts_js_namespaceObject.collectEffectEndpoints)(reflect, api, this.prefix));
|
|
140
|
+
}
|
|
141
|
+
} catch (error) {
|
|
142
|
+
utils_namespaceObject.logger.warn(`[BFF][Effect] Failed to reflect HttpApi endpoints for the cross-project policy: ${String(error)}`);
|
|
166
143
|
}
|
|
167
|
-
|
|
144
|
+
let policy = (0, crossProjectServerPolicy_js_namespaceObject.resolveAdapterCrossProjectPolicy)(this.api, contractSources);
|
|
145
|
+
if (policy?.enabled) {
|
|
146
|
+
const lambdaSources = await this.collectLambdaContractSources();
|
|
147
|
+
if (lambdaSources.length > 0) {
|
|
148
|
+
contractSources = [
|
|
149
|
+
...contractSources,
|
|
150
|
+
...lambdaSources
|
|
151
|
+
];
|
|
152
|
+
policy = (0, crossProjectServerPolicy_js_namespaceObject.resolveAdapterCrossProjectPolicy)(this.api, contractSources);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
this.crossProjectPolicy = policy;
|
|
156
|
+
if (this.crossProjectPolicy?.enabled && 0 === contractSources.length) utils_namespaceObject.logger.warn('[BFF][Effect] Cross-project policy is enabled but no HttpApi endpoints could be reflected; operation-contract matching is disabled for this server (envelope and operation-context checks still apply).');
|
|
157
|
+
}
|
|
158
|
+
async loadEffectHandlerFromModule(mod) {
|
|
159
|
+
return (0, external_module_js_namespaceObject.resolveEffectBffModuleHandler)(mod, {
|
|
160
|
+
openapi: this.api.getServerConfig()?.bff?.effect?.openapi,
|
|
161
|
+
dataPlatform: this.api.getServerConfig()?.bff?.effect?.dataPlatform,
|
|
162
|
+
validateRequest: (request)=>(0, crossProjectServerPolicy_js_namespaceObject.checkCrossProjectPolicyForRequest)(request, this.crossProjectPolicy),
|
|
163
|
+
onWarning: (message)=>{
|
|
164
|
+
utils_namespaceObject.logger.warn(message);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
168
167
|
}
|
|
169
168
|
async reloadHandler() {
|
|
170
169
|
if (!this.isEffect) return;
|
|
@@ -190,6 +189,7 @@ class EffectAdapter {
|
|
|
190
189
|
this.handler = null;
|
|
191
190
|
return;
|
|
192
191
|
}
|
|
192
|
+
await this.refreshCrossProjectPolicy(mod);
|
|
193
193
|
const loaded = await this.loadEffectHandlerFromModule(mod);
|
|
194
194
|
if (!loaded) {
|
|
195
195
|
utils_namespaceObject.logger.warn(`[BFF][Effect] Invalid Effect entry module: ${entryFile}. Export { api, layer } or handler.`);
|
|
@@ -198,6 +198,7 @@ class EffectAdapter {
|
|
|
198
198
|
}
|
|
199
199
|
this.handler = loaded.handler;
|
|
200
200
|
this.dispose = loaded.dispose || null;
|
|
201
|
+
this.policyEnforcedInMiddleware = !loaded.appliesRequestValidator;
|
|
201
202
|
}
|
|
202
203
|
async disposeCurrentHandler() {
|
|
203
204
|
if (!this.dispose) return;
|
|
@@ -221,15 +222,7 @@ class EffectAdapter {
|
|
|
221
222
|
} catch (configError) {
|
|
222
223
|
utils_namespaceObject.logger.error(`Error in serverConfig.onError handler: ${configError}`);
|
|
223
224
|
}
|
|
224
|
-
|
|
225
|
-
return new Response(JSON.stringify({
|
|
226
|
-
message: error instanceof Error ? error.message : '[BFF] Internal Server Error'
|
|
227
|
-
}), {
|
|
228
|
-
status,
|
|
229
|
-
headers: {
|
|
230
|
-
'content-type': 'application/json; charset=utf-8'
|
|
231
|
-
}
|
|
232
|
-
});
|
|
225
|
+
return (0, external_safe_failure_js_namespaceObject.createSafeFailureResponse)(error);
|
|
233
226
|
}
|
|
234
227
|
ensureJsonContext(c) {
|
|
235
228
|
const maybeJsonContext = c;
|
|
@@ -256,6 +249,8 @@ class EffectAdapter {
|
|
|
256
249
|
this.effectMiddleware = null;
|
|
257
250
|
this.handler = null;
|
|
258
251
|
this.dispose = null;
|
|
252
|
+
this.prefix = '/api';
|
|
253
|
+
this.policyEnforcedInMiddleware = false;
|
|
259
254
|
this.registerMiddleware = async (options)=>{
|
|
260
255
|
const { prefix, enableHandleWeb } = options;
|
|
261
256
|
const { bffRuntimeFramework, middlewares: globalMiddlewares } = this.api.getServerContext();
|
|
@@ -263,6 +258,7 @@ class EffectAdapter {
|
|
|
263
258
|
this.isEffect = false;
|
|
264
259
|
return;
|
|
265
260
|
}
|
|
261
|
+
this.prefix = prefix || this.prefix;
|
|
266
262
|
await this.reloadHandler();
|
|
267
263
|
this.effectMiddleware = {
|
|
268
264
|
name: 'effect-bff-handler',
|
|
@@ -275,6 +271,10 @@ class EffectAdapter {
|
|
|
275
271
|
if (enableHandleWeb) return void await next();
|
|
276
272
|
return this.handleRuntimeError(new Error('[BFF][Effect] Missing Effect entry. Define api/effect/index or configure bff.effect.entry.'), c);
|
|
277
273
|
}
|
|
274
|
+
if (this.crossProjectPolicy?.enabled && this.policyEnforcedInMiddleware && this.isApiRequestPath(c.req.path, prefix, enableHandleWeb)) {
|
|
275
|
+
const denial = (0, crossProjectServerPolicy_js_namespaceObject.checkCrossProjectPolicyForRequest)(c.req.raw, this.crossProjectPolicy);
|
|
276
|
+
if (denial) return denial;
|
|
277
|
+
}
|
|
278
278
|
let response;
|
|
279
279
|
try {
|
|
280
280
|
const effectRequest = createRequestForMountedPrefix(c.req.raw, prefix);
|
|
@@ -282,7 +282,13 @@ class EffectAdapter {
|
|
|
282
282
|
request: effectRequest,
|
|
283
283
|
env: c.env,
|
|
284
284
|
path: c.req.path,
|
|
285
|
-
method: c.req.method
|
|
285
|
+
method: c.req.method,
|
|
286
|
+
operationContext: (0, external_context_js_namespaceObject.createEffectOperationContext)({
|
|
287
|
+
request: effectRequest,
|
|
288
|
+
env: c.env,
|
|
289
|
+
path: c.req.path,
|
|
290
|
+
method: c.req.method
|
|
291
|
+
})
|
|
286
292
|
};
|
|
287
293
|
response = await (0, external_context_js_namespaceObject.runWithEffectContext)(effectContext, ()=>this.handler.length > 1 ? this.handler(effectRequest, effectContext) : this.handler(effectRequest));
|
|
288
294
|
} catch (error) {
|