@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.
Files changed (80) hide show
  1. package/dist/cjs/cli.js +9 -5
  2. package/dist/cjs/constants.js +13 -9
  3. package/dist/cjs/index.js +9 -5
  4. package/dist/cjs/loader.js +32 -5
  5. package/dist/cjs/runtime/create-request/index.js +9 -5
  6. package/dist/cjs/runtime/data-platform/index.js +50 -26
  7. package/dist/cjs/runtime/effect/adapter.js +99 -93
  8. package/dist/cjs/runtime/effect/context.js +19 -7
  9. package/dist/cjs/runtime/effect/edge.js +169 -0
  10. package/dist/cjs/runtime/effect/endpoint-contracts.js +130 -0
  11. package/dist/cjs/runtime/effect/handler.js +642 -0
  12. package/dist/cjs/runtime/effect/index.js +30 -547
  13. package/dist/cjs/runtime/effect/module.js +151 -0
  14. package/dist/cjs/runtime/effect/operation-context.js +103 -0
  15. package/dist/cjs/runtime/effect-client/index.js +22 -6
  16. package/dist/cjs/runtime/effect-client/runtime.js +266 -0
  17. package/dist/cjs/runtime/hono/adapter.js +30 -14
  18. package/dist/cjs/runtime/hono/index.js +9 -5
  19. package/dist/cjs/runtime/hono/operators.js +9 -5
  20. package/dist/cjs/runtime/safe-failure.js +83 -0
  21. package/dist/cjs/server.js +9 -5
  22. package/dist/cjs/utils/clientGenerator.js +13 -9
  23. package/dist/cjs/utils/createHonoRoutes.js +9 -5
  24. package/dist/cjs/utils/crossProjectApiPlugin.js +9 -5
  25. package/dist/cjs/utils/crossProjectServerPolicy.js +104 -0
  26. package/dist/cjs/utils/effectClientGenerator.js +116 -488
  27. package/dist/cjs/utils/pluginGenerator.js +9 -5
  28. package/dist/cjs/utils/runtimeGenerator.js +9 -5
  29. package/dist/esm/loader.mjs +23 -0
  30. package/dist/esm/runtime/data-platform/index.mjs +33 -22
  31. package/dist/esm/runtime/effect/adapter.mjs +91 -89
  32. package/dist/esm/runtime/effect/context.mjs +3 -1
  33. package/dist/esm/runtime/effect/edge.mjs +83 -0
  34. package/dist/esm/runtime/effect/endpoint-contracts.mjs +68 -0
  35. package/dist/esm/runtime/effect/handler.mjs +470 -0
  36. package/dist/esm/runtime/effect/index.mjs +3 -437
  37. package/dist/esm/runtime/effect/module.mjs +113 -0
  38. package/dist/esm/runtime/effect/operation-context.mjs +65 -0
  39. package/dist/esm/runtime/effect-client/index.mjs +14 -2
  40. package/dist/esm/runtime/effect-client/runtime.mjs +228 -0
  41. package/dist/esm/runtime/hono/adapter.mjs +21 -9
  42. package/dist/esm/runtime/safe-failure.mjs +45 -0
  43. package/dist/esm/utils/clientGenerator.mjs +5 -5
  44. package/dist/esm/utils/crossProjectServerPolicy.mjs +50 -0
  45. package/dist/esm/utils/effectClientGenerator.mjs +105 -484
  46. package/dist/esm-node/loader.mjs +23 -0
  47. package/dist/esm-node/runtime/data-platform/index.mjs +33 -22
  48. package/dist/esm-node/runtime/effect/adapter.mjs +91 -89
  49. package/dist/esm-node/runtime/effect/context.mjs +3 -1
  50. package/dist/esm-node/runtime/effect/edge.mjs +84 -0
  51. package/dist/esm-node/runtime/effect/endpoint-contracts.mjs +69 -0
  52. package/dist/esm-node/runtime/effect/handler.mjs +471 -0
  53. package/dist/esm-node/runtime/effect/index.mjs +3 -437
  54. package/dist/esm-node/runtime/effect/module.mjs +114 -0
  55. package/dist/esm-node/runtime/effect/operation-context.mjs +66 -0
  56. package/dist/esm-node/runtime/effect-client/index.mjs +14 -2
  57. package/dist/esm-node/runtime/effect-client/runtime.mjs +229 -0
  58. package/dist/esm-node/runtime/hono/adapter.mjs +21 -9
  59. package/dist/esm-node/runtime/safe-failure.mjs +46 -0
  60. package/dist/esm-node/utils/clientGenerator.mjs +5 -5
  61. package/dist/esm-node/utils/crossProjectServerPolicy.mjs +52 -0
  62. package/dist/esm-node/utils/effectClientGenerator.mjs +105 -484
  63. package/dist/types/runtime/create-request/index.d.ts +1 -0
  64. package/dist/types/runtime/data-platform/index.d.ts +4 -0
  65. package/dist/types/runtime/effect/adapter.d.ts +25 -0
  66. package/dist/types/runtime/effect/context.d.ts +3 -6
  67. package/dist/types/runtime/effect/edge.d.ts +25 -0
  68. package/dist/types/runtime/effect/endpoint-contracts.d.ts +62 -0
  69. package/dist/types/runtime/effect/handler.d.ts +203 -0
  70. package/dist/types/runtime/effect/index.d.ts +2 -170
  71. package/dist/types/runtime/effect/module.d.ts +48 -0
  72. package/dist/types/runtime/effect/operation-context.d.ts +10 -0
  73. package/dist/types/runtime/effect-client/index.d.ts +6 -1
  74. package/dist/types/runtime/effect-client/runtime.d.ts +71 -0
  75. package/dist/types/runtime/hono/adapter.d.ts +3 -0
  76. package/dist/types/runtime/safe-failure.d.ts +1 -0
  77. package/dist/types/utils/createHonoRoutes.d.ts +3 -3
  78. package/dist/types/utils/crossProjectServerPolicy.d.ts +35 -0
  79. package/dist/types/utils/effectClientGenerator.d.ts +16 -2
  80. 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, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
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
  (()=>{
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
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, definition)=>{
28
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
29
- enumerable: true,
30
- get: definition[key]
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
  (()=>{
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
10
10
  };
11
11
  })();
12
12
  (()=>{
13
- __webpack_require__.d = (exports1, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
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, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
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, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
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
- const match = header.trim().match(TRACEPARENT_REGEX);
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, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
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 external_index_js_namespaceObject = require("./index.js");
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
- 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
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
- return {
146
- handler: async (request)=>webHandler.handler(request),
147
- dispose: async ()=>{
148
- await webHandler.dispose();
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
- 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
- };
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
- return null;
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
- const status = 'object' == typeof error && null !== error && 'status' in error && 'number' == typeof error.status ? error.status : 500;
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) {