@bleedingdev/modern-js-plugin-bff 3.2.0-ultramodern.9 → 3.2.0-ultramodern.91
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/loader.js +23 -0
- package/dist/cjs/runtime/data-platform/index.js +39 -8
- package/dist/cjs/runtime/effect/adapter.js +15 -82
- package/dist/cjs/runtime/effect/context.js +10 -2
- package/dist/cjs/runtime/effect/edge.js +169 -0
- package/dist/cjs/runtime/effect/handler.js +598 -0
- package/dist/cjs/runtime/effect/index.js +16 -545
- package/dist/cjs/runtime/effect/module.js +115 -0
- package/dist/cjs/runtime/effect/operation-context.js +111 -0
- package/dist/cjs/runtime/effect-client/index.js +13 -1
- package/dist/cjs/utils/effectClientGenerator.js +17 -0
- package/dist/esm/loader.mjs +23 -0
- package/dist/esm/runtime/data-platform/index.mjs +31 -9
- package/dist/esm/runtime/effect/adapter.mjs +16 -83
- package/dist/esm/runtime/effect/context.mjs +3 -1
- package/dist/esm/runtime/effect/edge.mjs +90 -0
- package/dist/esm/runtime/effect/handler.mjs +437 -0
- package/dist/esm/runtime/effect/index.mjs +2 -438
- package/dist/esm/runtime/effect/module.mjs +81 -0
- package/dist/esm/runtime/effect/operation-context.mjs +77 -0
- package/dist/esm/runtime/effect-client/index.mjs +14 -2
- package/dist/esm/utils/effectClientGenerator.mjs +17 -0
- package/dist/esm-node/loader.mjs +23 -0
- package/dist/esm-node/runtime/data-platform/index.mjs +31 -9
- package/dist/esm-node/runtime/effect/adapter.mjs +16 -83
- package/dist/esm-node/runtime/effect/context.mjs +3 -1
- package/dist/esm-node/runtime/effect/edge.mjs +91 -0
- package/dist/esm-node/runtime/effect/handler.mjs +438 -0
- package/dist/esm-node/runtime/effect/index.mjs +2 -438
- package/dist/esm-node/runtime/effect/module.mjs +82 -0
- package/dist/esm-node/runtime/effect/operation-context.mjs +78 -0
- package/dist/esm-node/runtime/effect-client/index.mjs +14 -2
- package/dist/esm-node/utils/effectClientGenerator.mjs +17 -0
- 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/context.d.ts +3 -6
- package/dist/types/runtime/effect/edge.d.ts +25 -0
- package/dist/types/runtime/effect/handler.d.ts +170 -0
- package/dist/types/runtime/effect/index.d.ts +2 -171
- package/dist/types/runtime/effect/module.d.ts +28 -0
- package/dist/types/runtime/effect/operation-context.d.ts +10 -0
- package/dist/types/runtime/effect-client/index.d.ts +6 -1
- package/package.json +27 -18
package/dist/cjs/loader.js
CHANGED
|
@@ -40,6 +40,24 @@ const utils_namespaceObject = require("@modern-js/utils");
|
|
|
40
40
|
const external_path_namespaceObject = require("path");
|
|
41
41
|
var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
|
|
42
42
|
const effectClientGenerator_js_namespaceObject = require("./utils/effectClientGenerator.js");
|
|
43
|
+
async function transformEffectRuntimeSource(source, filename) {
|
|
44
|
+
const swc = await import("@swc/core");
|
|
45
|
+
const result = await swc.transform(source, {
|
|
46
|
+
filename,
|
|
47
|
+
sourceMaps: false,
|
|
48
|
+
jsc: {
|
|
49
|
+
parser: {
|
|
50
|
+
syntax: "typescript",
|
|
51
|
+
tsx: filename.endsWith('.tsx') || filename.endsWith('.jsx')
|
|
52
|
+
},
|
|
53
|
+
target: 'es2022'
|
|
54
|
+
},
|
|
55
|
+
module: {
|
|
56
|
+
type: 'es6'
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return result.code;
|
|
60
|
+
}
|
|
43
61
|
async function loader(source) {
|
|
44
62
|
this.cacheable();
|
|
45
63
|
const { resourcePath } = this;
|
|
@@ -51,6 +69,11 @@ async function loader(source) {
|
|
|
51
69
|
apiDir: draftOptions.apiDir,
|
|
52
70
|
effectEntry: draftOptions.effectEntry
|
|
53
71
|
});
|
|
72
|
+
if ('effect' === draftOptions.bffRuntimeFramework && effectEntryFile && external_path_default().resolve(effectEntryFile) === external_path_default().resolve(resourcePath) && this.resourceQuery.includes('modern-bff-runtime')) {
|
|
73
|
+
const code = await transformEffectRuntimeSource(source, resourcePath);
|
|
74
|
+
callback(void 0, code);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
54
77
|
if ('effect' === draftOptions.bffRuntimeFramework && effectEntryFile && external_path_default().resolve(effectEntryFile) === external_path_default().resolve(resourcePath)) {
|
|
55
78
|
const code = await (0, effectClientGenerator_js_namespaceObject.generateEffectClientCode)({
|
|
56
79
|
appDir: draftOptions.appDir,
|
|
@@ -24,18 +24,21 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
DATA_BATCH_TRANSPORT_OTEL_EVENT: ()=>DATA_BATCH_TRANSPORT_OTEL_EVENT,
|
|
27
28
|
DEFAULT_DATA_BATCH_ENDPOINT: ()=>DEFAULT_DATA_BATCH_ENDPOINT,
|
|
28
29
|
DEFAULT_DATA_BATCH_HEADER: ()=>DEFAULT_DATA_BATCH_HEADER,
|
|
29
30
|
DEFAULT_DATA_ENVELOPE_HEADER: ()=>DEFAULT_DATA_ENVELOPE_HEADER,
|
|
30
31
|
buildQueryKey: ()=>buildQueryKey,
|
|
31
32
|
buildScopeKey: ()=>buildScopeKey,
|
|
32
33
|
createDataBatchTransport: ()=>createDataBatchTransport,
|
|
34
|
+
createDataBatchTransportTelemetryAttributes: ()=>createDataBatchTransportTelemetryAttributes,
|
|
33
35
|
createHydrationEnvelope: ()=>createHydrationEnvelope,
|
|
34
36
|
createInvalidationEvent: ()=>createInvalidationEvent,
|
|
35
37
|
createOperationId: ()=>createOperationId,
|
|
36
38
|
createRequestEnvelope: ()=>createRequestEnvelope,
|
|
37
39
|
decodeRequestEnvelopeHeader: ()=>decodeRequestEnvelopeHeader,
|
|
38
40
|
deriveChildTraceContext: ()=>deriveChildTraceContext,
|
|
41
|
+
emitDataBatchTransportEvent: ()=>emitDataBatchTransportEvent,
|
|
39
42
|
encodeRequestEnvelopeHeader: ()=>encodeRequestEnvelopeHeader,
|
|
40
43
|
formatTraceparentHeader: ()=>formatTraceparentHeader,
|
|
41
44
|
normalizeOrigin: ()=>normalizeOrigin,
|
|
@@ -46,6 +49,28 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
46
49
|
validateRequestEnvelope: ()=>validateRequestEnvelope,
|
|
47
50
|
validateSelectionPlan: ()=>validateSelectionPlan
|
|
48
51
|
});
|
|
52
|
+
const api_namespaceObject = require("@opentelemetry/api");
|
|
53
|
+
const DATA_BATCH_TRANSPORT_OTEL_EVENT = 'modernjs.data.batch';
|
|
54
|
+
function createDataBatchTransportTelemetryAttributes(event) {
|
|
55
|
+
return {
|
|
56
|
+
'modernjs.data.batch.type': event.type,
|
|
57
|
+
'modernjs.data.batch.endpoint': event.endpoint,
|
|
58
|
+
'modernjs.data.batch.degraded': 'fallback' === event.type || 'disable' === event.type,
|
|
59
|
+
...event.batchId ? {
|
|
60
|
+
'modernjs.data.batch.id': event.batchId
|
|
61
|
+
} : {},
|
|
62
|
+
...'number' == typeof event.size ? {
|
|
63
|
+
'modernjs.data.batch.size': event.size
|
|
64
|
+
} : {},
|
|
65
|
+
...event.reason ? {
|
|
66
|
+
'modernjs.data.batch.reason': event.reason
|
|
67
|
+
} : {}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function emitDataBatchTransportEvent(onEvent, event) {
|
|
71
|
+
onEvent?.(event);
|
|
72
|
+
api_namespaceObject.trace.getActiveSpan()?.addEvent(DATA_BATCH_TRANSPORT_OTEL_EVENT, createDataBatchTransportTelemetryAttributes(event));
|
|
73
|
+
}
|
|
49
74
|
const DEFAULT_DATA_ENVELOPE_HEADER = 'x-modernjs-data-envelope';
|
|
50
75
|
const DEFAULT_DATA_BATCH_ENDPOINT = '/_data/batch';
|
|
51
76
|
const DEFAULT_DATA_BATCH_HEADER = 'x-modernjs-data-batch';
|
|
@@ -463,7 +488,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
463
488
|
bucket.items = [];
|
|
464
489
|
bucket.bytes = 0;
|
|
465
490
|
if (1 === items.length || disabledEndpoints.has(endpoint)) {
|
|
466
|
-
onEvent
|
|
491
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
467
492
|
type: disabledEndpoints.has(endpoint) ? 'fallback' : 'flush',
|
|
468
493
|
endpoint,
|
|
469
494
|
size: items.length,
|
|
@@ -480,7 +505,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
480
505
|
sentAt: Date.now(),
|
|
481
506
|
items: items.map((item)=>item.item)
|
|
482
507
|
};
|
|
483
|
-
onEvent
|
|
508
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
484
509
|
type: 'flush',
|
|
485
510
|
endpoint,
|
|
486
511
|
batchId,
|
|
@@ -507,7 +532,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
507
532
|
requestInit.signal = controller.signal;
|
|
508
533
|
timeoutHandle = setTimeout(()=>{
|
|
509
534
|
controller.abort();
|
|
510
|
-
onEvent
|
|
535
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
511
536
|
type: 'fallback',
|
|
512
537
|
endpoint,
|
|
513
538
|
batchId,
|
|
@@ -520,13 +545,13 @@ function createDataBatchTransport(options = {}) {
|
|
|
520
545
|
if (!response.ok) {
|
|
521
546
|
if (404 === response.status || 405 === response.status) {
|
|
522
547
|
disabledEndpoints.add(endpoint);
|
|
523
|
-
onEvent
|
|
548
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
524
549
|
type: 'disable',
|
|
525
550
|
endpoint,
|
|
526
551
|
batchId,
|
|
527
552
|
reason: `batch-endpoint-unavailable-${String(response.status)}`
|
|
528
553
|
});
|
|
529
|
-
} else onEvent
|
|
554
|
+
} else emitDataBatchTransportEvent(onEvent, {
|
|
530
555
|
type: 'fallback',
|
|
531
556
|
endpoint,
|
|
532
557
|
batchId,
|
|
@@ -539,7 +564,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
539
564
|
}
|
|
540
565
|
const result = await response.json();
|
|
541
566
|
if (!isBatchResponsePayload(result)) {
|
|
542
|
-
onEvent
|
|
567
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
543
568
|
type: 'fallback',
|
|
544
569
|
endpoint,
|
|
545
570
|
batchId,
|
|
@@ -562,7 +587,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
562
587
|
return parseResponseLikeCreateRequest(reconstructedResponse);
|
|
563
588
|
});
|
|
564
589
|
} catch (error) {
|
|
565
|
-
onEvent
|
|
590
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
566
591
|
type: 'fallback',
|
|
567
592
|
endpoint,
|
|
568
593
|
batchId,
|
|
@@ -629,7 +654,7 @@ function createDataBatchTransport(options = {}) {
|
|
|
629
654
|
};
|
|
630
655
|
bucket.items.push(queued);
|
|
631
656
|
bucket.bytes += size;
|
|
632
|
-
onEvent
|
|
657
|
+
emitDataBatchTransportEvent(onEvent, {
|
|
633
658
|
type: 'enqueue',
|
|
634
659
|
endpoint,
|
|
635
660
|
size: bucket.items.length
|
|
@@ -644,18 +669,21 @@ function createDataBatchTransport(options = {}) {
|
|
|
644
669
|
return promise;
|
|
645
670
|
};
|
|
646
671
|
}
|
|
672
|
+
exports.DATA_BATCH_TRANSPORT_OTEL_EVENT = __webpack_exports__.DATA_BATCH_TRANSPORT_OTEL_EVENT;
|
|
647
673
|
exports.DEFAULT_DATA_BATCH_ENDPOINT = __webpack_exports__.DEFAULT_DATA_BATCH_ENDPOINT;
|
|
648
674
|
exports.DEFAULT_DATA_BATCH_HEADER = __webpack_exports__.DEFAULT_DATA_BATCH_HEADER;
|
|
649
675
|
exports.DEFAULT_DATA_ENVELOPE_HEADER = __webpack_exports__.DEFAULT_DATA_ENVELOPE_HEADER;
|
|
650
676
|
exports.buildQueryKey = __webpack_exports__.buildQueryKey;
|
|
651
677
|
exports.buildScopeKey = __webpack_exports__.buildScopeKey;
|
|
652
678
|
exports.createDataBatchTransport = __webpack_exports__.createDataBatchTransport;
|
|
679
|
+
exports.createDataBatchTransportTelemetryAttributes = __webpack_exports__.createDataBatchTransportTelemetryAttributes;
|
|
653
680
|
exports.createHydrationEnvelope = __webpack_exports__.createHydrationEnvelope;
|
|
654
681
|
exports.createInvalidationEvent = __webpack_exports__.createInvalidationEvent;
|
|
655
682
|
exports.createOperationId = __webpack_exports__.createOperationId;
|
|
656
683
|
exports.createRequestEnvelope = __webpack_exports__.createRequestEnvelope;
|
|
657
684
|
exports.decodeRequestEnvelopeHeader = __webpack_exports__.decodeRequestEnvelopeHeader;
|
|
658
685
|
exports.deriveChildTraceContext = __webpack_exports__.deriveChildTraceContext;
|
|
686
|
+
exports.emitDataBatchTransportEvent = __webpack_exports__.emitDataBatchTransportEvent;
|
|
659
687
|
exports.encodeRequestEnvelopeHeader = __webpack_exports__.encodeRequestEnvelopeHeader;
|
|
660
688
|
exports.formatTraceparentHeader = __webpack_exports__.formatTraceparentHeader;
|
|
661
689
|
exports.normalizeOrigin = __webpack_exports__.normalizeOrigin;
|
|
@@ -666,18 +694,21 @@ exports.validateHydrationEnvelope = __webpack_exports__.validateHydrationEnvelop
|
|
|
666
694
|
exports.validateRequestEnvelope = __webpack_exports__.validateRequestEnvelope;
|
|
667
695
|
exports.validateSelectionPlan = __webpack_exports__.validateSelectionPlan;
|
|
668
696
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
697
|
+
"DATA_BATCH_TRANSPORT_OTEL_EVENT",
|
|
669
698
|
"DEFAULT_DATA_BATCH_ENDPOINT",
|
|
670
699
|
"DEFAULT_DATA_BATCH_HEADER",
|
|
671
700
|
"DEFAULT_DATA_ENVELOPE_HEADER",
|
|
672
701
|
"buildQueryKey",
|
|
673
702
|
"buildScopeKey",
|
|
674
703
|
"createDataBatchTransport",
|
|
704
|
+
"createDataBatchTransportTelemetryAttributes",
|
|
675
705
|
"createHydrationEnvelope",
|
|
676
706
|
"createInvalidationEvent",
|
|
677
707
|
"createOperationId",
|
|
678
708
|
"createRequestEnvelope",
|
|
679
709
|
"decodeRequestEnvelopeHeader",
|
|
680
710
|
"deriveChildTraceContext",
|
|
711
|
+
"emitDataBatchTransportEvent",
|
|
681
712
|
"encodeRequestEnvelopeHeader",
|
|
682
713
|
"formatTraceparentHeader",
|
|
683
714
|
"normalizeOrigin",
|
|
@@ -36,11 +36,10 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
36
36
|
EffectAdapter: ()=>EffectAdapter
|
|
37
37
|
});
|
|
38
38
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
39
|
-
const httpapi_namespaceObject = require("effect/unstable/httpapi");
|
|
40
39
|
const external_path_namespaceObject = require("path");
|
|
41
40
|
var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
|
|
42
41
|
const external_context_js_namespaceObject = require("./context.js");
|
|
43
|
-
const
|
|
42
|
+
const external_module_js_namespaceObject = require("./module.js");
|
|
44
43
|
const before = [
|
|
45
44
|
'custom-server-hook',
|
|
46
45
|
'custom-server-middleware',
|
|
@@ -73,24 +72,9 @@ function createRequestForMountedPrefix(req, prefix) {
|
|
|
73
72
|
url.pathname = nextPath;
|
|
74
73
|
return new Request(url, req);
|
|
75
74
|
}
|
|
76
|
-
function isRequestHandler(value) {
|
|
77
|
-
return 'function' == typeof value;
|
|
78
|
-
}
|
|
79
75
|
function maybeResponse(value) {
|
|
80
76
|
return value instanceof Response;
|
|
81
77
|
}
|
|
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
78
|
class EffectAdapter {
|
|
95
79
|
resolveEntryFile() {
|
|
96
80
|
const { appDirectory, apiDirectory } = this.api.getServerContext();
|
|
@@ -101,70 +85,13 @@ class EffectAdapter {
|
|
|
101
85
|
return (0, utils_namespaceObject.findExists)(JS_OR_TS_EXTS.map((ext)=>`${entryWithoutExt}${ext}`));
|
|
102
86
|
}
|
|
103
87
|
async loadEffectHandlerFromModule(mod) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
};
|
|
112
|
-
if (isRequestHandler(normalizedModule.handler)) return {
|
|
113
|
-
handler: normalizedModule.handler
|
|
114
|
-
};
|
|
115
|
-
const entry = normalizedModule.default;
|
|
116
|
-
if (isRequestHandler(entry)) return {
|
|
117
|
-
handler: entry
|
|
118
|
-
};
|
|
119
|
-
if ('function' == typeof entry && 0 === entry.length) {
|
|
120
|
-
const out = await entry();
|
|
121
|
-
if (isRequestHandler(out)) return {
|
|
122
|
-
handler: out
|
|
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
|
|
144
|
-
});
|
|
145
|
-
return {
|
|
146
|
-
handler: async (request)=>webHandler.handler(request),
|
|
147
|
-
dispose: async ()=>{
|
|
148
|
-
await webHandler.dispose();
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
if (isEffectApiDefinition(normalizedModule)) {
|
|
153
|
-
utils_namespaceObject.logger.warn('[BFF][Effect] Detected { api, layer } export without createHandler. Prefer `defineEffectBff(...)` from @modern-js/plugin-bff/server to avoid module instance mismatch.');
|
|
154
|
-
const webHandler = (0, external_index_js_namespaceObject.createHttpApiHandler)({
|
|
155
|
-
api: normalizedModule.api,
|
|
156
|
-
layer: normalizedModule.layer,
|
|
157
|
-
openapi: this.api.getServerConfig()?.bff?.effect?.openapi,
|
|
158
|
-
dataPlatform: this.api.getServerConfig()?.bff?.effect?.dataPlatform
|
|
159
|
-
});
|
|
160
|
-
return {
|
|
161
|
-
handler: async (request)=>webHandler.handler(request),
|
|
162
|
-
dispose: async ()=>{
|
|
163
|
-
await webHandler.dispose();
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
return null;
|
|
88
|
+
return (0, external_module_js_namespaceObject.resolveEffectBffModuleHandler)(mod, {
|
|
89
|
+
openapi: this.api.getServerConfig()?.bff?.effect?.openapi,
|
|
90
|
+
dataPlatform: this.api.getServerConfig()?.bff?.effect?.dataPlatform,
|
|
91
|
+
onWarning: (message)=>{
|
|
92
|
+
utils_namespaceObject.logger.warn(message);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
168
95
|
}
|
|
169
96
|
async reloadHandler() {
|
|
170
97
|
if (!this.isEffect) return;
|
|
@@ -282,7 +209,13 @@ class EffectAdapter {
|
|
|
282
209
|
request: effectRequest,
|
|
283
210
|
env: c.env,
|
|
284
211
|
path: c.req.path,
|
|
285
|
-
method: c.req.method
|
|
212
|
+
method: c.req.method,
|
|
213
|
+
operationContext: (0, external_context_js_namespaceObject.createEffectOperationContext)({
|
|
214
|
+
request: effectRequest,
|
|
215
|
+
env: c.env,
|
|
216
|
+
path: c.req.path,
|
|
217
|
+
method: c.req.method
|
|
218
|
+
})
|
|
286
219
|
};
|
|
287
220
|
response = await (0, external_context_js_namespaceObject.runWithEffectContext)(effectContext, ()=>this.handler.length > 1 ? this.handler(effectRequest, effectContext) : this.handler(effectRequest));
|
|
288
221
|
} catch (error) {
|
|
@@ -24,10 +24,13 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
createEffectOperationContext: ()=>external_operation_context_js_namespaceObject.createEffectOperationContext,
|
|
27
28
|
runWithEffectContext: ()=>runWithEffectContext,
|
|
28
|
-
useEffectContext: ()=>useEffectContext
|
|
29
|
+
useEffectContext: ()=>useEffectContext,
|
|
30
|
+
useOperationContext: ()=>useOperationContext
|
|
29
31
|
});
|
|
30
32
|
const external_node_async_hooks_namespaceObject = require("node:async_hooks");
|
|
33
|
+
const external_operation_context_js_namespaceObject = require("./operation-context.js");
|
|
31
34
|
const kEffectContextStorage = Symbol.for('modernjs.plugin-bff.effectContextStorage');
|
|
32
35
|
const globalStore = globalThis;
|
|
33
36
|
const effectContextStorage = globalStore[kEffectContextStorage] ?? (globalStore[kEffectContextStorage] = new external_node_async_hooks_namespaceObject.AsyncLocalStorage());
|
|
@@ -37,11 +40,16 @@ const useEffectContext = ()=>{
|
|
|
37
40
|
if (!context) throw new Error("Can't call useEffectContext out of Effect runtime scope");
|
|
38
41
|
return context;
|
|
39
42
|
};
|
|
43
|
+
const useOperationContext = ()=>useEffectContext().operationContext;
|
|
44
|
+
exports.createEffectOperationContext = __webpack_exports__.createEffectOperationContext;
|
|
40
45
|
exports.runWithEffectContext = __webpack_exports__.runWithEffectContext;
|
|
41
46
|
exports.useEffectContext = __webpack_exports__.useEffectContext;
|
|
47
|
+
exports.useOperationContext = __webpack_exports__.useOperationContext;
|
|
42
48
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
49
|
+
"createEffectOperationContext",
|
|
43
50
|
"runWithEffectContext",
|
|
44
|
-
"useEffectContext"
|
|
51
|
+
"useEffectContext",
|
|
52
|
+
"useOperationContext"
|
|
45
53
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
46
54
|
Object.defineProperty(exports, '__esModule', {
|
|
47
55
|
value: true
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_modules__ = {
|
|
3
|
+
"./handler" (module) {
|
|
4
|
+
module.exports = require("./handler.js");
|
|
5
|
+
},
|
|
6
|
+
"./module" (module) {
|
|
7
|
+
module.exports = require("./module.js");
|
|
8
|
+
},
|
|
9
|
+
"./operation-context" (module) {
|
|
10
|
+
module.exports = require("./operation-context.js");
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var __webpack_module_cache__ = {};
|
|
14
|
+
function __webpack_require__(moduleId) {
|
|
15
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
16
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
17
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
18
|
+
exports: {}
|
|
19
|
+
};
|
|
20
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
21
|
+
return module.exports;
|
|
22
|
+
}
|
|
23
|
+
(()=>{
|
|
24
|
+
__webpack_require__.n = (module)=>{
|
|
25
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
26
|
+
__webpack_require__.d(getter, {
|
|
27
|
+
a: getter
|
|
28
|
+
});
|
|
29
|
+
return getter;
|
|
30
|
+
};
|
|
31
|
+
})();
|
|
32
|
+
(()=>{
|
|
33
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
34
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: definition[key]
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
(()=>{
|
|
41
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
42
|
+
})();
|
|
43
|
+
(()=>{
|
|
44
|
+
__webpack_require__.r = (exports1)=>{
|
|
45
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
46
|
+
value: 'Module'
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
49
|
+
value: true
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
var __webpack_exports__ = {};
|
|
54
|
+
(()=>{
|
|
55
|
+
__webpack_require__.r(__webpack_exports__);
|
|
56
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
57
|
+
createEffectBffEdgeHandler: ()=>createEffectBffEdgeHandler,
|
|
58
|
+
createEffectOperationContext: ()=>_operation_context__rspack_import_1.createEffectOperationContext,
|
|
59
|
+
dispatchEffectBffRequest: ()=>dispatchEffectBffRequest
|
|
60
|
+
});
|
|
61
|
+
var _module__rspack_import_0 = __webpack_require__("./module");
|
|
62
|
+
var _operation_context__rspack_import_1 = __webpack_require__("./operation-context");
|
|
63
|
+
var _handler__rspack_import_2 = __webpack_require__("./handler");
|
|
64
|
+
var __rspack_reexport = {};
|
|
65
|
+
for(const __rspack_import_key in _handler__rspack_import_2)if ([
|
|
66
|
+
"default",
|
|
67
|
+
"dispatchEffectBffRequest",
|
|
68
|
+
"createEffectOperationContext",
|
|
69
|
+
"createEffectBffEdgeHandler"
|
|
70
|
+
].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_handler__rspack_import_2[__rspack_import_key];
|
|
71
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
72
|
+
function normalizePrefix(prefix) {
|
|
73
|
+
if (!prefix || '/' === prefix) return '';
|
|
74
|
+
return prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;
|
|
75
|
+
}
|
|
76
|
+
function removePrefixFromPath(pathname, prefix) {
|
|
77
|
+
const normalized = normalizePrefix(prefix);
|
|
78
|
+
if (!normalized || pathname !== normalized && !pathname.startsWith(`${normalized}/`)) return pathname;
|
|
79
|
+
const sliced = pathname.slice(normalized.length);
|
|
80
|
+
return sliced.startsWith('/') ? sliced : `/${sliced}`;
|
|
81
|
+
}
|
|
82
|
+
function matchesPrefix(pathname, prefix) {
|
|
83
|
+
const normalized = normalizePrefix(prefix);
|
|
84
|
+
return !normalized || pathname === normalized || pathname.startsWith(`${normalized}/`);
|
|
85
|
+
}
|
|
86
|
+
function createRequestForMountedPrefix(req, prefix) {
|
|
87
|
+
const url = new URL(req.url);
|
|
88
|
+
const nextPath = removePrefixFromPath(url.pathname, prefix);
|
|
89
|
+
if (nextPath === url.pathname) return req;
|
|
90
|
+
url.pathname = nextPath;
|
|
91
|
+
return new Request(url, req);
|
|
92
|
+
}
|
|
93
|
+
function createEdgeEffectContext(originalRequest, effectRequest, options) {
|
|
94
|
+
const originalPath = options.path || new URL(originalRequest.url).pathname;
|
|
95
|
+
const method = options.method || originalRequest.method;
|
|
96
|
+
return {
|
|
97
|
+
request: effectRequest,
|
|
98
|
+
env: options.env || {},
|
|
99
|
+
path: originalPath,
|
|
100
|
+
method,
|
|
101
|
+
operationContext: (0, _operation_context__rspack_import_1.createEffectOperationContext)({
|
|
102
|
+
request: effectRequest,
|
|
103
|
+
env: options.env || {},
|
|
104
|
+
path: originalPath,
|
|
105
|
+
method
|
|
106
|
+
})
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function createRuntimeErrorResponse(error) {
|
|
110
|
+
const status = 'object' == typeof error && null !== error && 'status' in error && 'number' == typeof error.status ? error.status : 500;
|
|
111
|
+
return new Response(JSON.stringify({
|
|
112
|
+
message: error instanceof Error ? error.message : '[BFF] Internal Server Error'
|
|
113
|
+
}), {
|
|
114
|
+
status,
|
|
115
|
+
headers: {
|
|
116
|
+
'content-type': 'application/json; charset=utf-8'
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async function dispatchEffectBffRequest(handler, request, options = {}) {
|
|
121
|
+
const requestPathname = new URL(request.url).pathname;
|
|
122
|
+
if (!matchesPrefix(requestPathname, options.prefix)) return new Response(null, {
|
|
123
|
+
status: 404
|
|
124
|
+
});
|
|
125
|
+
const effectRequest = createRequestForMountedPrefix(request, options.prefix);
|
|
126
|
+
const effectContext = createEdgeEffectContext(request, effectRequest, options);
|
|
127
|
+
try {
|
|
128
|
+
const response = handler.length > 1 ? await handler(effectRequest, effectContext) : await handler(effectRequest);
|
|
129
|
+
if (!(response instanceof Response)) throw new Error('[BFF][Effect] Effect handler must return a Response instance.');
|
|
130
|
+
return new Response(response.body, response);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
if (error instanceof Response) return new Response(error.body, error);
|
|
133
|
+
if (options.onError) {
|
|
134
|
+
const errorResponse = await options.onError(error, effectContext);
|
|
135
|
+
if (errorResponse instanceof Response) return errorResponse;
|
|
136
|
+
}
|
|
137
|
+
return createRuntimeErrorResponse(error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function createEffectBffEdgeHandler(options) {
|
|
141
|
+
const loaded = await (0, _module__rspack_import_0.resolveEffectBffModuleHandler)(options.module, {
|
|
142
|
+
openapi: options.openapi,
|
|
143
|
+
dataPlatform: options.dataPlatform,
|
|
144
|
+
onWarning: options.onWarning
|
|
145
|
+
});
|
|
146
|
+
if (!loaded) throw new Error('[BFF][Effect] Invalid Effect edge module. Export { api, layer }, createHandler, or handler.');
|
|
147
|
+
return {
|
|
148
|
+
handler: (request, dispatchOptions = {})=>dispatchEffectBffRequest(loaded.handler, request, {
|
|
149
|
+
...dispatchOptions,
|
|
150
|
+
prefix: options.prefix,
|
|
151
|
+
onError: options.onError
|
|
152
|
+
}),
|
|
153
|
+
dispose: async ()=>{
|
|
154
|
+
await loaded.dispose?.();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
})();
|
|
159
|
+
exports.createEffectBffEdgeHandler = __webpack_exports__.createEffectBffEdgeHandler;
|
|
160
|
+
exports.createEffectOperationContext = __webpack_exports__.createEffectOperationContext;
|
|
161
|
+
exports.dispatchEffectBffRequest = __webpack_exports__.dispatchEffectBffRequest;
|
|
162
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
163
|
+
"createEffectBffEdgeHandler",
|
|
164
|
+
"createEffectOperationContext",
|
|
165
|
+
"dispatchEffectBffRequest"
|
|
166
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
167
|
+
Object.defineProperty(exports, '__esModule', {
|
|
168
|
+
value: true
|
|
169
|
+
});
|