@bleedingdev/modern-js-plugin-bff 3.2.0-ultramodern.9 → 3.2.0-ultramodern.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cjs/loader.js +23 -0
  2. package/dist/cjs/runtime/data-platform/index.js +39 -8
  3. package/dist/cjs/runtime/effect/adapter.js +15 -82
  4. package/dist/cjs/runtime/effect/context.js +10 -2
  5. package/dist/cjs/runtime/effect/edge.js +169 -0
  6. package/dist/cjs/runtime/effect/handler.js +598 -0
  7. package/dist/cjs/runtime/effect/index.js +16 -545
  8. package/dist/cjs/runtime/effect/module.js +115 -0
  9. package/dist/cjs/runtime/effect/operation-context.js +111 -0
  10. package/dist/cjs/runtime/effect-client/index.js +13 -1
  11. package/dist/cjs/utils/effectClientGenerator.js +17 -0
  12. package/dist/esm/loader.mjs +23 -0
  13. package/dist/esm/runtime/data-platform/index.mjs +31 -9
  14. package/dist/esm/runtime/effect/adapter.mjs +16 -83
  15. package/dist/esm/runtime/effect/context.mjs +3 -1
  16. package/dist/esm/runtime/effect/edge.mjs +90 -0
  17. package/dist/esm/runtime/effect/handler.mjs +437 -0
  18. package/dist/esm/runtime/effect/index.mjs +2 -438
  19. package/dist/esm/runtime/effect/module.mjs +81 -0
  20. package/dist/esm/runtime/effect/operation-context.mjs +77 -0
  21. package/dist/esm/runtime/effect-client/index.mjs +14 -2
  22. package/dist/esm/utils/effectClientGenerator.mjs +17 -0
  23. package/dist/esm-node/loader.mjs +23 -0
  24. package/dist/esm-node/runtime/data-platform/index.mjs +31 -9
  25. package/dist/esm-node/runtime/effect/adapter.mjs +16 -83
  26. package/dist/esm-node/runtime/effect/context.mjs +3 -1
  27. package/dist/esm-node/runtime/effect/edge.mjs +91 -0
  28. package/dist/esm-node/runtime/effect/handler.mjs +438 -0
  29. package/dist/esm-node/runtime/effect/index.mjs +2 -438
  30. package/dist/esm-node/runtime/effect/module.mjs +82 -0
  31. package/dist/esm-node/runtime/effect/operation-context.mjs +78 -0
  32. package/dist/esm-node/runtime/effect-client/index.mjs +14 -2
  33. package/dist/esm-node/utils/effectClientGenerator.mjs +17 -0
  34. package/dist/types/runtime/create-request/index.d.ts +1 -0
  35. package/dist/types/runtime/data-platform/index.d.ts +4 -0
  36. package/dist/types/runtime/effect/context.d.ts +3 -6
  37. package/dist/types/runtime/effect/edge.d.ts +25 -0
  38. package/dist/types/runtime/effect/handler.d.ts +170 -0
  39. package/dist/types/runtime/effect/index.d.ts +2 -171
  40. package/dist/types/runtime/effect/module.d.ts +28 -0
  41. package/dist/types/runtime/effect/operation-context.d.ts +10 -0
  42. package/dist/types/runtime/effect-client/index.d.ts +6 -1
  43. package/package.json +27 -18
@@ -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 external_index_js_namespaceObject = require("./index.js");
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
- let normalizedModule = mod;
105
- const mergeRuntimeExports = (value)=>{
106
- if (!isRecord(value) || !includesRuntimeExports(value)) return;
107
- normalizedModule = {
108
- ...normalizedModule,
109
- ...value
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
+ });