everything-dev 1.6.0 → 1.7.0

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 (108) hide show
  1. package/dist/api-contract.cjs +55 -8
  2. package/dist/api-contract.cjs.map +1 -1
  3. package/dist/api-contract.mjs +55 -8
  4. package/dist/api-contract.mjs.map +1 -1
  5. package/dist/app.cjs +26 -2
  6. package/dist/app.cjs.map +1 -1
  7. package/dist/app.mjs +27 -3
  8. package/dist/app.mjs.map +1 -1
  9. package/dist/cli/init.cjs +4 -4
  10. package/dist/cli/init.cjs.map +1 -1
  11. package/dist/cli/init.mjs +4 -4
  12. package/dist/cli/init.mjs.map +1 -1
  13. package/dist/cli/sync.cjs +2 -2
  14. package/dist/cli/sync.cjs.map +1 -1
  15. package/dist/cli/sync.mjs +2 -2
  16. package/dist/cli/sync.mjs.map +1 -1
  17. package/dist/cli.cjs +0 -1
  18. package/dist/cli.cjs.map +1 -1
  19. package/dist/cli.mjs +0 -1
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/components/streaming-view.cjs +0 -18
  22. package/dist/components/streaming-view.cjs.map +1 -1
  23. package/dist/components/streaming-view.mjs +0 -18
  24. package/dist/components/streaming-view.mjs.map +1 -1
  25. package/dist/config.cjs +21 -5
  26. package/dist/config.cjs.map +1 -1
  27. package/dist/config.d.cts +2 -1
  28. package/dist/config.d.cts.map +1 -1
  29. package/dist/config.d.mts +2 -1
  30. package/dist/config.d.mts.map +1 -1
  31. package/dist/config.mjs +21 -6
  32. package/dist/config.mjs.map +1 -1
  33. package/dist/contract.cjs +8 -1
  34. package/dist/contract.cjs.map +1 -1
  35. package/dist/contract.d.cts +44 -8
  36. package/dist/contract.d.cts.map +1 -1
  37. package/dist/contract.d.mts +44 -8
  38. package/dist/contract.d.mts.map +1 -1
  39. package/dist/contract.meta.cjs +1 -1
  40. package/dist/contract.meta.cjs.map +1 -1
  41. package/dist/contract.meta.d.cts +1 -1
  42. package/dist/contract.meta.d.mts +1 -1
  43. package/dist/contract.meta.mjs +1 -1
  44. package/dist/contract.meta.mjs.map +1 -1
  45. package/dist/contract.mjs +8 -1
  46. package/dist/contract.mjs.map +1 -1
  47. package/dist/dev-session.cjs +51 -66
  48. package/dist/dev-session.cjs.map +1 -1
  49. package/dist/dev-session.mjs +52 -67
  50. package/dist/dev-session.mjs.map +1 -1
  51. package/dist/fastkv.cjs +56 -0
  52. package/dist/fastkv.cjs.map +1 -1
  53. package/dist/fastkv.d.cts +45 -1
  54. package/dist/fastkv.d.cts.map +1 -1
  55. package/dist/fastkv.d.mts +45 -1
  56. package/dist/fastkv.d.mts.map +1 -1
  57. package/dist/fastkv.mjs +54 -1
  58. package/dist/fastkv.mjs.map +1 -1
  59. package/dist/host.cjs +1 -1
  60. package/dist/host.cjs.map +1 -1
  61. package/dist/host.mjs +1 -1
  62. package/dist/host.mjs.map +1 -1
  63. package/dist/index.cjs +4 -0
  64. package/dist/index.d.cts +4 -4
  65. package/dist/index.d.mts +4 -4
  66. package/dist/index.mjs +3 -3
  67. package/dist/near-cli.cjs +1 -1
  68. package/dist/near-cli.mjs +1 -1
  69. package/dist/orchestrator.cjs +55 -20
  70. package/dist/orchestrator.cjs.map +1 -1
  71. package/dist/orchestrator.d.cts +5 -4
  72. package/dist/orchestrator.d.cts.map +1 -1
  73. package/dist/orchestrator.d.mts +5 -4
  74. package/dist/orchestrator.d.mts.map +1 -1
  75. package/dist/orchestrator.mjs +55 -20
  76. package/dist/orchestrator.mjs.map +1 -1
  77. package/dist/plugin.cjs +135 -9
  78. package/dist/plugin.cjs.map +1 -1
  79. package/dist/plugin.d.cts +49 -8
  80. package/dist/plugin.d.cts.map +1 -1
  81. package/dist/plugin.d.mts +49 -8
  82. package/dist/plugin.d.mts.map +1 -1
  83. package/dist/plugin.mjs +137 -11
  84. package/dist/plugin.mjs.map +1 -1
  85. package/dist/types.cjs +15 -5
  86. package/dist/types.cjs.map +1 -1
  87. package/dist/types.d.cts +60 -9
  88. package/dist/types.d.cts.map +1 -1
  89. package/dist/types.d.mts +60 -9
  90. package/dist/types.d.mts.map +1 -1
  91. package/dist/types.mjs +15 -5
  92. package/dist/types.mjs.map +1 -1
  93. package/package.json +2 -2
  94. package/src/api-contract.ts +88 -9
  95. package/src/app.ts +55 -7
  96. package/src/cli/init.ts +6 -6
  97. package/src/cli/sync.ts +5 -3
  98. package/src/cli.ts +0 -1
  99. package/src/components/streaming-view.ts +0 -20
  100. package/src/config.ts +39 -23
  101. package/src/contract.meta.ts +4 -1
  102. package/src/contract.ts +7 -0
  103. package/src/dev-session.ts +85 -83
  104. package/src/fastkv.ts +95 -0
  105. package/src/host.ts +1 -1
  106. package/src/orchestrator.ts +61 -31
  107. package/src/plugin.ts +202 -5
  108. package/src/types.ts +38 -4
package/dist/fastkv.d.cts CHANGED
@@ -6,6 +6,50 @@ declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId:
6
6
  declare function getRegistryNamespaceForAccount(accountId: string): string;
7
7
  declare function getRegistryNamespaceForNetwork(network: NetworkId): string;
8
8
  declare function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T>;
9
+ interface PluginManifest {
10
+ schemaVersion: number;
11
+ kind: string;
12
+ plugin: {
13
+ name: string;
14
+ version: string;
15
+ };
16
+ runtime: {
17
+ remoteEntry: string;
18
+ };
19
+ contract: {
20
+ kind: string;
21
+ types: {
22
+ path: string;
23
+ exportName: string;
24
+ typeName: string;
25
+ sha256: string;
26
+ };
27
+ };
28
+ additionalExports?: Array<{
29
+ path: string;
30
+ exports: string[];
31
+ sha256: string;
32
+ }>;
33
+ }
34
+ interface PluginMetadata {
35
+ title: string | null;
36
+ description: string | null;
37
+ repoUrl: string | null;
38
+ version: string;
39
+ publishedAt: string;
40
+ cdnUrl: string;
41
+ integrity: string | null;
42
+ }
43
+ interface PluginRegistryEntry {
44
+ manifest: PluginManifest;
45
+ metadata: PluginMetadata;
46
+ }
47
+ declare function parsePluginBosUrl(source: string): {
48
+ accountId: string;
49
+ pluginName: string;
50
+ } | null;
51
+ declare function fetchPluginFromRegistry(accountId: string, pluginName: string): Promise<PluginRegistryEntry | null>;
52
+ declare function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null>;
9
53
  //#endregion
10
- export { NetworkId, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork };
54
+ export { NetworkId, PluginManifest, PluginMetadata, PluginRegistryEntry, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parsePluginBosUrl };
11
55
  //# sourceMappingURL=fastkv.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastkv.d.cts","names":[],"sources":["../src/fastkv.ts"],"mappings":";KAAY,SAAA;AAAA,iBAgBI,0BAAA,CAA2B,OAAA,EAAS,SAAA;AAAA,iBAYpC,sBAAA,CAAuB,SAAA,UAAmB,SAAA;AAAA,iBAO1C,gCAAA,CACd,OAAA,EAAS,SAAA,EACT,SAAA,UACA,SAAA;AAAA,iBAQc,8BAAA,CAA+B,SAAA;AAAA,iBAM/B,8BAAA,CAA+B,OAAA,EAAS,SAAA;AAAA,iBAgDlC,wBAAA,GAAA,CAA4B,MAAA,WAAiB,OAAA,CAAQ,CAAA"}
1
+ {"version":3,"file":"fastkv.d.cts","names":[],"sources":["../src/fastkv.ts"],"mappings":";KAAY,SAAA;AAAA,iBAgBI,0BAAA,CAA2B,OAAA,EAAS,SAAA;AAAA,iBAYpC,sBAAA,CAAuB,SAAA,UAAmB,SAAA;AAAA,iBAO1C,gCAAA,CACd,OAAA,EAAS,SAAA,EACT,SAAA,UACA,SAAA;AAAA,iBAQc,8BAAA,CAA+B,SAAA;AAAA,iBAM/B,8BAAA,CAA+B,OAAA,EAAS,SAAA;AAAA,iBAgDlC,wBAAA,GAAA,CAA4B,MAAA,WAAiB,OAAA,CAAQ,CAAA;AAAA,UA6B1D,cAAA;EACf,aAAA;EACA,IAAA;EACA,MAAA;IAAU,IAAA;IAAc,OAAA;EAAA;EACxB,OAAA;IAAW,WAAA;EAAA;EACX,QAAA;IACE,IAAA;IACA,KAAA;MAAS,IAAA;MAAc,UAAA;MAAoB,QAAA;MAAkB,MAAA;IAAA;EAAA;EAE/D,iBAAA,GAAoB,KAAA;IAAQ,IAAA;IAAc,OAAA;IAAmB,MAAA;EAAA;AAAA;AAAA,UAG9C,cAAA;EACf,KAAA;EACA,WAAA;EACA,OAAA;EACA,OAAA;EACA,WAAA;EACA,MAAA;EACA,SAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA,EAAU,cAAA;EACV,QAAA,EAAU,cAAA;AAAA;AAAA,iBAGI,iBAAA,CACd,MAAA;EACG,SAAA;EAAmB,UAAA;AAAA;AAAA,iBA2BF,uBAAA,CACpB,SAAA,UACA,UAAA,WACC,OAAA,CAAQ,mBAAA;AAAA,iBAyBW,yBAAA,CAA0B,MAAA,WAAiB,OAAA,CAAQ,cAAA"}
package/dist/fastkv.d.mts CHANGED
@@ -6,6 +6,50 @@ declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId:
6
6
  declare function getRegistryNamespaceForAccount(accountId: string): string;
7
7
  declare function getRegistryNamespaceForNetwork(network: NetworkId): string;
8
8
  declare function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T>;
9
+ interface PluginManifest {
10
+ schemaVersion: number;
11
+ kind: string;
12
+ plugin: {
13
+ name: string;
14
+ version: string;
15
+ };
16
+ runtime: {
17
+ remoteEntry: string;
18
+ };
19
+ contract: {
20
+ kind: string;
21
+ types: {
22
+ path: string;
23
+ exportName: string;
24
+ typeName: string;
25
+ sha256: string;
26
+ };
27
+ };
28
+ additionalExports?: Array<{
29
+ path: string;
30
+ exports: string[];
31
+ sha256: string;
32
+ }>;
33
+ }
34
+ interface PluginMetadata {
35
+ title: string | null;
36
+ description: string | null;
37
+ repoUrl: string | null;
38
+ version: string;
39
+ publishedAt: string;
40
+ cdnUrl: string;
41
+ integrity: string | null;
42
+ }
43
+ interface PluginRegistryEntry {
44
+ manifest: PluginManifest;
45
+ metadata: PluginMetadata;
46
+ }
47
+ declare function parsePluginBosUrl(source: string): {
48
+ accountId: string;
49
+ pluginName: string;
50
+ } | null;
51
+ declare function fetchPluginFromRegistry(accountId: string, pluginName: string): Promise<PluginRegistryEntry | null>;
52
+ declare function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null>;
9
53
  //#endregion
10
- export { NetworkId, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork };
54
+ export { NetworkId, PluginManifest, PluginMetadata, PluginRegistryEntry, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parsePluginBosUrl };
11
55
  //# sourceMappingURL=fastkv.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastkv.d.mts","names":[],"sources":["../src/fastkv.ts"],"mappings":";KAAY,SAAA;AAAA,iBAgBI,0BAAA,CAA2B,OAAA,EAAS,SAAA;AAAA,iBAYpC,sBAAA,CAAuB,SAAA,UAAmB,SAAA;AAAA,iBAO1C,gCAAA,CACd,OAAA,EAAS,SAAA,EACT,SAAA,UACA,SAAA;AAAA,iBAQc,8BAAA,CAA+B,SAAA;AAAA,iBAM/B,8BAAA,CAA+B,OAAA,EAAS,SAAA;AAAA,iBAgDlC,wBAAA,GAAA,CAA4B,MAAA,WAAiB,OAAA,CAAQ,CAAA"}
1
+ {"version":3,"file":"fastkv.d.mts","names":[],"sources":["../src/fastkv.ts"],"mappings":";KAAY,SAAA;AAAA,iBAgBI,0BAAA,CAA2B,OAAA,EAAS,SAAA;AAAA,iBAYpC,sBAAA,CAAuB,SAAA,UAAmB,SAAA;AAAA,iBAO1C,gCAAA,CACd,OAAA,EAAS,SAAA,EACT,SAAA,UACA,SAAA;AAAA,iBAQc,8BAAA,CAA+B,SAAA;AAAA,iBAM/B,8BAAA,CAA+B,OAAA,EAAS,SAAA;AAAA,iBAgDlC,wBAAA,GAAA,CAA4B,MAAA,WAAiB,OAAA,CAAQ,CAAA;AAAA,UA6B1D,cAAA;EACf,aAAA;EACA,IAAA;EACA,MAAA;IAAU,IAAA;IAAc,OAAA;EAAA;EACxB,OAAA;IAAW,WAAA;EAAA;EACX,QAAA;IACE,IAAA;IACA,KAAA;MAAS,IAAA;MAAc,UAAA;MAAoB,QAAA;MAAkB,MAAA;IAAA;EAAA;EAE/D,iBAAA,GAAoB,KAAA;IAAQ,IAAA;IAAc,OAAA;IAAmB,MAAA;EAAA;AAAA;AAAA,UAG9C,cAAA;EACf,KAAA;EACA,WAAA;EACA,OAAA;EACA,OAAA;EACA,WAAA;EACA,MAAA;EACA,SAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA,EAAU,cAAA;EACV,QAAA,EAAU,cAAA;AAAA;AAAA,iBAGI,iBAAA,CACd,MAAA;EACG,SAAA;EAAmB,UAAA;AAAA;AAAA,iBA2BF,uBAAA,CACpB,SAAA,UACA,UAAA,WACC,OAAA,CAAQ,mBAAA;AAAA,iBAyBW,yBAAA,CAA0B,MAAA,WAAiB,OAAA,CAAQ,cAAA"}
package/dist/fastkv.mjs CHANGED
@@ -57,6 +57,59 @@ async function fetchBosConfigFromFastKv(bosUrl) {
57
57
  if (typeof value !== "object") throw new Error(`Invalid config value for ${bosUrl}`);
58
58
  return value;
59
59
  }
60
+ function parsePluginBosUrl(source) {
61
+ if (!source.startsWith("bos://")) return null;
62
+ const match = source.match(/^bos:\/\/([^/]+)\/plugins\/([^/]+)$/);
63
+ if (!match?.[1] || !match[2]) return null;
64
+ return {
65
+ accountId: match[1],
66
+ pluginName: match[2]
67
+ };
68
+ }
69
+ async function fetchKvValue(accountId, key) {
70
+ const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}`, {
71
+ method: "POST",
72
+ body: JSON.stringify({
73
+ key,
74
+ limit: 1
75
+ })
76
+ }))?.entries?.find(Boolean)?.value;
77
+ if (value == null) return null;
78
+ if (typeof value === "string") try {
79
+ return JSON.parse(value);
80
+ } catch {
81
+ return null;
82
+ }
83
+ return value;
84
+ }
85
+ async function fetchPluginFromRegistry(accountId, pluginName) {
86
+ const manifestKey = `plugins/${accountId}/${pluginName}/manifest.json`;
87
+ const metadataKey = `plugins/${accountId}/${pluginName}/metadata`;
88
+ const [rawManifest, rawMetadata] = await Promise.all([fetchKvValue(accountId, manifestKey), fetchKvValue(accountId, metadataKey)]);
89
+ if (!rawManifest || typeof rawManifest !== "object") return null;
90
+ return {
91
+ manifest: rawManifest,
92
+ metadata: rawMetadata ?? {
93
+ title: null,
94
+ description: null,
95
+ repoUrl: null,
96
+ version: "",
97
+ publishedAt: "",
98
+ cdnUrl: "",
99
+ integrity: null
100
+ }
101
+ };
102
+ }
103
+ async function fetchRemotePluginManifest(cdnUrl) {
104
+ try {
105
+ const baseUrl = cdnUrl.replace(/\/$/, "");
106
+ const response = await fetch(`${baseUrl}/plugin.manifest.json`);
107
+ if (!response.ok) return null;
108
+ return await response.json();
109
+ } catch {
110
+ return null;
111
+ }
112
+ }
60
113
  async function fetchJson(url, init) {
61
114
  const controller = new AbortController();
62
115
  const timeout = setTimeout(() => controller.abort(), FASTKV_TIMEOUT_MS);
@@ -78,5 +131,5 @@ async function fetchJson(url, init) {
78
131
  }
79
132
 
80
133
  //#endregion
81
- export { buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork };
134
+ export { buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parsePluginBosUrl };
82
135
  //# sourceMappingURL=fastkv.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastkv.mjs","names":[],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nconst FASTKV_TIMEOUT_MS = 10_000;\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_URL || \"https://kv.test.fastnear.com\"\n : process.env.REGISTRY_FASTKV_MAINNET_URL || \"https://kv.main.fastnear.com\";\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(accountId: string, gatewayId: string): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string): string {\n return accountId.endsWith(\".testnet\")\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || accountId;\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nfunction parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const match = bosUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n key: getRegistryConfigKey(accountId, gatewayId, pathSegments),\n limit: 1,\n }),\n },\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FASTKV_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n ...init,\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers ?? {}),\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n return null;\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"mappings":";AAUA,MAAM,oBAAoB;AAE1B,SAAS,uBAAuB,WAA8B;AAC5D,QAAO,UAAU,SAAS,WAAW,GAAG,YAAY;;AAGtD,SAAgB,2BAA2B,SAA4B;AACrE,QAAO,YAAY,YACf,QAAQ,IAAI,+BAA+B,iCAC3C,QAAQ,IAAI,+BAA+B;;AAGjD,SAAS,2BAA2B,WAA2B;AAC7D,QAAO,uBAAuB,UAAU,KAAK,YACzC,2BAA2B,UAAU,GACrC,2BAA2B,UAAU;;AAG3C,SAAgB,uBAAuB,WAAmB,WAA2B;CACnF,MAAM,UAAU,2BAA2B,UAAU;CACrD,MAAM,YAAY,+BAA+B,UAAU;CAC3D,MAAM,MAAM,mBAAmB,qBAAqB,WAAW,UAAU,CAAC;AAC1E,QAAO,GAAG,QAAQ,aAAa,mBAAmB,UAAU,CAAC,GAAG,mBAAmB,UAAU,CAAC,GAAG;;AAGnG,SAAgB,iCACd,SACA,WACA,WACQ;CACR,MAAM,UAAU,2BAA2B,QAAQ;CACnD,MAAM,YAAY,+BAA+B,QAAQ;CACzD,MAAM,MAAM,mBAAmB,qBAAqB,WAAW,UAAU,CAAC;AAC1E,QAAO,GAAG,QAAQ,aAAa,mBAAmB,UAAU,CAAC,GAAG,mBAAmB,UAAU,CAAC,GAAG;;AAGnG,SAAgB,+BAA+B,WAA2B;AACxE,QAAO,UAAU,SAAS,WAAW,GACjC,QAAQ,IAAI,qCAAqC,wBACjD,QAAQ,IAAI,qCAAqC;;AAGvD,SAAgB,+BAA+B,SAA4B;AACzE,QAAO,YAAY,YACf,QAAQ,IAAI,qCAAqC,wBACjD,QAAQ,IAAI,qCAAqC;;AAGvD,SAAS,qBACP,WACA,WACA,eAAyB,EAAE,EACnB;AAKR,QAAO,QAAQ,UAAU,GAAG,YAH1B,aAAa,SAAS,IAClB,IAAI,aAAa,KAAK,YAAY,mBAAmB,QAAQ,CAAC,CAAC,KAAK,IAAI,KACxE,GACyC;;AAGjD,SAAS,YAAY,QAInB;CACA,MAAM,QAAQ,OAAO,MAAM,0BAA0B;AACrD,KAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,GACxB,OAAM,IAAI,MAAM,oBAAoB,SAAS;CAG/C,MAAM,eAAe,MAAM,GACxB,MAAM,IAAI,CACV,OAAO,QAAQ,CACf,KAAK,YAAY,mBAAmB,QAAQ,CAAC;AAChD,KAAI,aAAa,WAAW,EAC1B,OAAM,IAAI,MAAM,oBAAoB,SAAS;CAG/C,MAAM,CAAC,WAAW,GAAG,oBAAoB;AACzC,KAAI,CAAC,UACH,OAAM,IAAI,MAAM,oBAAoB,SAAS;AAG/C,QAAO;EACL,WAAW,MAAM;EACjB;EACA,cAAc;EACf;;AAGH,eAAsB,yBAA4B,QAA4B;CAC5E,MAAM,EAAE,WAAW,WAAW,iBAAiB,YAAY,OAAO;CAWlE,MAAM,SAVU,MAAM,UACpB,GAAG,2BAA2B,UAAU,CAAC,aAAa,mBAAmB,+BAA+B,UAAU,CAAC,CAAC,GAAG,mBAAmB,UAAU,IACpJ;EACE,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB,KAAK,qBAAqB,WAAW,WAAW,aAAa;GAC7D,OAAO;GACR,CAAC;EACH,CACF,GACsB,SAAS,KAAK,QAAQ,EAAE;AAE/C,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,uBAAuB,SAAS;AAGlD,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,MAAM,MAAM;AAG1B,KAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,4BAA4B,SAAS;AAGvD,QAAO;;AAGT,eAAe,UAAa,KAAa,MAAuC;CAC9E,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,kBAAkB;AAEvE,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,GAAG;GACH,SAAS;IACP,QAAQ;IACR,gBAAgB;IAChB,GAAI,MAAM,WAAW,EAAE;IACxB;GACD,QAAQ,WAAW;GACpB,CAAC;AAEF,MAAI,CAAC,SAAS,GACZ,QAAO;AAGT,SAAQ,MAAM,SAAS,MAAM;WACrB;AACR,eAAa,QAAQ"}
1
+ {"version":3,"file":"fastkv.mjs","names":[],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nconst FASTKV_TIMEOUT_MS = 10_000;\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_URL || \"https://kv.test.fastnear.com\"\n : process.env.REGISTRY_FASTKV_MAINNET_URL || \"https://kv.main.fastnear.com\";\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(accountId: string, gatewayId: string): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string): string {\n return accountId.endsWith(\".testnet\")\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || accountId;\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nfunction parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const match = bosUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n key: getRegistryConfigKey(accountId, gatewayId, pathSegments),\n limit: 1,\n }),\n },\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport interface PluginMetadata {\n title: string | null;\n description: string | null;\n repoUrl: string | null;\n version: string;\n publishedAt: string;\n cdnUrl: string;\n integrity: string | null;\n}\n\nexport interface PluginRegistryEntry {\n manifest: PluginManifest;\n metadata: PluginMetadata;\n}\n\nexport function parsePluginBosUrl(\n source: string,\n): { accountId: string; pluginName: string } | null {\n if (!source.startsWith(\"bos://\")) return null;\n const match = source.match(/^bos:\\/\\/([^/]+)\\/plugins\\/([^/]+)$/);\n if (!match?.[1] || !match[2]) return null;\n return { accountId: match[1], pluginName: match[2] };\n}\n\nasync function fetchKvValue(accountId: string, key: string): Promise<unknown | null> {\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}`,\n {\n method: \"POST\",\n body: JSON.stringify({ key, limit: 1 }),\n },\n );\n const value = payload?.entries?.find(Boolean)?.value;\n if (value == null) return null;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n return value;\n}\n\nexport async function fetchPluginFromRegistry(\n accountId: string,\n pluginName: string,\n): Promise<PluginRegistryEntry | null> {\n const manifestKey = `plugins/${accountId}/${pluginName}/manifest.json`;\n const metadataKey = `plugins/${accountId}/${pluginName}/metadata`;\n\n const [rawManifest, rawMetadata] = await Promise.all([\n fetchKvValue(accountId, manifestKey),\n fetchKvValue(accountId, metadataKey),\n ]);\n\n if (!rawManifest || typeof rawManifest !== \"object\") return null;\n\n return {\n manifest: rawManifest as PluginManifest,\n metadata: (rawMetadata ?? {\n title: null,\n description: null,\n repoUrl: null,\n version: \"\",\n publishedAt: \"\",\n cdnUrl: \"\",\n integrity: null,\n }) as PluginMetadata,\n };\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n try {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n const response = await fetch(`${baseUrl}/plugin.manifest.json`);\n if (!response.ok) return null;\n return (await response.json()) as PluginManifest;\n } catch {\n return null;\n }\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FASTKV_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n ...init,\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers ?? {}),\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n return null;\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"mappings":"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"}
package/dist/host.cjs CHANGED
@@ -167,7 +167,7 @@ async function runHostServer(opts) {
167
167
  origin: corsOrigins,
168
168
  credentials: true
169
169
  }));
170
- app.use("*", (0, hono_secure_headers.secureHeaders)());
170
+ app.use("*", (0, hono_secure_headers.secureHeaders)({ crossOriginOpenerPolicy: "same-origin-allow-popups" }));
171
171
  app.get("/health", (c) => c.text("OK"));
172
172
  app.get("/ready", async (c) => {
173
173
  const probe = async (url, timeoutMs = 400) => {
package/dist/host.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"host.cjs","names":["createStitchedRouter","RPCHandler","BatchHandlerPlugin","OpenAPIHandler","OpenAPIReferencePlugin","ZodToJsonSchemaConverter","loadApiPluginsFromRuntimeConfig","loadRouterModule","Hono"],"sources":["../src/host.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { BatchHandlerPlugin } from \"@orpc/server/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { secureHeaders } from \"hono/secure-headers\";\nimport {\n createStitchedRouter,\n type LoadedPluginResult,\n type LoadedPluginsResult,\n loadApiPluginsFromRuntimeConfig,\n} from \"./api\";\nimport { loadRouterModule, type RouterModule } from \"./federation.server\";\nimport type { ClientRuntimeConfig, RuntimeConfig } from \"./types\";\n\nexport interface HostServerConfig {\n runtimeConfig: RuntimeConfig;\n configDir: string;\n port?: number;\n}\n\nexport interface HostServerHandle {\n ready: Promise<void>;\n shutdown: () => Promise<void>;\n}\n\nfunction buildClientRuntimeConfig(runtimeConfig: RuntimeConfig): ClientRuntimeConfig {\n return {\n env: runtimeConfig.env,\n account: runtimeConfig.account,\n networkId: runtimeConfig.networkId,\n hostUrl: runtimeConfig.hostUrl,\n assetsUrl: runtimeConfig.ui.url,\n apiBase: \"/api\",\n rpcBase: \"/api/rpc\",\n ui: runtimeConfig.ui\n ? {\n name: runtimeConfig.ui.name,\n url: runtimeConfig.ui.url,\n entry: runtimeConfig.ui.entry,\n integrity: runtimeConfig.ui.integrity,\n }\n : undefined,\n api: runtimeConfig.api\n ? {\n name: runtimeConfig.api.name,\n url: runtimeConfig.api.url,\n entry: runtimeConfig.api.entry,\n integrity: runtimeConfig.api.integrity,\n }\n : undefined,\n plugins: runtimeConfig.plugins\n ? Object.fromEntries(\n Object.entries(runtimeConfig.plugins).map(([key, plugin]) => [\n key,\n {\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n integrity: plugin.integrity,\n },\n ]),\n )\n : undefined,\n };\n}\n\nfunction renderLoadingShell(runtimeConfig: ClientRuntimeConfig, error?: string | null) {\n const bootstrap = `window.__RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};window.addEventListener('load', function handleEverythingDevHydrate() { window.__hydrate?.(); }, { once: true });`;\n const errorMarkup = error\n ? `<p style=\"color: #fca5a5;\">Error loading UI: ${escapeHtml(error)}</p>`\n : \"<p>Loading UI...</p>\";\n\n const uiIntegrity = runtimeConfig.ui?.integrity;\n const sriAttr = uiIntegrity ? ` integrity=\"${uiIntegrity}\" crossorigin=\"anonymous\"` : \"\";\n\n return `\n\t\t<!DOCTYPE html>\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<meta charset=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\t\t\t\t<title>Loading...</title>\n\t\t\t\t<style>\n\t\t\t\t\tbody { background: #171717; color: #fafafa; display: flex; align-items: center; justify-content: center; height: 100vh; font-family: system-ui; }\n\t\t\t\t\t.fade { animation: fadeIn 0.3s ease-in; text-align: center; padding: 2rem; }\n\t\t\t\t\t@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n\t\t\t\t</style>\n\t\t\t\t${runtimeConfig.assetsUrl ? `<script src=\"${runtimeConfig.assetsUrl}/remoteEntry.js\"${sriAttr}></script>` : \"\"}\n\t\t\t\t<script>${bootstrap}</script>\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t<div id=\"root\" class=\"fade\">${errorMarkup}</div>\n\t\t\t</body>\n\t\t</html>\n\t`;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nexport function createHostServer(config: HostServerConfig): HostServerHandle {\n const port = config.port ?? 3000;\n const { runtimeConfig } = config;\n\n let shutdownImpl: (() => Promise<void>) | null = null;\n\n const ready = (async () => {\n const started = await runHostServer({ runtimeConfig, port });\n shutdownImpl = started.shutdown;\n })();\n\n const shutdown = async () => {\n console.log(\"[Host] Shutting down...\");\n const timeout = setTimeout(() => {\n console.log(\"[Host] Force exit\");\n process.exit(0);\n }, 5000);\n await ready.catch(() => {});\n if (shutdownImpl) {\n await shutdownImpl().catch(() => {});\n }\n clearTimeout(timeout);\n console.log(\"[Host] Shutdown complete\");\n };\n\n return { ready, shutdown };\n}\n\nasync function runHostServer(opts: {\n runtimeConfig: RuntimeConfig;\n port: number;\n}): Promise<{ shutdown: () => Promise<void> }> {\n const { runtimeConfig, port } = opts;\n\n let apiPlugins: LoadedPluginResult[] = [];\n let baseApiPlugin: LoadedPluginResult | null = null;\n let apiPluginError: string | null = null;\n let apiPluginLoading: Promise<LoadedPluginsResult | null> | null = null;\n let ssrRouterModule: RouterModule | null = null;\n let ssrRouterError: string | null = null;\n let ssrRouterLoading: Promise<RouterModule | null> | null = null;\n let rpcHandler: RPCHandler<any> | null = null;\n let openApiHandler: OpenAPIHandler<any> | null = null;\n\n const clientRuntimeConfig = buildClientRuntimeConfig(runtimeConfig);\n\n const initApiHandlers = () => {\n const baseRouter = baseApiPlugin?.router ?? {};\n const stitchedRouter = createStitchedRouter(\n baseRouter,\n apiPlugins.filter((plugin) => plugin.key !== \"api\"),\n );\n\n if (!baseApiPlugin) {\n rpcHandler = null;\n openApiHandler = null;\n return;\n }\n\n rpcHandler = new RPCHandler(stitchedRouter as any, {\n plugins: [new BatchHandlerPlugin()],\n });\n openApiHandler = new OpenAPIHandler(stitchedRouter as any, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n });\n };\n\n const ensureApiPluginLoaded = async (): Promise<LoadedPluginsResult | null> => {\n if (apiPlugins.length > 0) return { base: baseApiPlugin, plugins: apiPlugins, errors: [] };\n if (!runtimeConfig.api) return null;\n if (apiPluginLoading) return apiPluginLoading;\n\n apiPluginLoading = loadApiPluginsFromRuntimeConfig(runtimeConfig, process.env as any)\n .then((loaded) => {\n if (loaded) {\n apiPlugins = loaded.plugins;\n baseApiPlugin = loaded.base;\n apiPluginError =\n loaded.errors.length > 0 ? loaded.errors.map((item) => item.error).join(\"; \") : null;\n initApiHandlers();\n }\n return loaded;\n })\n .catch((e) => {\n apiPluginError = e instanceof Error ? e.message : String(e);\n return null;\n })\n .finally(() => {\n apiPluginLoading = null;\n });\n\n return apiPluginLoading;\n };\n\n const ensureRouterModuleLoaded = async (): Promise<RouterModule | null> => {\n if (ssrRouterModule) {\n return ssrRouterModule;\n }\n\n if (ssrRouterLoading) {\n return ssrRouterLoading;\n }\n\n ssrRouterLoading = loadRouterModule(runtimeConfig)\n .then((routerModule) => {\n ssrRouterModule = routerModule;\n ssrRouterError = null;\n return routerModule;\n })\n .catch((error) => {\n ssrRouterError = error instanceof Error ? error.message : String(error);\n return null;\n })\n .finally(() => {\n ssrRouterLoading = null;\n });\n\n return ssrRouterLoading;\n };\n\n // Kick off API plugin load in the background; host should still start even if\n // the remote isn't ready yet.\n void ensureApiPluginLoaded();\n void ensureRouterModuleLoaded();\n\n const app = new Hono();\n\n const corsOrigins = process.env.CORS_ORIGIN?.split(\",\").map((o) => o.trim()) ?? [\n runtimeConfig.hostUrl,\n ...(runtimeConfig.ui?.url ? [runtimeConfig.ui.url] : []),\n ];\n\n if (!process.env.CORS_ORIGIN && runtimeConfig.env === \"production\") {\n console.warn(\n \"[Security] CORS_ORIGIN is not set in production. Using host and UI URLs as allowed origins.\",\n );\n }\n\n app.use(\n \"/*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n );\n\n app.use(\"*\", secureHeaders());\n\n app.get(\"/health\", (c) => c.text(\"OK\"));\n app.get(\"/ready\", async (c) => {\n type Check = {\n name: string;\n url: string;\n required: boolean;\n ok: boolean;\n status?: number;\n latencyMs?: number;\n error?: string;\n };\n\n const probe = async (url: string, timeoutMs = 400): Promise<Check> => {\n const started = Date.now();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return {\n name: \"\",\n url,\n required: true,\n ok: res.ok,\n status: res.status,\n latencyMs: Date.now() - started,\n };\n } catch (e) {\n return {\n name: \"\",\n url,\n required: true,\n ok: false,\n latencyMs: Date.now() - started,\n error: e instanceof Error ? e.message : String(e),\n };\n } finally {\n clearTimeout(timer);\n }\n };\n\n const checks: Check[] = [];\n\n if (runtimeConfig.ui?.url) {\n const base = runtimeConfig.ui.url.replace(/\\/$/, \"\");\n const manifest = await probe(`${base}/mf-manifest.json`);\n manifest.name = \"ui\";\n // mf-manifest.json is preferred but not always present; fall back to\n // remoteEntry.js for readiness.\n manifest.required = false;\n checks.push(manifest);\n if (!manifest.ok) {\n const remoteEntry = await probe(`${base}/remoteEntry.js`);\n remoteEntry.name = \"ui\";\n remoteEntry.required = true;\n checks.push(remoteEntry);\n } else {\n manifest.required = true;\n }\n }\n\n if (runtimeConfig.ui?.ssrUrl) {\n const base = runtimeConfig.ui.ssrUrl.replace(/\\/$/, \"\");\n const ssr = await probe(`${base}/`);\n ssr.name = \"ui-ssr\";\n ssr.required = false;\n checks.push(ssr);\n }\n\n if (runtimeConfig.api?.url) {\n const base = runtimeConfig.api.url.replace(/\\/$/, \"\");\n const api = await probe(`${base}/`);\n api.name = \"api\";\n api.required = true;\n checks.push(api);\n }\n\n if (runtimeConfig.api) {\n checks.push({\n name: \"api-plugin\",\n url: runtimeConfig.api.entry,\n required: true,\n ok: baseApiPlugin !== null,\n status: baseApiPlugin !== null ? 200 : 503,\n error:\n baseApiPlugin !== null\n ? undefined\n : apiPluginLoading\n ? \"loading\"\n : (apiPluginError ?? \"not loaded\"),\n });\n if (!baseApiPlugin && !apiPluginLoading) {\n void ensureApiPluginLoaded();\n }\n }\n\n for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) {\n const loaded = apiPlugins.find((item) => item.key === key);\n checks.push({\n name: key,\n url: plugin.entry,\n required: true,\n ok: Boolean(loaded),\n status: loaded ? 200 : 503,\n error: loaded ? undefined : (apiPluginError ?? \"not loaded\"),\n });\n }\n\n const allRequiredOk = checks.filter((x) => x.required).every((x) => x.ok);\n\n return c.json(\n {\n status: allRequiredOk ? \"ready\" : \"not_ready\",\n host: {\n url: runtimeConfig.hostUrl,\n env: runtimeConfig.env,\n },\n checks,\n timestamp: new Date().toISOString(),\n },\n allRequiredOk ? 200 : 503,\n );\n });\n app.get(\"/api/_health\", (c) =>\n c.json({\n status: \"ready\",\n mode: runtimeConfig.env,\n ui: runtimeConfig.ui?.url ?? null,\n uiSsr: runtimeConfig.ui?.ssrUrl ?? null,\n ssrRouterLoaded: ssrRouterModule !== null,\n ssrRouterLoading: ssrRouterLoading !== null,\n ssrRouterError,\n api: runtimeConfig.api?.url ?? null,\n apiPluginLoaded: baseApiPlugin !== null,\n apiPluginLoading: apiPluginLoading !== null,\n apiPluginError,\n }),\n );\n\n app.all(\"/api/rpc/*\", async (c) => {\n if (!rpcHandler) {\n await ensureApiPluginLoaded();\n }\n if (!rpcHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await rpcHandler.handle(c.req.raw, {\n prefix: \"/api/rpc\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n app.all(\"/api/*\", async (c) => {\n if (!openApiHandler) {\n await ensureApiPluginLoaded();\n }\n if (!openApiHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await openApiHandler.handle(c.req.raw, {\n prefix: \"/api\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n if (runtimeConfig.ui) {\n app.all(\"/__mf/ui/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.url}${c.req.path.replace(\"/__mf/ui\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n\n if (runtimeConfig.ui.ssrUrl) {\n app.all(\"/__mf/ui/ssr/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.ssrUrl}${c.req.path.replace(\"/__mf/ui/ssr\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n }\n }\n\n app.get(\"*\", async (c) => {\n const routerModule = await ensureRouterModuleLoaded();\n\n if (!routerModule) {\n return c.html(renderLoadingShell(clientRuntimeConfig, ssrRouterError), 503);\n }\n\n try {\n const apiClient = baseApiPlugin?.createClient();\n\n const result = await routerModule.renderToStream(c.req.raw, {\n assetsUrl: runtimeConfig.ui.url,\n runtimeConfig: clientRuntimeConfig,\n apiClient,\n });\n\n return new Response(result.stream, {\n status: result.statusCode,\n headers: result.headers,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return c.html(renderLoadingShell(clientRuntimeConfig, message), 500);\n }\n });\n\n const hostname = process.env.HOST ?? \"0.0.0.0\";\n let resolveReady: (() => void) | null = null;\n const ready = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n\n const proxiedFetch = (req: Request): Response | Promise<Response> => {\n const url = new URL(req.url);\n const forwardedProto = req.headers.get(\"x-forwarded-proto\");\n const forwardedHost = req.headers.get(\"x-forwarded-host\");\n\n if (forwardedProto) {\n url.protocol = forwardedProto;\n }\n if (forwardedHost) {\n url.host = forwardedHost;\n }\n\n if (forwardedProto || forwardedHost) {\n req = new Request(url, req);\n }\n\n return app.fetch(req);\n };\n\n const server = serve({ fetch: proxiedFetch, port, hostname }, (info) => {\n console.log(`[Host] Server running at http://${hostname}:${info.port}`);\n console.log(`[Host] API: http://${hostname}:${info.port}/api/rpc`);\n resolveReady?.();\n });\n\n await ready;\n\n return {\n shutdown: () =>\n new Promise<void>((resolve) => {\n try {\n server.close(() => resolve());\n } catch {\n resolve();\n }\n }),\n };\n}\n\nexport { runHostServer };\n"],"mappings":"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"}
1
+ {"version":3,"file":"host.cjs","names":["createStitchedRouter","RPCHandler","BatchHandlerPlugin","OpenAPIHandler","OpenAPIReferencePlugin","ZodToJsonSchemaConverter","loadApiPluginsFromRuntimeConfig","loadRouterModule","Hono"],"sources":["../src/host.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { BatchHandlerPlugin } from \"@orpc/server/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { secureHeaders } from \"hono/secure-headers\";\nimport {\n createStitchedRouter,\n type LoadedPluginResult,\n type LoadedPluginsResult,\n loadApiPluginsFromRuntimeConfig,\n} from \"./api\";\nimport { loadRouterModule, type RouterModule } from \"./federation.server\";\nimport type { ClientRuntimeConfig, RuntimeConfig } from \"./types\";\n\nexport interface HostServerConfig {\n runtimeConfig: RuntimeConfig;\n configDir: string;\n port?: number;\n}\n\nexport interface HostServerHandle {\n ready: Promise<void>;\n shutdown: () => Promise<void>;\n}\n\nfunction buildClientRuntimeConfig(runtimeConfig: RuntimeConfig): ClientRuntimeConfig {\n return {\n env: runtimeConfig.env,\n account: runtimeConfig.account,\n networkId: runtimeConfig.networkId,\n hostUrl: runtimeConfig.hostUrl,\n assetsUrl: runtimeConfig.ui.url,\n apiBase: \"/api\",\n rpcBase: \"/api/rpc\",\n ui: runtimeConfig.ui\n ? {\n name: runtimeConfig.ui.name,\n url: runtimeConfig.ui.url,\n entry: runtimeConfig.ui.entry,\n integrity: runtimeConfig.ui.integrity,\n }\n : undefined,\n api: runtimeConfig.api\n ? {\n name: runtimeConfig.api.name,\n url: runtimeConfig.api.url,\n entry: runtimeConfig.api.entry,\n integrity: runtimeConfig.api.integrity,\n }\n : undefined,\n plugins: runtimeConfig.plugins\n ? Object.fromEntries(\n Object.entries(runtimeConfig.plugins).map(([key, plugin]) => [\n key,\n {\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n integrity: plugin.integrity,\n },\n ]),\n )\n : undefined,\n };\n}\n\nfunction renderLoadingShell(runtimeConfig: ClientRuntimeConfig, error?: string | null) {\n const bootstrap = `window.__RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};window.addEventListener('load', function handleEverythingDevHydrate() { window.__hydrate?.(); }, { once: true });`;\n const errorMarkup = error\n ? `<p style=\"color: #fca5a5;\">Error loading UI: ${escapeHtml(error)}</p>`\n : \"<p>Loading UI...</p>\";\n\n const uiIntegrity = runtimeConfig.ui?.integrity;\n const sriAttr = uiIntegrity ? ` integrity=\"${uiIntegrity}\" crossorigin=\"anonymous\"` : \"\";\n\n return `\n\t\t<!DOCTYPE html>\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<meta charset=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\t\t\t\t<title>Loading...</title>\n\t\t\t\t<style>\n\t\t\t\t\tbody { background: #171717; color: #fafafa; display: flex; align-items: center; justify-content: center; height: 100vh; font-family: system-ui; }\n\t\t\t\t\t.fade { animation: fadeIn 0.3s ease-in; text-align: center; padding: 2rem; }\n\t\t\t\t\t@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n\t\t\t\t</style>\n\t\t\t\t${runtimeConfig.assetsUrl ? `<script src=\"${runtimeConfig.assetsUrl}/remoteEntry.js\"${sriAttr}></script>` : \"\"}\n\t\t\t\t<script>${bootstrap}</script>\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t<div id=\"root\" class=\"fade\">${errorMarkup}</div>\n\t\t\t</body>\n\t\t</html>\n\t`;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nexport function createHostServer(config: HostServerConfig): HostServerHandle {\n const port = config.port ?? 3000;\n const { runtimeConfig } = config;\n\n let shutdownImpl: (() => Promise<void>) | null = null;\n\n const ready = (async () => {\n const started = await runHostServer({ runtimeConfig, port });\n shutdownImpl = started.shutdown;\n })();\n\n const shutdown = async () => {\n console.log(\"[Host] Shutting down...\");\n const timeout = setTimeout(() => {\n console.log(\"[Host] Force exit\");\n process.exit(0);\n }, 5000);\n await ready.catch(() => {});\n if (shutdownImpl) {\n await shutdownImpl().catch(() => {});\n }\n clearTimeout(timeout);\n console.log(\"[Host] Shutdown complete\");\n };\n\n return { ready, shutdown };\n}\n\nasync function runHostServer(opts: {\n runtimeConfig: RuntimeConfig;\n port: number;\n}): Promise<{ shutdown: () => Promise<void> }> {\n const { runtimeConfig, port } = opts;\n\n let apiPlugins: LoadedPluginResult[] = [];\n let baseApiPlugin: LoadedPluginResult | null = null;\n let apiPluginError: string | null = null;\n let apiPluginLoading: Promise<LoadedPluginsResult | null> | null = null;\n let ssrRouterModule: RouterModule | null = null;\n let ssrRouterError: string | null = null;\n let ssrRouterLoading: Promise<RouterModule | null> | null = null;\n let rpcHandler: RPCHandler<any> | null = null;\n let openApiHandler: OpenAPIHandler<any> | null = null;\n\n const clientRuntimeConfig = buildClientRuntimeConfig(runtimeConfig);\n\n const initApiHandlers = () => {\n const baseRouter = baseApiPlugin?.router ?? {};\n const stitchedRouter = createStitchedRouter(\n baseRouter,\n apiPlugins.filter((plugin) => plugin.key !== \"api\"),\n );\n\n if (!baseApiPlugin) {\n rpcHandler = null;\n openApiHandler = null;\n return;\n }\n\n rpcHandler = new RPCHandler(stitchedRouter as any, {\n plugins: [new BatchHandlerPlugin()],\n });\n openApiHandler = new OpenAPIHandler(stitchedRouter as any, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n });\n };\n\n const ensureApiPluginLoaded = async (): Promise<LoadedPluginsResult | null> => {\n if (apiPlugins.length > 0) return { base: baseApiPlugin, plugins: apiPlugins, errors: [] };\n if (!runtimeConfig.api) return null;\n if (apiPluginLoading) return apiPluginLoading;\n\n apiPluginLoading = loadApiPluginsFromRuntimeConfig(runtimeConfig, process.env as any)\n .then((loaded) => {\n if (loaded) {\n apiPlugins = loaded.plugins;\n baseApiPlugin = loaded.base;\n apiPluginError =\n loaded.errors.length > 0 ? loaded.errors.map((item) => item.error).join(\"; \") : null;\n initApiHandlers();\n }\n return loaded;\n })\n .catch((e) => {\n apiPluginError = e instanceof Error ? e.message : String(e);\n return null;\n })\n .finally(() => {\n apiPluginLoading = null;\n });\n\n return apiPluginLoading;\n };\n\n const ensureRouterModuleLoaded = async (): Promise<RouterModule | null> => {\n if (ssrRouterModule) {\n return ssrRouterModule;\n }\n\n if (ssrRouterLoading) {\n return ssrRouterLoading;\n }\n\n ssrRouterLoading = loadRouterModule(runtimeConfig)\n .then((routerModule) => {\n ssrRouterModule = routerModule;\n ssrRouterError = null;\n return routerModule;\n })\n .catch((error) => {\n ssrRouterError = error instanceof Error ? error.message : String(error);\n return null;\n })\n .finally(() => {\n ssrRouterLoading = null;\n });\n\n return ssrRouterLoading;\n };\n\n // Kick off API plugin load in the background; host should still start even if\n // the remote isn't ready yet.\n void ensureApiPluginLoaded();\n void ensureRouterModuleLoaded();\n\n const app = new Hono();\n\n const corsOrigins = process.env.CORS_ORIGIN?.split(\",\").map((o) => o.trim()) ?? [\n runtimeConfig.hostUrl,\n ...(runtimeConfig.ui?.url ? [runtimeConfig.ui.url] : []),\n ];\n\n if (!process.env.CORS_ORIGIN && runtimeConfig.env === \"production\") {\n console.warn(\n \"[Security] CORS_ORIGIN is not set in production. Using host and UI URLs as allowed origins.\",\n );\n }\n\n app.use(\n \"/*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n );\n\n app.use(\"*\", secureHeaders({ crossOriginOpenerPolicy: \"same-origin-allow-popups\" }));\n\n app.get(\"/health\", (c) => c.text(\"OK\"));\n app.get(\"/ready\", async (c) => {\n type Check = {\n name: string;\n url: string;\n required: boolean;\n ok: boolean;\n status?: number;\n latencyMs?: number;\n error?: string;\n };\n\n const probe = async (url: string, timeoutMs = 400): Promise<Check> => {\n const started = Date.now();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return {\n name: \"\",\n url,\n required: true,\n ok: res.ok,\n status: res.status,\n latencyMs: Date.now() - started,\n };\n } catch (e) {\n return {\n name: \"\",\n url,\n required: true,\n ok: false,\n latencyMs: Date.now() - started,\n error: e instanceof Error ? e.message : String(e),\n };\n } finally {\n clearTimeout(timer);\n }\n };\n\n const checks: Check[] = [];\n\n if (runtimeConfig.ui?.url) {\n const base = runtimeConfig.ui.url.replace(/\\/$/, \"\");\n const manifest = await probe(`${base}/mf-manifest.json`);\n manifest.name = \"ui\";\n // mf-manifest.json is preferred but not always present; fall back to\n // remoteEntry.js for readiness.\n manifest.required = false;\n checks.push(manifest);\n if (!manifest.ok) {\n const remoteEntry = await probe(`${base}/remoteEntry.js`);\n remoteEntry.name = \"ui\";\n remoteEntry.required = true;\n checks.push(remoteEntry);\n } else {\n manifest.required = true;\n }\n }\n\n if (runtimeConfig.ui?.ssrUrl) {\n const base = runtimeConfig.ui.ssrUrl.replace(/\\/$/, \"\");\n const ssr = await probe(`${base}/`);\n ssr.name = \"ui-ssr\";\n ssr.required = false;\n checks.push(ssr);\n }\n\n if (runtimeConfig.api?.url) {\n const base = runtimeConfig.api.url.replace(/\\/$/, \"\");\n const api = await probe(`${base}/`);\n api.name = \"api\";\n api.required = true;\n checks.push(api);\n }\n\n if (runtimeConfig.api) {\n checks.push({\n name: \"api-plugin\",\n url: runtimeConfig.api.entry,\n required: true,\n ok: baseApiPlugin !== null,\n status: baseApiPlugin !== null ? 200 : 503,\n error:\n baseApiPlugin !== null\n ? undefined\n : apiPluginLoading\n ? \"loading\"\n : (apiPluginError ?? \"not loaded\"),\n });\n if (!baseApiPlugin && !apiPluginLoading) {\n void ensureApiPluginLoaded();\n }\n }\n\n for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) {\n const loaded = apiPlugins.find((item) => item.key === key);\n checks.push({\n name: key,\n url: plugin.entry,\n required: true,\n ok: Boolean(loaded),\n status: loaded ? 200 : 503,\n error: loaded ? undefined : (apiPluginError ?? \"not loaded\"),\n });\n }\n\n const allRequiredOk = checks.filter((x) => x.required).every((x) => x.ok);\n\n return c.json(\n {\n status: allRequiredOk ? \"ready\" : \"not_ready\",\n host: {\n url: runtimeConfig.hostUrl,\n env: runtimeConfig.env,\n },\n checks,\n timestamp: new Date().toISOString(),\n },\n allRequiredOk ? 200 : 503,\n );\n });\n app.get(\"/api/_health\", (c) =>\n c.json({\n status: \"ready\",\n mode: runtimeConfig.env,\n ui: runtimeConfig.ui?.url ?? null,\n uiSsr: runtimeConfig.ui?.ssrUrl ?? null,\n ssrRouterLoaded: ssrRouterModule !== null,\n ssrRouterLoading: ssrRouterLoading !== null,\n ssrRouterError,\n api: runtimeConfig.api?.url ?? null,\n apiPluginLoaded: baseApiPlugin !== null,\n apiPluginLoading: apiPluginLoading !== null,\n apiPluginError,\n }),\n );\n\n app.all(\"/api/rpc/*\", async (c) => {\n if (!rpcHandler) {\n await ensureApiPluginLoaded();\n }\n if (!rpcHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await rpcHandler.handle(c.req.raw, {\n prefix: \"/api/rpc\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n app.all(\"/api/*\", async (c) => {\n if (!openApiHandler) {\n await ensureApiPluginLoaded();\n }\n if (!openApiHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await openApiHandler.handle(c.req.raw, {\n prefix: \"/api\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n if (runtimeConfig.ui) {\n app.all(\"/__mf/ui/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.url}${c.req.path.replace(\"/__mf/ui\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n\n if (runtimeConfig.ui.ssrUrl) {\n app.all(\"/__mf/ui/ssr/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.ssrUrl}${c.req.path.replace(\"/__mf/ui/ssr\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n }\n }\n\n app.get(\"*\", async (c) => {\n const routerModule = await ensureRouterModuleLoaded();\n\n if (!routerModule) {\n return c.html(renderLoadingShell(clientRuntimeConfig, ssrRouterError), 503);\n }\n\n try {\n const apiClient = baseApiPlugin?.createClient();\n\n const result = await routerModule.renderToStream(c.req.raw, {\n assetsUrl: runtimeConfig.ui.url,\n runtimeConfig: clientRuntimeConfig,\n apiClient,\n });\n\n return new Response(result.stream, {\n status: result.statusCode,\n headers: result.headers,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return c.html(renderLoadingShell(clientRuntimeConfig, message), 500);\n }\n });\n\n const hostname = process.env.HOST ?? \"0.0.0.0\";\n let resolveReady: (() => void) | null = null;\n const ready = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n\n const proxiedFetch = (req: Request): Response | Promise<Response> => {\n const url = new URL(req.url);\n const forwardedProto = req.headers.get(\"x-forwarded-proto\");\n const forwardedHost = req.headers.get(\"x-forwarded-host\");\n\n if (forwardedProto) {\n url.protocol = forwardedProto;\n }\n if (forwardedHost) {\n url.host = forwardedHost;\n }\n\n if (forwardedProto || forwardedHost) {\n req = new Request(url, req);\n }\n\n return app.fetch(req);\n };\n\n const server = serve({ fetch: proxiedFetch, port, hostname }, (info) => {\n console.log(`[Host] Server running at http://${hostname}:${info.port}`);\n console.log(`[Host] API: http://${hostname}:${info.port}/api/rpc`);\n resolveReady?.();\n });\n\n await ready;\n\n return {\n shutdown: () =>\n new Promise<void>((resolve) => {\n try {\n server.close(() => resolve());\n } catch {\n resolve();\n }\n }),\n };\n}\n\nexport { runHostServer };\n"],"mappings":";;;;;;;;;;;;;;;AA6BA,SAAS,yBAAyB,eAAmD;AACnF,QAAO;EACL,KAAK,cAAc;EACnB,SAAS,cAAc;EACvB,WAAW,cAAc;EACzB,SAAS,cAAc;EACvB,WAAW,cAAc,GAAG;EAC5B,SAAS;EACT,SAAS;EACT,IAAI,cAAc,KACd;GACE,MAAM,cAAc,GAAG;GACvB,KAAK,cAAc,GAAG;GACtB,OAAO,cAAc,GAAG;GACxB,WAAW,cAAc,GAAG;GAC7B,GACD;EACJ,KAAK,cAAc,MACf;GACE,MAAM,cAAc,IAAI;GACxB,KAAK,cAAc,IAAI;GACvB,OAAO,cAAc,IAAI;GACzB,WAAW,cAAc,IAAI;GAC9B,GACD;EACJ,SAAS,cAAc,UACnB,OAAO,YACL,OAAO,QAAQ,cAAc,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,CAC3D,KACA;GACE,MAAM,OAAO;GACb,KAAK,OAAO;GACZ,OAAO,OAAO;GACd,WAAW,OAAO;GACnB,CACF,CAAC,CACH,GACD;EACL;;AAGH,SAAS,mBAAmB,eAAoC,OAAuB;CACrF,MAAM,YAAY,+BAA+B,KAAK,UAAU,cAAc,CAAC;CAC/E,MAAM,cAAc,QAChB,gDAAgD,WAAW,MAAM,CAAC,QAClE;CAEJ,MAAM,cAAc,cAAc,IAAI;CACtC,MAAM,UAAU,cAAc,eAAe,YAAY,6BAA6B;AAEtF,QAAO;;;;;;;;;;;;MAYH,cAAc,YAAY,gBAAgB,cAAc,UAAU,kBAAkB,QAAQ,eAAc,GAAG;cACrG,UAAU;;;kCAGU,YAAY;;;;;AAM9C,SAAS,WAAW,OAAe;AACjC,QAAO,MACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,QAAQ;;AAG7B,SAAgB,iBAAiB,QAA4C;CAC3E,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,EAAE,kBAAkB;CAE1B,IAAI,eAA6C;CAEjD,MAAM,SAAS,YAAY;AAEzB,kBADgB,MAAM,cAAc;GAAE;GAAe;GAAM,CAAC,EACrC;KACrB;CAEJ,MAAM,WAAW,YAAY;AAC3B,UAAQ,IAAI,0BAA0B;EACtC,MAAM,UAAU,iBAAiB;AAC/B,WAAQ,IAAI,oBAAoB;AAChC,WAAQ,KAAK,EAAE;KACd,IAAK;AACR,QAAM,MAAM,YAAY,GAAG;AAC3B,MAAI,aACF,OAAM,cAAc,CAAC,YAAY,GAAG;AAEtC,eAAa,QAAQ;AACrB,UAAQ,IAAI,2BAA2B;;AAGzC,QAAO;EAAE;EAAO;EAAU;;AAG5B,eAAe,cAAc,MAGkB;CAC7C,MAAM,EAAE,eAAe,SAAS;CAEhC,IAAI,aAAmC,EAAE;CACzC,IAAI,gBAA2C;CAC/C,IAAI,iBAAgC;CACpC,IAAI,mBAA+D;CACnE,IAAI,kBAAuC;CAC3C,IAAI,iBAAgC;CACpC,IAAI,mBAAwD;CAC5D,IAAI,aAAqC;CACzC,IAAI,iBAA6C;CAEjD,MAAM,sBAAsB,yBAAyB,cAAc;CAEnE,MAAM,wBAAwB;EAE5B,MAAM,iBAAiBA,iCADJ,eAAe,UAAU,EAAE,EAG5C,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,CACpD;AAED,MAAI,CAAC,eAAe;AAClB,gBAAa;AACb,oBAAiB;AACjB;;AAGF,eAAa,IAAIC,8BAAW,gBAAuB,EACjD,SAAS,CAAC,IAAIC,yCAAoB,CAAC,EACpC,CAAC;AACF,mBAAiB,IAAIC,mCAAe,gBAAuB,EACzD,SAAS,CACP,IAAIC,6CAAuB,EACzB,kBAAkB,CAAC,IAAIC,yCAA0B,CAAC,EACnD,CAAC,CACH,EACF,CAAC;;CAGJ,MAAM,wBAAwB,YAAiD;AAC7E,MAAI,WAAW,SAAS,EAAG,QAAO;GAAE,MAAM;GAAe,SAAS;GAAY,QAAQ,EAAE;GAAE;AAC1F,MAAI,CAAC,cAAc,IAAK,QAAO;AAC/B,MAAI,iBAAkB,QAAO;AAE7B,qBAAmBC,4CAAgC,eAAe,QAAQ,IAAW,CAClF,MAAM,WAAW;AAChB,OAAI,QAAQ;AACV,iBAAa,OAAO;AACpB,oBAAgB,OAAO;AACvB,qBACE,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,KAAK,SAAS,KAAK,MAAM,CAAC,KAAK,KAAK,GAAG;AAClF,qBAAiB;;AAEnB,UAAO;IACP,CACD,OAAO,MAAM;AACZ,oBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC3D,UAAO;IACP,CACD,cAAc;AACb,sBAAmB;IACnB;AAEJ,SAAO;;CAGT,MAAM,2BAA2B,YAA0C;AACzE,MAAI,gBACF,QAAO;AAGT,MAAI,iBACF,QAAO;AAGT,qBAAmBC,2CAAiB,cAAc,CAC/C,MAAM,iBAAiB;AACtB,qBAAkB;AAClB,oBAAiB;AACjB,UAAO;IACP,CACD,OAAO,UAAU;AAChB,oBAAiB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACvE,UAAO;IACP,CACD,cAAc;AACb,sBAAmB;IACnB;AAEJ,SAAO;;AAKT,CAAK,uBAAuB;AAC5B,CAAK,0BAA0B;CAE/B,MAAM,MAAM,IAAIC,WAAM;CAEtB,MAAM,cAAc,QAAQ,IAAI,aAAa,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,CAC9E,cAAc,SACd,GAAI,cAAc,IAAI,MAAM,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CACxD;AAED,KAAI,CAAC,QAAQ,IAAI,eAAe,cAAc,QAAQ,aACpD,SAAQ,KACN,8FACD;AAGH,KAAI,IACF,0BACK;EACH,QAAQ;EACR,aAAa;EACd,CAAC,CACH;AAED,KAAI,IAAI,4CAAmB,EAAE,yBAAyB,4BAA4B,CAAC,CAAC;AAEpF,KAAI,IAAI,YAAY,MAAM,EAAE,KAAK,KAAK,CAAC;AACvC,KAAI,IAAI,UAAU,OAAO,MAAM;EAW7B,MAAM,QAAQ,OAAO,KAAa,YAAY,QAAwB;GACpE,MAAM,UAAU,KAAK,KAAK;GAC1B,MAAM,aAAa,IAAI,iBAAiB;GACxC,MAAM,QAAQ,iBAAiB,WAAW,OAAO,EAAE,UAAU;AAC7D,OAAI;IACF,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,QAAQ,CAAC;AAC3D,WAAO;KACL,MAAM;KACN;KACA,UAAU;KACV,IAAI,IAAI;KACR,QAAQ,IAAI;KACZ,WAAW,KAAK,KAAK,GAAG;KACzB;YACM,GAAG;AACV,WAAO;KACL,MAAM;KACN;KACA,UAAU;KACV,IAAI;KACJ,WAAW,KAAK,KAAK,GAAG;KACxB,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;KAClD;aACO;AACR,iBAAa,MAAM;;;EAIvB,MAAM,SAAkB,EAAE;AAE1B,MAAI,cAAc,IAAI,KAAK;GACzB,MAAM,OAAO,cAAc,GAAG,IAAI,QAAQ,OAAO,GAAG;GACpD,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,mBAAmB;AACxD,YAAS,OAAO;AAGhB,YAAS,WAAW;AACpB,UAAO,KAAK,SAAS;AACrB,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,cAAc,MAAM,MAAM,GAAG,KAAK,iBAAiB;AACzD,gBAAY,OAAO;AACnB,gBAAY,WAAW;AACvB,WAAO,KAAK,YAAY;SAExB,UAAS,WAAW;;AAIxB,MAAI,cAAc,IAAI,QAAQ;GAE5B,MAAM,MAAM,MAAM,MAAM,GADX,cAAc,GAAG,OAAO,QAAQ,OAAO,GAAG,CACvB,GAAG;AACnC,OAAI,OAAO;AACX,OAAI,WAAW;AACf,UAAO,KAAK,IAAI;;AAGlB,MAAI,cAAc,KAAK,KAAK;GAE1B,MAAM,MAAM,MAAM,MAAM,GADX,cAAc,IAAI,IAAI,QAAQ,OAAO,GAAG,CACrB,GAAG;AACnC,OAAI,OAAO;AACX,OAAI,WAAW;AACf,UAAO,KAAK,IAAI;;AAGlB,MAAI,cAAc,KAAK;AACrB,UAAO,KAAK;IACV,MAAM;IACN,KAAK,cAAc,IAAI;IACvB,UAAU;IACV,IAAI,kBAAkB;IACtB,QAAQ,kBAAkB,OAAO,MAAM;IACvC,OACE,kBAAkB,OACd,SACA,mBACE,YACC,kBAAkB;IAC5B,CAAC;AACF,OAAI,CAAC,iBAAiB,CAAC,iBACrB,CAAK,uBAAuB;;AAIhC,OAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,cAAc,WAAW,EAAE,CAAC,EAAE;GACvE,MAAM,SAAS,WAAW,MAAM,SAAS,KAAK,QAAQ,IAAI;AAC1D,UAAO,KAAK;IACV,MAAM;IACN,KAAK,OAAO;IACZ,UAAU;IACV,IAAI,QAAQ,OAAO;IACnB,QAAQ,SAAS,MAAM;IACvB,OAAO,SAAS,SAAa,kBAAkB;IAChD,CAAC;;EAGJ,MAAM,gBAAgB,OAAO,QAAQ,MAAM,EAAE,SAAS,CAAC,OAAO,MAAM,EAAE,GAAG;AAEzE,SAAO,EAAE,KACP;GACE,QAAQ,gBAAgB,UAAU;GAClC,MAAM;IACJ,KAAK,cAAc;IACnB,KAAK,cAAc;IACpB;GACD;GACA,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC,EACD,gBAAgB,MAAM,IACvB;GACD;AACF,KAAI,IAAI,iBAAiB,MACvB,EAAE,KAAK;EACL,QAAQ;EACR,MAAM,cAAc;EACpB,IAAI,cAAc,IAAI,OAAO;EAC7B,OAAO,cAAc,IAAI,UAAU;EACnC,iBAAiB,oBAAoB;EACrC,kBAAkB,qBAAqB;EACvC;EACA,KAAK,cAAc,KAAK,OAAO;EAC/B,iBAAiB,kBAAkB;EACnC,kBAAkB,qBAAqB;EACvC;EACD,CAAC,CACH;AAED,KAAI,IAAI,cAAc,OAAO,MAAM;AACjC,MAAI,CAAC,WACH,OAAM,uBAAuB;AAE/B,MAAI,CAAC,WACH,QAAO,EAAE,KAAK;GAAE,OAAO;GAAyB,QAAQ;GAAgB,EAAE,IAAI;EAEhF,MAAM,SAAS,MAAM,WAAW,OAAO,EAAE,IAAI,KAAK;GAChD,QAAQ;GACR,SAAS,EAAE;GACZ,CAAC;AACF,SAAO,OAAO,WACV,EAAE,YAAY,OAAO,SAAS,MAAM,OAAO,SAAS,GACpD,EAAE,KAAK,aAAa,IAAI;GAC5B;AAEF,KAAI,IAAI,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,eACH,OAAM,uBAAuB;AAE/B,MAAI,CAAC,eACH,QAAO,EAAE,KAAK;GAAE,OAAO;GAAyB,QAAQ;GAAgB,EAAE,IAAI;EAEhF,MAAM,SAAS,MAAM,eAAe,OAAO,EAAE,IAAI,KAAK;GACpD,QAAQ;GACR,SAAS,EAAE;GACZ,CAAC;AACF,SAAO,OAAO,WACV,EAAE,YAAY,OAAO,SAAS,MAAM,OAAO,SAAS,GACpD,EAAE,KAAK,aAAa,IAAI;GAC5B;AAEF,KAAI,cAAc,IAAI;AACpB,MAAI,IAAI,cAAc,OAAO,MAAM;GACjC,MAAM,YAAY,GAAG,cAAc,GAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,YAAY,GAAG;AAK/E,UAJiB,MAAM,MAAM,WAAW;IACtC,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI,QAAQ;IACxB,CAAC;IAEF;AAEF,MAAI,cAAc,GAAG,OACnB,KAAI,IAAI,kBAAkB,OAAO,MAAM;GACrC,MAAM,YAAY,GAAG,cAAc,GAAI,SAAS,EAAE,IAAI,KAAK,QAAQ,gBAAgB,GAAG;AAKtF,UAJiB,MAAM,MAAM,WAAW;IACtC,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI,QAAQ;IACxB,CAAC;IAEF;;AAIN,KAAI,IAAI,KAAK,OAAO,MAAM;EACxB,MAAM,eAAe,MAAM,0BAA0B;AAErD,MAAI,CAAC,aACH,QAAO,EAAE,KAAK,mBAAmB,qBAAqB,eAAe,EAAE,IAAI;AAG7E,MAAI;GACF,MAAM,YAAY,eAAe,cAAc;GAE/C,MAAM,SAAS,MAAM,aAAa,eAAe,EAAE,IAAI,KAAK;IAC1D,WAAW,cAAc,GAAG;IAC5B,eAAe;IACf;IACD,CAAC;AAEF,UAAO,IAAI,SAAS,OAAO,QAAQ;IACjC,QAAQ,OAAO;IACf,SAAS,OAAO;IACjB,CAAC;WACK,OAAO;GACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,UAAO,EAAE,KAAK,mBAAmB,qBAAqB,QAAQ,EAAE,IAAI;;GAEtE;CAEF,MAAM,WAAW,QAAQ,IAAI,QAAQ;CACrC,IAAI,eAAoC;CACxC,MAAM,QAAQ,IAAI,SAAe,YAAY;AAC3C,iBAAe;GACf;CAEF,MAAM,gBAAgB,QAA+C;EACnE,MAAM,MAAM,IAAI,IAAI,IAAI,IAAI;EAC5B,MAAM,iBAAiB,IAAI,QAAQ,IAAI,oBAAoB;EAC3D,MAAM,gBAAgB,IAAI,QAAQ,IAAI,mBAAmB;AAEzD,MAAI,eACF,KAAI,WAAW;AAEjB,MAAI,cACF,KAAI,OAAO;AAGb,MAAI,kBAAkB,cACpB,OAAM,IAAI,QAAQ,KAAK,IAAI;AAG7B,SAAO,IAAI,MAAM,IAAI;;CAGvB,MAAM,sCAAe;EAAE,OAAO;EAAc;EAAM;EAAU,GAAG,SAAS;AACtE,UAAQ,IAAI,mCAAmC,SAAS,GAAG,KAAK,OAAO;AACvE,UAAQ,IAAI,sBAAsB,SAAS,GAAG,KAAK,KAAK,UAAU;AAClE,kBAAgB;GAChB;AAEF,OAAM;AAEN,QAAO,EACL,gBACE,IAAI,SAAe,YAAY;AAC7B,MAAI;AACF,UAAO,YAAY,SAAS,CAAC;UACvB;AACN,YAAS;;GAEX,EACL"}
package/dist/host.mjs CHANGED
@@ -165,7 +165,7 @@ async function runHostServer(opts) {
165
165
  origin: corsOrigins,
166
166
  credentials: true
167
167
  }));
168
- app.use("*", secureHeaders());
168
+ app.use("*", secureHeaders({ crossOriginOpenerPolicy: "same-origin-allow-popups" }));
169
169
  app.get("/health", (c) => c.text("OK"));
170
170
  app.get("/ready", async (c) => {
171
171
  const probe = async (url, timeoutMs = 400) => {
package/dist/host.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"host.mjs","names":[],"sources":["../src/host.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { BatchHandlerPlugin } from \"@orpc/server/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { secureHeaders } from \"hono/secure-headers\";\nimport {\n createStitchedRouter,\n type LoadedPluginResult,\n type LoadedPluginsResult,\n loadApiPluginsFromRuntimeConfig,\n} from \"./api\";\nimport { loadRouterModule, type RouterModule } from \"./federation.server\";\nimport type { ClientRuntimeConfig, RuntimeConfig } from \"./types\";\n\nexport interface HostServerConfig {\n runtimeConfig: RuntimeConfig;\n configDir: string;\n port?: number;\n}\n\nexport interface HostServerHandle {\n ready: Promise<void>;\n shutdown: () => Promise<void>;\n}\n\nfunction buildClientRuntimeConfig(runtimeConfig: RuntimeConfig): ClientRuntimeConfig {\n return {\n env: runtimeConfig.env,\n account: runtimeConfig.account,\n networkId: runtimeConfig.networkId,\n hostUrl: runtimeConfig.hostUrl,\n assetsUrl: runtimeConfig.ui.url,\n apiBase: \"/api\",\n rpcBase: \"/api/rpc\",\n ui: runtimeConfig.ui\n ? {\n name: runtimeConfig.ui.name,\n url: runtimeConfig.ui.url,\n entry: runtimeConfig.ui.entry,\n integrity: runtimeConfig.ui.integrity,\n }\n : undefined,\n api: runtimeConfig.api\n ? {\n name: runtimeConfig.api.name,\n url: runtimeConfig.api.url,\n entry: runtimeConfig.api.entry,\n integrity: runtimeConfig.api.integrity,\n }\n : undefined,\n plugins: runtimeConfig.plugins\n ? Object.fromEntries(\n Object.entries(runtimeConfig.plugins).map(([key, plugin]) => [\n key,\n {\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n integrity: plugin.integrity,\n },\n ]),\n )\n : undefined,\n };\n}\n\nfunction renderLoadingShell(runtimeConfig: ClientRuntimeConfig, error?: string | null) {\n const bootstrap = `window.__RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};window.addEventListener('load', function handleEverythingDevHydrate() { window.__hydrate?.(); }, { once: true });`;\n const errorMarkup = error\n ? `<p style=\"color: #fca5a5;\">Error loading UI: ${escapeHtml(error)}</p>`\n : \"<p>Loading UI...</p>\";\n\n const uiIntegrity = runtimeConfig.ui?.integrity;\n const sriAttr = uiIntegrity ? ` integrity=\"${uiIntegrity}\" crossorigin=\"anonymous\"` : \"\";\n\n return `\n\t\t<!DOCTYPE html>\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<meta charset=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\t\t\t\t<title>Loading...</title>\n\t\t\t\t<style>\n\t\t\t\t\tbody { background: #171717; color: #fafafa; display: flex; align-items: center; justify-content: center; height: 100vh; font-family: system-ui; }\n\t\t\t\t\t.fade { animation: fadeIn 0.3s ease-in; text-align: center; padding: 2rem; }\n\t\t\t\t\t@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n\t\t\t\t</style>\n\t\t\t\t${runtimeConfig.assetsUrl ? `<script src=\"${runtimeConfig.assetsUrl}/remoteEntry.js\"${sriAttr}></script>` : \"\"}\n\t\t\t\t<script>${bootstrap}</script>\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t<div id=\"root\" class=\"fade\">${errorMarkup}</div>\n\t\t\t</body>\n\t\t</html>\n\t`;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nexport function createHostServer(config: HostServerConfig): HostServerHandle {\n const port = config.port ?? 3000;\n const { runtimeConfig } = config;\n\n let shutdownImpl: (() => Promise<void>) | null = null;\n\n const ready = (async () => {\n const started = await runHostServer({ runtimeConfig, port });\n shutdownImpl = started.shutdown;\n })();\n\n const shutdown = async () => {\n console.log(\"[Host] Shutting down...\");\n const timeout = setTimeout(() => {\n console.log(\"[Host] Force exit\");\n process.exit(0);\n }, 5000);\n await ready.catch(() => {});\n if (shutdownImpl) {\n await shutdownImpl().catch(() => {});\n }\n clearTimeout(timeout);\n console.log(\"[Host] Shutdown complete\");\n };\n\n return { ready, shutdown };\n}\n\nasync function runHostServer(opts: {\n runtimeConfig: RuntimeConfig;\n port: number;\n}): Promise<{ shutdown: () => Promise<void> }> {\n const { runtimeConfig, port } = opts;\n\n let apiPlugins: LoadedPluginResult[] = [];\n let baseApiPlugin: LoadedPluginResult | null = null;\n let apiPluginError: string | null = null;\n let apiPluginLoading: Promise<LoadedPluginsResult | null> | null = null;\n let ssrRouterModule: RouterModule | null = null;\n let ssrRouterError: string | null = null;\n let ssrRouterLoading: Promise<RouterModule | null> | null = null;\n let rpcHandler: RPCHandler<any> | null = null;\n let openApiHandler: OpenAPIHandler<any> | null = null;\n\n const clientRuntimeConfig = buildClientRuntimeConfig(runtimeConfig);\n\n const initApiHandlers = () => {\n const baseRouter = baseApiPlugin?.router ?? {};\n const stitchedRouter = createStitchedRouter(\n baseRouter,\n apiPlugins.filter((plugin) => plugin.key !== \"api\"),\n );\n\n if (!baseApiPlugin) {\n rpcHandler = null;\n openApiHandler = null;\n return;\n }\n\n rpcHandler = new RPCHandler(stitchedRouter as any, {\n plugins: [new BatchHandlerPlugin()],\n });\n openApiHandler = new OpenAPIHandler(stitchedRouter as any, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n });\n };\n\n const ensureApiPluginLoaded = async (): Promise<LoadedPluginsResult | null> => {\n if (apiPlugins.length > 0) return { base: baseApiPlugin, plugins: apiPlugins, errors: [] };\n if (!runtimeConfig.api) return null;\n if (apiPluginLoading) return apiPluginLoading;\n\n apiPluginLoading = loadApiPluginsFromRuntimeConfig(runtimeConfig, process.env as any)\n .then((loaded) => {\n if (loaded) {\n apiPlugins = loaded.plugins;\n baseApiPlugin = loaded.base;\n apiPluginError =\n loaded.errors.length > 0 ? loaded.errors.map((item) => item.error).join(\"; \") : null;\n initApiHandlers();\n }\n return loaded;\n })\n .catch((e) => {\n apiPluginError = e instanceof Error ? e.message : String(e);\n return null;\n })\n .finally(() => {\n apiPluginLoading = null;\n });\n\n return apiPluginLoading;\n };\n\n const ensureRouterModuleLoaded = async (): Promise<RouterModule | null> => {\n if (ssrRouterModule) {\n return ssrRouterModule;\n }\n\n if (ssrRouterLoading) {\n return ssrRouterLoading;\n }\n\n ssrRouterLoading = loadRouterModule(runtimeConfig)\n .then((routerModule) => {\n ssrRouterModule = routerModule;\n ssrRouterError = null;\n return routerModule;\n })\n .catch((error) => {\n ssrRouterError = error instanceof Error ? error.message : String(error);\n return null;\n })\n .finally(() => {\n ssrRouterLoading = null;\n });\n\n return ssrRouterLoading;\n };\n\n // Kick off API plugin load in the background; host should still start even if\n // the remote isn't ready yet.\n void ensureApiPluginLoaded();\n void ensureRouterModuleLoaded();\n\n const app = new Hono();\n\n const corsOrigins = process.env.CORS_ORIGIN?.split(\",\").map((o) => o.trim()) ?? [\n runtimeConfig.hostUrl,\n ...(runtimeConfig.ui?.url ? [runtimeConfig.ui.url] : []),\n ];\n\n if (!process.env.CORS_ORIGIN && runtimeConfig.env === \"production\") {\n console.warn(\n \"[Security] CORS_ORIGIN is not set in production. Using host and UI URLs as allowed origins.\",\n );\n }\n\n app.use(\n \"/*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n );\n\n app.use(\"*\", secureHeaders());\n\n app.get(\"/health\", (c) => c.text(\"OK\"));\n app.get(\"/ready\", async (c) => {\n type Check = {\n name: string;\n url: string;\n required: boolean;\n ok: boolean;\n status?: number;\n latencyMs?: number;\n error?: string;\n };\n\n const probe = async (url: string, timeoutMs = 400): Promise<Check> => {\n const started = Date.now();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return {\n name: \"\",\n url,\n required: true,\n ok: res.ok,\n status: res.status,\n latencyMs: Date.now() - started,\n };\n } catch (e) {\n return {\n name: \"\",\n url,\n required: true,\n ok: false,\n latencyMs: Date.now() - started,\n error: e instanceof Error ? e.message : String(e),\n };\n } finally {\n clearTimeout(timer);\n }\n };\n\n const checks: Check[] = [];\n\n if (runtimeConfig.ui?.url) {\n const base = runtimeConfig.ui.url.replace(/\\/$/, \"\");\n const manifest = await probe(`${base}/mf-manifest.json`);\n manifest.name = \"ui\";\n // mf-manifest.json is preferred but not always present; fall back to\n // remoteEntry.js for readiness.\n manifest.required = false;\n checks.push(manifest);\n if (!manifest.ok) {\n const remoteEntry = await probe(`${base}/remoteEntry.js`);\n remoteEntry.name = \"ui\";\n remoteEntry.required = true;\n checks.push(remoteEntry);\n } else {\n manifest.required = true;\n }\n }\n\n if (runtimeConfig.ui?.ssrUrl) {\n const base = runtimeConfig.ui.ssrUrl.replace(/\\/$/, \"\");\n const ssr = await probe(`${base}/`);\n ssr.name = \"ui-ssr\";\n ssr.required = false;\n checks.push(ssr);\n }\n\n if (runtimeConfig.api?.url) {\n const base = runtimeConfig.api.url.replace(/\\/$/, \"\");\n const api = await probe(`${base}/`);\n api.name = \"api\";\n api.required = true;\n checks.push(api);\n }\n\n if (runtimeConfig.api) {\n checks.push({\n name: \"api-plugin\",\n url: runtimeConfig.api.entry,\n required: true,\n ok: baseApiPlugin !== null,\n status: baseApiPlugin !== null ? 200 : 503,\n error:\n baseApiPlugin !== null\n ? undefined\n : apiPluginLoading\n ? \"loading\"\n : (apiPluginError ?? \"not loaded\"),\n });\n if (!baseApiPlugin && !apiPluginLoading) {\n void ensureApiPluginLoaded();\n }\n }\n\n for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) {\n const loaded = apiPlugins.find((item) => item.key === key);\n checks.push({\n name: key,\n url: plugin.entry,\n required: true,\n ok: Boolean(loaded),\n status: loaded ? 200 : 503,\n error: loaded ? undefined : (apiPluginError ?? \"not loaded\"),\n });\n }\n\n const allRequiredOk = checks.filter((x) => x.required).every((x) => x.ok);\n\n return c.json(\n {\n status: allRequiredOk ? \"ready\" : \"not_ready\",\n host: {\n url: runtimeConfig.hostUrl,\n env: runtimeConfig.env,\n },\n checks,\n timestamp: new Date().toISOString(),\n },\n allRequiredOk ? 200 : 503,\n );\n });\n app.get(\"/api/_health\", (c) =>\n c.json({\n status: \"ready\",\n mode: runtimeConfig.env,\n ui: runtimeConfig.ui?.url ?? null,\n uiSsr: runtimeConfig.ui?.ssrUrl ?? null,\n ssrRouterLoaded: ssrRouterModule !== null,\n ssrRouterLoading: ssrRouterLoading !== null,\n ssrRouterError,\n api: runtimeConfig.api?.url ?? null,\n apiPluginLoaded: baseApiPlugin !== null,\n apiPluginLoading: apiPluginLoading !== null,\n apiPluginError,\n }),\n );\n\n app.all(\"/api/rpc/*\", async (c) => {\n if (!rpcHandler) {\n await ensureApiPluginLoaded();\n }\n if (!rpcHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await rpcHandler.handle(c.req.raw, {\n prefix: \"/api/rpc\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n app.all(\"/api/*\", async (c) => {\n if (!openApiHandler) {\n await ensureApiPluginLoaded();\n }\n if (!openApiHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await openApiHandler.handle(c.req.raw, {\n prefix: \"/api\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n if (runtimeConfig.ui) {\n app.all(\"/__mf/ui/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.url}${c.req.path.replace(\"/__mf/ui\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n\n if (runtimeConfig.ui.ssrUrl) {\n app.all(\"/__mf/ui/ssr/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.ssrUrl}${c.req.path.replace(\"/__mf/ui/ssr\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n }\n }\n\n app.get(\"*\", async (c) => {\n const routerModule = await ensureRouterModuleLoaded();\n\n if (!routerModule) {\n return c.html(renderLoadingShell(clientRuntimeConfig, ssrRouterError), 503);\n }\n\n try {\n const apiClient = baseApiPlugin?.createClient();\n\n const result = await routerModule.renderToStream(c.req.raw, {\n assetsUrl: runtimeConfig.ui.url,\n runtimeConfig: clientRuntimeConfig,\n apiClient,\n });\n\n return new Response(result.stream, {\n status: result.statusCode,\n headers: result.headers,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return c.html(renderLoadingShell(clientRuntimeConfig, message), 500);\n }\n });\n\n const hostname = process.env.HOST ?? \"0.0.0.0\";\n let resolveReady: (() => void) | null = null;\n const ready = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n\n const proxiedFetch = (req: Request): Response | Promise<Response> => {\n const url = new URL(req.url);\n const forwardedProto = req.headers.get(\"x-forwarded-proto\");\n const forwardedHost = req.headers.get(\"x-forwarded-host\");\n\n if (forwardedProto) {\n url.protocol = forwardedProto;\n }\n if (forwardedHost) {\n url.host = forwardedHost;\n }\n\n if (forwardedProto || forwardedHost) {\n req = new Request(url, req);\n }\n\n return app.fetch(req);\n };\n\n const server = serve({ fetch: proxiedFetch, port, hostname }, (info) => {\n console.log(`[Host] Server running at http://${hostname}:${info.port}`);\n console.log(`[Host] API: http://${hostname}:${info.port}/api/rpc`);\n resolveReady?.();\n });\n\n await ready;\n\n return {\n shutdown: () =>\n new Promise<void>((resolve) => {\n try {\n server.close(() => resolve());\n } catch {\n resolve();\n }\n }),\n };\n}\n\nexport { runHostServer };\n"],"mappings":";;;;;;;;;;;;;AA6BA,SAAS,yBAAyB,eAAmD;AACnF,QAAO;EACL,KAAK,cAAc;EACnB,SAAS,cAAc;EACvB,WAAW,cAAc;EACzB,SAAS,cAAc;EACvB,WAAW,cAAc,GAAG;EAC5B,SAAS;EACT,SAAS;EACT,IAAI,cAAc,KACd;GACE,MAAM,cAAc,GAAG;GACvB,KAAK,cAAc,GAAG;GACtB,OAAO,cAAc,GAAG;GACxB,WAAW,cAAc,GAAG;GAC7B,GACD;EACJ,KAAK,cAAc,MACf;GACE,MAAM,cAAc,IAAI;GACxB,KAAK,cAAc,IAAI;GACvB,OAAO,cAAc,IAAI;GACzB,WAAW,cAAc,IAAI;GAC9B,GACD;EACJ,SAAS,cAAc,UACnB,OAAO,YACL,OAAO,QAAQ,cAAc,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,CAC3D,KACA;GACE,MAAM,OAAO;GACb,KAAK,OAAO;GACZ,OAAO,OAAO;GACd,WAAW,OAAO;GACnB,CACF,CAAC,CACH,GACD;EACL;;AAGH,SAAS,mBAAmB,eAAoC,OAAuB;CACrF,MAAM,YAAY,+BAA+B,KAAK,UAAU,cAAc,CAAC;CAC/E,MAAM,cAAc,QAChB,gDAAgD,WAAW,MAAM,CAAC,QAClE;CAEJ,MAAM,cAAc,cAAc,IAAI;CACtC,MAAM,UAAU,cAAc,eAAe,YAAY,6BAA6B;AAEtF,QAAO;;;;;;;;;;;;MAYH,cAAc,YAAY,gBAAgB,cAAc,UAAU,kBAAkB,QAAQ,eAAc,GAAG;cACrG,UAAU;;;kCAGU,YAAY;;;;;AAM9C,SAAS,WAAW,OAAe;AACjC,QAAO,MACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,QAAQ;;AAG7B,SAAgB,iBAAiB,QAA4C;CAC3E,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,EAAE,kBAAkB;CAE1B,IAAI,eAA6C;CAEjD,MAAM,SAAS,YAAY;AAEzB,kBADgB,MAAM,cAAc;GAAE;GAAe;GAAM,CAAC,EACrC;KACrB;CAEJ,MAAM,WAAW,YAAY;AAC3B,UAAQ,IAAI,0BAA0B;EACtC,MAAM,UAAU,iBAAiB;AAC/B,WAAQ,IAAI,oBAAoB;AAChC,WAAQ,KAAK,EAAE;KACd,IAAK;AACR,QAAM,MAAM,YAAY,GAAG;AAC3B,MAAI,aACF,OAAM,cAAc,CAAC,YAAY,GAAG;AAEtC,eAAa,QAAQ;AACrB,UAAQ,IAAI,2BAA2B;;AAGzC,QAAO;EAAE;EAAO;EAAU;;AAG5B,eAAe,cAAc,MAGkB;CAC7C,MAAM,EAAE,eAAe,SAAS;CAEhC,IAAI,aAAmC,EAAE;CACzC,IAAI,gBAA2C;CAC/C,IAAI,iBAAgC;CACpC,IAAI,mBAA+D;CACnE,IAAI,kBAAuC;CAC3C,IAAI,iBAAgC;CACpC,IAAI,mBAAwD;CAC5D,IAAI,aAAqC;CACzC,IAAI,iBAA6C;CAEjD,MAAM,sBAAsB,yBAAyB,cAAc;CAEnE,MAAM,wBAAwB;EAE5B,MAAM,iBAAiB,qBADJ,eAAe,UAAU,EAAE,EAG5C,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,CACpD;AAED,MAAI,CAAC,eAAe;AAClB,gBAAa;AACb,oBAAiB;AACjB;;AAGF,eAAa,IAAI,WAAW,gBAAuB,EACjD,SAAS,CAAC,IAAI,oBAAoB,CAAC,EACpC,CAAC;AACF,mBAAiB,IAAI,eAAe,gBAAuB,EACzD,SAAS,CACP,IAAI,uBAAuB,EACzB,kBAAkB,CAAC,IAAI,0BAA0B,CAAC,EACnD,CAAC,CACH,EACF,CAAC;;CAGJ,MAAM,wBAAwB,YAAiD;AAC7E,MAAI,WAAW,SAAS,EAAG,QAAO;GAAE,MAAM;GAAe,SAAS;GAAY,QAAQ,EAAE;GAAE;AAC1F,MAAI,CAAC,cAAc,IAAK,QAAO;AAC/B,MAAI,iBAAkB,QAAO;AAE7B,qBAAmB,gCAAgC,eAAe,QAAQ,IAAW,CAClF,MAAM,WAAW;AAChB,OAAI,QAAQ;AACV,iBAAa,OAAO;AACpB,oBAAgB,OAAO;AACvB,qBACE,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,KAAK,SAAS,KAAK,MAAM,CAAC,KAAK,KAAK,GAAG;AAClF,qBAAiB;;AAEnB,UAAO;IACP,CACD,OAAO,MAAM;AACZ,oBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC3D,UAAO;IACP,CACD,cAAc;AACb,sBAAmB;IACnB;AAEJ,SAAO;;CAGT,MAAM,2BAA2B,YAA0C;AACzE,MAAI,gBACF,QAAO;AAGT,MAAI,iBACF,QAAO;AAGT,qBAAmB,iBAAiB,cAAc,CAC/C,MAAM,iBAAiB;AACtB,qBAAkB;AAClB,oBAAiB;AACjB,UAAO;IACP,CACD,OAAO,UAAU;AAChB,oBAAiB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACvE,UAAO;IACP,CACD,cAAc;AACb,sBAAmB;IACnB;AAEJ,SAAO;;AAKT,CAAK,uBAAuB;AAC5B,CAAK,0BAA0B;CAE/B,MAAM,MAAM,IAAI,MAAM;CAEtB,MAAM,cAAc,QAAQ,IAAI,aAAa,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,CAC9E,cAAc,SACd,GAAI,cAAc,IAAI,MAAM,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CACxD;AAED,KAAI,CAAC,QAAQ,IAAI,eAAe,cAAc,QAAQ,aACpD,SAAQ,KACN,8FACD;AAGH,KAAI,IACF,MACA,KAAK;EACH,QAAQ;EACR,aAAa;EACd,CAAC,CACH;AAED,KAAI,IAAI,KAAK,eAAe,CAAC;AAE7B,KAAI,IAAI,YAAY,MAAM,EAAE,KAAK,KAAK,CAAC;AACvC,KAAI,IAAI,UAAU,OAAO,MAAM;EAW7B,MAAM,QAAQ,OAAO,KAAa,YAAY,QAAwB;GACpE,MAAM,UAAU,KAAK,KAAK;GAC1B,MAAM,aAAa,IAAI,iBAAiB;GACxC,MAAM,QAAQ,iBAAiB,WAAW,OAAO,EAAE,UAAU;AAC7D,OAAI;IACF,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,QAAQ,CAAC;AAC3D,WAAO;KACL,MAAM;KACN;KACA,UAAU;KACV,IAAI,IAAI;KACR,QAAQ,IAAI;KACZ,WAAW,KAAK,KAAK,GAAG;KACzB;YACM,GAAG;AACV,WAAO;KACL,MAAM;KACN;KACA,UAAU;KACV,IAAI;KACJ,WAAW,KAAK,KAAK,GAAG;KACxB,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;KAClD;aACO;AACR,iBAAa,MAAM;;;EAIvB,MAAM,SAAkB,EAAE;AAE1B,MAAI,cAAc,IAAI,KAAK;GACzB,MAAM,OAAO,cAAc,GAAG,IAAI,QAAQ,OAAO,GAAG;GACpD,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,mBAAmB;AACxD,YAAS,OAAO;AAGhB,YAAS,WAAW;AACpB,UAAO,KAAK,SAAS;AACrB,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,cAAc,MAAM,MAAM,GAAG,KAAK,iBAAiB;AACzD,gBAAY,OAAO;AACnB,gBAAY,WAAW;AACvB,WAAO,KAAK,YAAY;SAExB,UAAS,WAAW;;AAIxB,MAAI,cAAc,IAAI,QAAQ;GAE5B,MAAM,MAAM,MAAM,MAAM,GADX,cAAc,GAAG,OAAO,QAAQ,OAAO,GAAG,CACvB,GAAG;AACnC,OAAI,OAAO;AACX,OAAI,WAAW;AACf,UAAO,KAAK,IAAI;;AAGlB,MAAI,cAAc,KAAK,KAAK;GAE1B,MAAM,MAAM,MAAM,MAAM,GADX,cAAc,IAAI,IAAI,QAAQ,OAAO,GAAG,CACrB,GAAG;AACnC,OAAI,OAAO;AACX,OAAI,WAAW;AACf,UAAO,KAAK,IAAI;;AAGlB,MAAI,cAAc,KAAK;AACrB,UAAO,KAAK;IACV,MAAM;IACN,KAAK,cAAc,IAAI;IACvB,UAAU;IACV,IAAI,kBAAkB;IACtB,QAAQ,kBAAkB,OAAO,MAAM;IACvC,OACE,kBAAkB,OACd,SACA,mBACE,YACC,kBAAkB;IAC5B,CAAC;AACF,OAAI,CAAC,iBAAiB,CAAC,iBACrB,CAAK,uBAAuB;;AAIhC,OAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,cAAc,WAAW,EAAE,CAAC,EAAE;GACvE,MAAM,SAAS,WAAW,MAAM,SAAS,KAAK,QAAQ,IAAI;AAC1D,UAAO,KAAK;IACV,MAAM;IACN,KAAK,OAAO;IACZ,UAAU;IACV,IAAI,QAAQ,OAAO;IACnB,QAAQ,SAAS,MAAM;IACvB,OAAO,SAAS,SAAa,kBAAkB;IAChD,CAAC;;EAGJ,MAAM,gBAAgB,OAAO,QAAQ,MAAM,EAAE,SAAS,CAAC,OAAO,MAAM,EAAE,GAAG;AAEzE,SAAO,EAAE,KACP;GACE,QAAQ,gBAAgB,UAAU;GAClC,MAAM;IACJ,KAAK,cAAc;IACnB,KAAK,cAAc;IACpB;GACD;GACA,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC,EACD,gBAAgB,MAAM,IACvB;GACD;AACF,KAAI,IAAI,iBAAiB,MACvB,EAAE,KAAK;EACL,QAAQ;EACR,MAAM,cAAc;EACpB,IAAI,cAAc,IAAI,OAAO;EAC7B,OAAO,cAAc,IAAI,UAAU;EACnC,iBAAiB,oBAAoB;EACrC,kBAAkB,qBAAqB;EACvC;EACA,KAAK,cAAc,KAAK,OAAO;EAC/B,iBAAiB,kBAAkB;EACnC,kBAAkB,qBAAqB;EACvC;EACD,CAAC,CACH;AAED,KAAI,IAAI,cAAc,OAAO,MAAM;AACjC,MAAI,CAAC,WACH,OAAM,uBAAuB;AAE/B,MAAI,CAAC,WACH,QAAO,EAAE,KAAK;GAAE,OAAO;GAAyB,QAAQ;GAAgB,EAAE,IAAI;EAEhF,MAAM,SAAS,MAAM,WAAW,OAAO,EAAE,IAAI,KAAK;GAChD,QAAQ;GACR,SAAS,EAAE;GACZ,CAAC;AACF,SAAO,OAAO,WACV,EAAE,YAAY,OAAO,SAAS,MAAM,OAAO,SAAS,GACpD,EAAE,KAAK,aAAa,IAAI;GAC5B;AAEF,KAAI,IAAI,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,eACH,OAAM,uBAAuB;AAE/B,MAAI,CAAC,eACH,QAAO,EAAE,KAAK;GAAE,OAAO;GAAyB,QAAQ;GAAgB,EAAE,IAAI;EAEhF,MAAM,SAAS,MAAM,eAAe,OAAO,EAAE,IAAI,KAAK;GACpD,QAAQ;GACR,SAAS,EAAE;GACZ,CAAC;AACF,SAAO,OAAO,WACV,EAAE,YAAY,OAAO,SAAS,MAAM,OAAO,SAAS,GACpD,EAAE,KAAK,aAAa,IAAI;GAC5B;AAEF,KAAI,cAAc,IAAI;AACpB,MAAI,IAAI,cAAc,OAAO,MAAM;GACjC,MAAM,YAAY,GAAG,cAAc,GAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,YAAY,GAAG;AAK/E,UAJiB,MAAM,MAAM,WAAW;IACtC,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI,QAAQ;IACxB,CAAC;IAEF;AAEF,MAAI,cAAc,GAAG,OACnB,KAAI,IAAI,kBAAkB,OAAO,MAAM;GACrC,MAAM,YAAY,GAAG,cAAc,GAAI,SAAS,EAAE,IAAI,KAAK,QAAQ,gBAAgB,GAAG;AAKtF,UAJiB,MAAM,MAAM,WAAW;IACtC,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI,QAAQ;IACxB,CAAC;IAEF;;AAIN,KAAI,IAAI,KAAK,OAAO,MAAM;EACxB,MAAM,eAAe,MAAM,0BAA0B;AAErD,MAAI,CAAC,aACH,QAAO,EAAE,KAAK,mBAAmB,qBAAqB,eAAe,EAAE,IAAI;AAG7E,MAAI;GACF,MAAM,YAAY,eAAe,cAAc;GAE/C,MAAM,SAAS,MAAM,aAAa,eAAe,EAAE,IAAI,KAAK;IAC1D,WAAW,cAAc,GAAG;IAC5B,eAAe;IACf;IACD,CAAC;AAEF,UAAO,IAAI,SAAS,OAAO,QAAQ;IACjC,QAAQ,OAAO;IACf,SAAS,OAAO;IACjB,CAAC;WACK,OAAO;GACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,UAAO,EAAE,KAAK,mBAAmB,qBAAqB,QAAQ,EAAE,IAAI;;GAEtE;CAEF,MAAM,WAAW,QAAQ,IAAI,QAAQ;CACrC,IAAI,eAAoC;CACxC,MAAM,QAAQ,IAAI,SAAe,YAAY;AAC3C,iBAAe;GACf;CAEF,MAAM,gBAAgB,QAA+C;EACnE,MAAM,MAAM,IAAI,IAAI,IAAI,IAAI;EAC5B,MAAM,iBAAiB,IAAI,QAAQ,IAAI,oBAAoB;EAC3D,MAAM,gBAAgB,IAAI,QAAQ,IAAI,mBAAmB;AAEzD,MAAI,eACF,KAAI,WAAW;AAEjB,MAAI,cACF,KAAI,OAAO;AAGb,MAAI,kBAAkB,cACpB,OAAM,IAAI,QAAQ,KAAK,IAAI;AAG7B,SAAO,IAAI,MAAM,IAAI;;CAGvB,MAAM,SAAS,MAAM;EAAE,OAAO;EAAc;EAAM;EAAU,GAAG,SAAS;AACtE,UAAQ,IAAI,mCAAmC,SAAS,GAAG,KAAK,OAAO;AACvE,UAAQ,IAAI,sBAAsB,SAAS,GAAG,KAAK,KAAK,UAAU;AAClE,kBAAgB;GAChB;AAEF,OAAM;AAEN,QAAO,EACL,gBACE,IAAI,SAAe,YAAY;AAC7B,MAAI;AACF,UAAO,YAAY,SAAS,CAAC;UACvB;AACN,YAAS;;GAEX,EACL"}
1
+ {"version":3,"file":"host.mjs","names":[],"sources":["../src/host.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport { OpenAPIHandler } from \"@orpc/openapi/fetch\";\nimport { OpenAPIReferencePlugin } from \"@orpc/openapi/plugins\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport { BatchHandlerPlugin } from \"@orpc/server/plugins\";\nimport { ZodToJsonSchemaConverter } from \"@orpc/zod/zod4\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { secureHeaders } from \"hono/secure-headers\";\nimport {\n createStitchedRouter,\n type LoadedPluginResult,\n type LoadedPluginsResult,\n loadApiPluginsFromRuntimeConfig,\n} from \"./api\";\nimport { loadRouterModule, type RouterModule } from \"./federation.server\";\nimport type { ClientRuntimeConfig, RuntimeConfig } from \"./types\";\n\nexport interface HostServerConfig {\n runtimeConfig: RuntimeConfig;\n configDir: string;\n port?: number;\n}\n\nexport interface HostServerHandle {\n ready: Promise<void>;\n shutdown: () => Promise<void>;\n}\n\nfunction buildClientRuntimeConfig(runtimeConfig: RuntimeConfig): ClientRuntimeConfig {\n return {\n env: runtimeConfig.env,\n account: runtimeConfig.account,\n networkId: runtimeConfig.networkId,\n hostUrl: runtimeConfig.hostUrl,\n assetsUrl: runtimeConfig.ui.url,\n apiBase: \"/api\",\n rpcBase: \"/api/rpc\",\n ui: runtimeConfig.ui\n ? {\n name: runtimeConfig.ui.name,\n url: runtimeConfig.ui.url,\n entry: runtimeConfig.ui.entry,\n integrity: runtimeConfig.ui.integrity,\n }\n : undefined,\n api: runtimeConfig.api\n ? {\n name: runtimeConfig.api.name,\n url: runtimeConfig.api.url,\n entry: runtimeConfig.api.entry,\n integrity: runtimeConfig.api.integrity,\n }\n : undefined,\n plugins: runtimeConfig.plugins\n ? Object.fromEntries(\n Object.entries(runtimeConfig.plugins).map(([key, plugin]) => [\n key,\n {\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n integrity: plugin.integrity,\n },\n ]),\n )\n : undefined,\n };\n}\n\nfunction renderLoadingShell(runtimeConfig: ClientRuntimeConfig, error?: string | null) {\n const bootstrap = `window.__RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};window.addEventListener('load', function handleEverythingDevHydrate() { window.__hydrate?.(); }, { once: true });`;\n const errorMarkup = error\n ? `<p style=\"color: #fca5a5;\">Error loading UI: ${escapeHtml(error)}</p>`\n : \"<p>Loading UI...</p>\";\n\n const uiIntegrity = runtimeConfig.ui?.integrity;\n const sriAttr = uiIntegrity ? ` integrity=\"${uiIntegrity}\" crossorigin=\"anonymous\"` : \"\";\n\n return `\n\t\t<!DOCTYPE html>\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<meta charset=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\t\t\t\t<title>Loading...</title>\n\t\t\t\t<style>\n\t\t\t\t\tbody { background: #171717; color: #fafafa; display: flex; align-items: center; justify-content: center; height: 100vh; font-family: system-ui; }\n\t\t\t\t\t.fade { animation: fadeIn 0.3s ease-in; text-align: center; padding: 2rem; }\n\t\t\t\t\t@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n\t\t\t\t</style>\n\t\t\t\t${runtimeConfig.assetsUrl ? `<script src=\"${runtimeConfig.assetsUrl}/remoteEntry.js\"${sriAttr}></script>` : \"\"}\n\t\t\t\t<script>${bootstrap}</script>\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t<div id=\"root\" class=\"fade\">${errorMarkup}</div>\n\t\t\t</body>\n\t\t</html>\n\t`;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nexport function createHostServer(config: HostServerConfig): HostServerHandle {\n const port = config.port ?? 3000;\n const { runtimeConfig } = config;\n\n let shutdownImpl: (() => Promise<void>) | null = null;\n\n const ready = (async () => {\n const started = await runHostServer({ runtimeConfig, port });\n shutdownImpl = started.shutdown;\n })();\n\n const shutdown = async () => {\n console.log(\"[Host] Shutting down...\");\n const timeout = setTimeout(() => {\n console.log(\"[Host] Force exit\");\n process.exit(0);\n }, 5000);\n await ready.catch(() => {});\n if (shutdownImpl) {\n await shutdownImpl().catch(() => {});\n }\n clearTimeout(timeout);\n console.log(\"[Host] Shutdown complete\");\n };\n\n return { ready, shutdown };\n}\n\nasync function runHostServer(opts: {\n runtimeConfig: RuntimeConfig;\n port: number;\n}): Promise<{ shutdown: () => Promise<void> }> {\n const { runtimeConfig, port } = opts;\n\n let apiPlugins: LoadedPluginResult[] = [];\n let baseApiPlugin: LoadedPluginResult | null = null;\n let apiPluginError: string | null = null;\n let apiPluginLoading: Promise<LoadedPluginsResult | null> | null = null;\n let ssrRouterModule: RouterModule | null = null;\n let ssrRouterError: string | null = null;\n let ssrRouterLoading: Promise<RouterModule | null> | null = null;\n let rpcHandler: RPCHandler<any> | null = null;\n let openApiHandler: OpenAPIHandler<any> | null = null;\n\n const clientRuntimeConfig = buildClientRuntimeConfig(runtimeConfig);\n\n const initApiHandlers = () => {\n const baseRouter = baseApiPlugin?.router ?? {};\n const stitchedRouter = createStitchedRouter(\n baseRouter,\n apiPlugins.filter((plugin) => plugin.key !== \"api\"),\n );\n\n if (!baseApiPlugin) {\n rpcHandler = null;\n openApiHandler = null;\n return;\n }\n\n rpcHandler = new RPCHandler(stitchedRouter as any, {\n plugins: [new BatchHandlerPlugin()],\n });\n openApiHandler = new OpenAPIHandler(stitchedRouter as any, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n });\n };\n\n const ensureApiPluginLoaded = async (): Promise<LoadedPluginsResult | null> => {\n if (apiPlugins.length > 0) return { base: baseApiPlugin, plugins: apiPlugins, errors: [] };\n if (!runtimeConfig.api) return null;\n if (apiPluginLoading) return apiPluginLoading;\n\n apiPluginLoading = loadApiPluginsFromRuntimeConfig(runtimeConfig, process.env as any)\n .then((loaded) => {\n if (loaded) {\n apiPlugins = loaded.plugins;\n baseApiPlugin = loaded.base;\n apiPluginError =\n loaded.errors.length > 0 ? loaded.errors.map((item) => item.error).join(\"; \") : null;\n initApiHandlers();\n }\n return loaded;\n })\n .catch((e) => {\n apiPluginError = e instanceof Error ? e.message : String(e);\n return null;\n })\n .finally(() => {\n apiPluginLoading = null;\n });\n\n return apiPluginLoading;\n };\n\n const ensureRouterModuleLoaded = async (): Promise<RouterModule | null> => {\n if (ssrRouterModule) {\n return ssrRouterModule;\n }\n\n if (ssrRouterLoading) {\n return ssrRouterLoading;\n }\n\n ssrRouterLoading = loadRouterModule(runtimeConfig)\n .then((routerModule) => {\n ssrRouterModule = routerModule;\n ssrRouterError = null;\n return routerModule;\n })\n .catch((error) => {\n ssrRouterError = error instanceof Error ? error.message : String(error);\n return null;\n })\n .finally(() => {\n ssrRouterLoading = null;\n });\n\n return ssrRouterLoading;\n };\n\n // Kick off API plugin load in the background; host should still start even if\n // the remote isn't ready yet.\n void ensureApiPluginLoaded();\n void ensureRouterModuleLoaded();\n\n const app = new Hono();\n\n const corsOrigins = process.env.CORS_ORIGIN?.split(\",\").map((o) => o.trim()) ?? [\n runtimeConfig.hostUrl,\n ...(runtimeConfig.ui?.url ? [runtimeConfig.ui.url] : []),\n ];\n\n if (!process.env.CORS_ORIGIN && runtimeConfig.env === \"production\") {\n console.warn(\n \"[Security] CORS_ORIGIN is not set in production. Using host and UI URLs as allowed origins.\",\n );\n }\n\n app.use(\n \"/*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n );\n\n app.use(\"*\", secureHeaders({ crossOriginOpenerPolicy: \"same-origin-allow-popups\" }));\n\n app.get(\"/health\", (c) => c.text(\"OK\"));\n app.get(\"/ready\", async (c) => {\n type Check = {\n name: string;\n url: string;\n required: boolean;\n ok: boolean;\n status?: number;\n latencyMs?: number;\n error?: string;\n };\n\n const probe = async (url: string, timeoutMs = 400): Promise<Check> => {\n const started = Date.now();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return {\n name: \"\",\n url,\n required: true,\n ok: res.ok,\n status: res.status,\n latencyMs: Date.now() - started,\n };\n } catch (e) {\n return {\n name: \"\",\n url,\n required: true,\n ok: false,\n latencyMs: Date.now() - started,\n error: e instanceof Error ? e.message : String(e),\n };\n } finally {\n clearTimeout(timer);\n }\n };\n\n const checks: Check[] = [];\n\n if (runtimeConfig.ui?.url) {\n const base = runtimeConfig.ui.url.replace(/\\/$/, \"\");\n const manifest = await probe(`${base}/mf-manifest.json`);\n manifest.name = \"ui\";\n // mf-manifest.json is preferred but not always present; fall back to\n // remoteEntry.js for readiness.\n manifest.required = false;\n checks.push(manifest);\n if (!manifest.ok) {\n const remoteEntry = await probe(`${base}/remoteEntry.js`);\n remoteEntry.name = \"ui\";\n remoteEntry.required = true;\n checks.push(remoteEntry);\n } else {\n manifest.required = true;\n }\n }\n\n if (runtimeConfig.ui?.ssrUrl) {\n const base = runtimeConfig.ui.ssrUrl.replace(/\\/$/, \"\");\n const ssr = await probe(`${base}/`);\n ssr.name = \"ui-ssr\";\n ssr.required = false;\n checks.push(ssr);\n }\n\n if (runtimeConfig.api?.url) {\n const base = runtimeConfig.api.url.replace(/\\/$/, \"\");\n const api = await probe(`${base}/`);\n api.name = \"api\";\n api.required = true;\n checks.push(api);\n }\n\n if (runtimeConfig.api) {\n checks.push({\n name: \"api-plugin\",\n url: runtimeConfig.api.entry,\n required: true,\n ok: baseApiPlugin !== null,\n status: baseApiPlugin !== null ? 200 : 503,\n error:\n baseApiPlugin !== null\n ? undefined\n : apiPluginLoading\n ? \"loading\"\n : (apiPluginError ?? \"not loaded\"),\n });\n if (!baseApiPlugin && !apiPluginLoading) {\n void ensureApiPluginLoaded();\n }\n }\n\n for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) {\n const loaded = apiPlugins.find((item) => item.key === key);\n checks.push({\n name: key,\n url: plugin.entry,\n required: true,\n ok: Boolean(loaded),\n status: loaded ? 200 : 503,\n error: loaded ? undefined : (apiPluginError ?? \"not loaded\"),\n });\n }\n\n const allRequiredOk = checks.filter((x) => x.required).every((x) => x.ok);\n\n return c.json(\n {\n status: allRequiredOk ? \"ready\" : \"not_ready\",\n host: {\n url: runtimeConfig.hostUrl,\n env: runtimeConfig.env,\n },\n checks,\n timestamp: new Date().toISOString(),\n },\n allRequiredOk ? 200 : 503,\n );\n });\n app.get(\"/api/_health\", (c) =>\n c.json({\n status: \"ready\",\n mode: runtimeConfig.env,\n ui: runtimeConfig.ui?.url ?? null,\n uiSsr: runtimeConfig.ui?.ssrUrl ?? null,\n ssrRouterLoaded: ssrRouterModule !== null,\n ssrRouterLoading: ssrRouterLoading !== null,\n ssrRouterError,\n api: runtimeConfig.api?.url ?? null,\n apiPluginLoaded: baseApiPlugin !== null,\n apiPluginLoading: apiPluginLoading !== null,\n apiPluginError,\n }),\n );\n\n app.all(\"/api/rpc/*\", async (c) => {\n if (!rpcHandler) {\n await ensureApiPluginLoaded();\n }\n if (!rpcHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await rpcHandler.handle(c.req.raw, {\n prefix: \"/api/rpc\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n app.all(\"/api/*\", async (c) => {\n if (!openApiHandler) {\n await ensureApiPluginLoaded();\n }\n if (!openApiHandler) {\n return c.json({ error: \"API plugin not loaded\", detail: apiPluginError }, 503);\n }\n const result = await openApiHandler.handle(c.req.raw, {\n prefix: \"/api\",\n context: {},\n });\n return result.response\n ? c.newResponse(result.response.body, result.response)\n : c.text(\"Not Found\", 404);\n });\n\n if (runtimeConfig.ui) {\n app.all(\"/__mf/ui/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.url}${c.req.path.replace(\"/__mf/ui\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n\n if (runtimeConfig.ui.ssrUrl) {\n app.all(\"/__mf/ui/ssr/*\", async (c) => {\n const targetUrl = `${runtimeConfig.ui!.ssrUrl}${c.req.path.replace(\"/__mf/ui/ssr\", \"\")}`;\n const response = await fetch(targetUrl, {\n method: c.req.method,\n headers: c.req.header(),\n });\n return response;\n });\n }\n }\n\n app.get(\"*\", async (c) => {\n const routerModule = await ensureRouterModuleLoaded();\n\n if (!routerModule) {\n return c.html(renderLoadingShell(clientRuntimeConfig, ssrRouterError), 503);\n }\n\n try {\n const apiClient = baseApiPlugin?.createClient();\n\n const result = await routerModule.renderToStream(c.req.raw, {\n assetsUrl: runtimeConfig.ui.url,\n runtimeConfig: clientRuntimeConfig,\n apiClient,\n });\n\n return new Response(result.stream, {\n status: result.statusCode,\n headers: result.headers,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return c.html(renderLoadingShell(clientRuntimeConfig, message), 500);\n }\n });\n\n const hostname = process.env.HOST ?? \"0.0.0.0\";\n let resolveReady: (() => void) | null = null;\n const ready = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n\n const proxiedFetch = (req: Request): Response | Promise<Response> => {\n const url = new URL(req.url);\n const forwardedProto = req.headers.get(\"x-forwarded-proto\");\n const forwardedHost = req.headers.get(\"x-forwarded-host\");\n\n if (forwardedProto) {\n url.protocol = forwardedProto;\n }\n if (forwardedHost) {\n url.host = forwardedHost;\n }\n\n if (forwardedProto || forwardedHost) {\n req = new Request(url, req);\n }\n\n return app.fetch(req);\n };\n\n const server = serve({ fetch: proxiedFetch, port, hostname }, (info) => {\n console.log(`[Host] Server running at http://${hostname}:${info.port}`);\n console.log(`[Host] API: http://${hostname}:${info.port}/api/rpc`);\n resolveReady?.();\n });\n\n await ready;\n\n return {\n shutdown: () =>\n new Promise<void>((resolve) => {\n try {\n server.close(() => resolve());\n } catch {\n resolve();\n }\n }),\n };\n}\n\nexport { runHostServer };\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -100,6 +100,8 @@ Object.defineProperty(exports, 'createPluginRuntime', {
100
100
  }
101
101
  });
102
102
  exports.fetchBosConfigFromFastKv = require_fastkv.fetchBosConfigFromFastKv;
103
+ exports.fetchPluginFromRegistry = require_fastkv.fetchPluginFromRegistry;
104
+ exports.fetchRemotePluginManifest = require_fastkv.fetchRemotePluginManifest;
103
105
  exports.findConfigPath = require_config.findConfigPath;
104
106
  exports.getConfig = require_config.getConfig;
105
107
  exports.getFastKvBaseUrlForNetwork = require_fastkv.getFastKvBaseUrlForNetwork;
@@ -116,9 +118,11 @@ Object.defineProperty(exports, 'oc', {
116
118
  return every_plugin_orpc.oc;
117
119
  }
118
120
  });
121
+ exports.parsePluginBosUrl = require_fastkv.parsePluginBosUrl;
119
122
  exports.parsePort = require_config.parsePort;
120
123
  exports.resolveDevelopmentHostUrl = require_config.resolveDevelopmentHostUrl;
121
124
  exports.resolveLocalDevelopmentPath = require_config.resolveLocalDevelopmentPath;
125
+ exports.resolvePluginRuntimeName = require_config.resolvePluginRuntimeName;
122
126
  Object.defineProperty(exports, 'z', {
123
127
  enumerable: true,
124
128
  get: function () {
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AnyContractRouter, AnySchema, Context, Effect, Layer, LoadedPluginWithBinding, Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z } from "./sdk.cjs";
2
- import { ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, UiConfig, UiConfigSchema } from "./types.cjs";
3
- import { ConfigResult, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath } from "./config.cjs";
2
+ import { ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigInput, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, UiConfig, UiConfigSchema } from "./types.cjs";
3
+ import { ConfigResult, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, resolvePluginRuntimeName } from "./config.cjs";
4
4
  import { CliCommandMeta, cliCommandMeta } from "./contract.meta.cjs";
5
- import { NetworkId, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork } from "./fastkv.cjs";
5
+ import { NetworkId, PluginManifest, PluginMetadata, PluginRegistryEntry, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parsePluginBosUrl } from "./fastkv.cjs";
6
6
  import { BosConfigResult, BuildOptions, BuildOptionsSchema, BuildResultSchema, ConfigResultSchema, DevOptions, DevOptionsSchema, DevResultSchema, InitOptions, InitOptionsSchema, InitResult, InitResultSchema, KeyPublishOptions, KeyPublishOptionsSchema, KeyPublishResult, KeyPublishResultSchema, PluginAddOptions, PluginAddOptionsSchema, PluginAddResult, PluginAddResultSchema, PluginListResult, PluginListResultSchema, PluginPublishOptions, PluginPublishOptionsSchema, PluginPublishResult, PluginPublishResultSchema, PluginRemoveOptions, PluginRemoveOptionsSchema, PluginRemoveResult, PluginRemoveResultSchema, PublishOptions, PublishOptionsSchema, PublishResultSchema, StartOptions, StartOptionsSchema, StartResultSchema, StatusResult, StatusResultSchema, SyncOptions, SyncOptionsSchema, SyncResult, SyncResultSchema, UpgradeOptions, UpgradeOptionsSchema, UpgradeResult, UpgradeResultSchema, bosContract } from "./contract.cjs";
7
- export { AnyContractRouter, AnySchema, ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigResult, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, BuildOptions, BuildOptionsSchema, BuildResultSchema, CliCommandMeta, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, ConfigResult, ConfigResultSchema, Context, DevOptions, DevOptionsSchema, DevResultSchema, Effect, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, InitOptions, InitOptionsSchema, InitResult, InitResultSchema, KeyPublishOptions, KeyPublishOptionsSchema, KeyPublishResult, KeyPublishResultSchema, Layer, LoadedPluginWithBinding, NetworkId, Plugin, PluginAddOptions, PluginAddOptionsSchema, PluginAddResult, PluginAddResultSchema, PluginListResult, PluginListResultSchema, PluginPublishOptions, PluginPublishOptionsSchema, PluginPublishResult, PluginPublishResultSchema, PluginRemoveOptions, PluginRemoveOptionsSchema, PluginRemoveResult, PluginRemoveResultSchema, PluginRuntime, PublishOptions, PublishOptionsSchema, PublishResultSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, Scope, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, StartOptions, StartOptionsSchema, StartResultSchema, StatusResult, StatusResultSchema, SyncOptions, SyncOptionsSchema, SyncResult, SyncResultSchema, UiConfig, UiConfigSchema, UpgradeOptions, UpgradeOptionsSchema, UpgradeResult, UpgradeResultSchema, bosContract, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, buildRuntimePluginsForConfig, clearConfigCache, cliCommandMeta, createPlugin, createPluginRuntime, fetchBosConfigFromFastKv, findConfigPath, getConfig, getFastKvBaseUrlForNetwork, getHostDevelopmentPort, getProjectRoot, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, isLocalDevelopmentTarget, loadBosConfig, loadConfig, oc, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, z };
7
+ export { AnyContractRouter, AnySchema, ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigInput, BosConfigResult, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, BuildOptions, BuildOptionsSchema, BuildResultSchema, CliCommandMeta, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, ConfigResult, ConfigResultSchema, Context, DevOptions, DevOptionsSchema, DevResultSchema, Effect, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, InitOptions, InitOptionsSchema, InitResult, InitResultSchema, KeyPublishOptions, KeyPublishOptionsSchema, KeyPublishResult, KeyPublishResultSchema, Layer, LoadedPluginWithBinding, NetworkId, Plugin, PluginAddOptions, PluginAddOptionsSchema, PluginAddResult, PluginAddResultSchema, PluginListResult, PluginListResultSchema, PluginManifest, PluginMetadata, PluginPublishOptions, PluginPublishOptionsSchema, PluginPublishResult, PluginPublishResultSchema, PluginRegistryEntry, PluginRemoveOptions, PluginRemoveOptionsSchema, PluginRemoveResult, PluginRemoveResultSchema, PluginRuntime, PublishOptions, PublishOptionsSchema, PublishResultSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, Scope, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, StartOptions, StartOptionsSchema, StartResultSchema, StatusResult, StatusResultSchema, SyncOptions, SyncOptionsSchema, SyncResult, SyncResultSchema, UiConfig, UiConfigSchema, UpgradeOptions, UpgradeOptionsSchema, UpgradeResult, UpgradeResultSchema, bosContract, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, buildRuntimePluginsForConfig, clearConfigCache, cliCommandMeta, createPlugin, createPluginRuntime, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, findConfigPath, getConfig, getFastKvBaseUrlForNetwork, getHostDevelopmentPort, getProjectRoot, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, isLocalDevelopmentTarget, loadBosConfig, loadConfig, oc, parsePluginBosUrl, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, resolvePluginRuntimeName, z };
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AnyContractRouter, AnySchema, Context, Effect, Layer, LoadedPluginWithBinding, Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z } from "./sdk.mjs";
2
- import { ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, UiConfig, UiConfigSchema } from "./types.mjs";
3
- import { ConfigResult, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath } from "./config.mjs";
2
+ import { ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigInput, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, UiConfig, UiConfigSchema } from "./types.mjs";
3
+ import { ConfigResult, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, resolvePluginRuntimeName } from "./config.mjs";
4
4
  import { CliCommandMeta, cliCommandMeta } from "./contract.meta.mjs";
5
- import { NetworkId, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork } from "./fastkv.mjs";
5
+ import { NetworkId, PluginManifest, PluginMetadata, PluginRegistryEntry, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parsePluginBosUrl } from "./fastkv.mjs";
6
6
  import { BosConfigResult, BuildOptions, BuildOptionsSchema, BuildResultSchema, ConfigResultSchema, DevOptions, DevOptionsSchema, DevResultSchema, InitOptions, InitOptionsSchema, InitResult, InitResultSchema, KeyPublishOptions, KeyPublishOptionsSchema, KeyPublishResult, KeyPublishResultSchema, PluginAddOptions, PluginAddOptionsSchema, PluginAddResult, PluginAddResultSchema, PluginListResult, PluginListResultSchema, PluginPublishOptions, PluginPublishOptionsSchema, PluginPublishResult, PluginPublishResultSchema, PluginRemoveOptions, PluginRemoveOptionsSchema, PluginRemoveResult, PluginRemoveResultSchema, PublishOptions, PublishOptionsSchema, PublishResultSchema, StartOptions, StartOptionsSchema, StartResultSchema, StatusResult, StatusResultSchema, SyncOptions, SyncOptionsSchema, SyncResult, SyncResultSchema, UpgradeOptions, UpgradeOptionsSchema, UpgradeResult, UpgradeResultSchema, bosContract } from "./contract.mjs";
7
- export { AnyContractRouter, AnySchema, ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigResult, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, BuildOptions, BuildOptionsSchema, BuildResultSchema, CliCommandMeta, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, ConfigResult, ConfigResultSchema, Context, DevOptions, DevOptionsSchema, DevResultSchema, Effect, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, InitOptions, InitOptionsSchema, InitResult, InitResultSchema, KeyPublishOptions, KeyPublishOptionsSchema, KeyPublishResult, KeyPublishResultSchema, Layer, LoadedPluginWithBinding, NetworkId, Plugin, PluginAddOptions, PluginAddOptionsSchema, PluginAddResult, PluginAddResultSchema, PluginListResult, PluginListResultSchema, PluginPublishOptions, PluginPublishOptionsSchema, PluginPublishResult, PluginPublishResultSchema, PluginRemoveOptions, PluginRemoveOptionsSchema, PluginRemoveResult, PluginRemoveResultSchema, PluginRuntime, PublishOptions, PublishOptionsSchema, PublishResultSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, Scope, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, StartOptions, StartOptionsSchema, StartResultSchema, StatusResult, StatusResultSchema, SyncOptions, SyncOptionsSchema, SyncResult, SyncResultSchema, UiConfig, UiConfigSchema, UpgradeOptions, UpgradeOptionsSchema, UpgradeResult, UpgradeResultSchema, bosContract, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, buildRuntimePluginsForConfig, clearConfigCache, cliCommandMeta, createPlugin, createPluginRuntime, fetchBosConfigFromFastKv, findConfigPath, getConfig, getFastKvBaseUrlForNetwork, getHostDevelopmentPort, getProjectRoot, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, isLocalDevelopmentTarget, loadBosConfig, loadConfig, oc, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, z };
7
+ export { AnyContractRouter, AnySchema, ApiPluginConfig, ApiPluginConfigSchema, BosConfig, BosConfigInput, BosConfigResult, BosConfigSchema, BosPluginRef, BosPluginRefSchema, BosStaging, BosStagingSchema, BuildOptions, BuildOptionsSchema, BuildResultSchema, CliCommandMeta, ClientRuntimeConfig, ClientRuntimeConfigSchema, ClientRuntimeInfo, ClientRuntimeInfoSchema, ConfigResult, ConfigResultSchema, Context, DevOptions, DevOptionsSchema, DevResultSchema, Effect, FederationEntry, FederationEntrySchema, HostConfig, HostConfigSchema, InitOptions, InitOptionsSchema, InitResult, InitResultSchema, KeyPublishOptions, KeyPublishOptionsSchema, KeyPublishResult, KeyPublishResultSchema, Layer, LoadedPluginWithBinding, NetworkId, Plugin, PluginAddOptions, PluginAddOptionsSchema, PluginAddResult, PluginAddResultSchema, PluginListResult, PluginListResultSchema, PluginManifest, PluginMetadata, PluginPublishOptions, PluginPublishOptionsSchema, PluginPublishResult, PluginPublishResultSchema, PluginRegistryEntry, PluginRemoveOptions, PluginRemoveOptionsSchema, PluginRemoveResult, PluginRemoveResultSchema, PluginRuntime, PublishOptions, PublishOptionsSchema, PublishResultSchema, RuntimeConfig, RuntimeConfigSchema, RuntimePluginConfig, RuntimePluginConfigSchema, Scope, SharedConfig, SharedConfigSchema, SharedDepConfig, SharedDepConfigSchema, SourceMode, SourceModeSchema, StartOptions, StartOptionsSchema, StartResultSchema, StatusResult, StatusResultSchema, SyncOptions, SyncOptionsSchema, SyncResult, SyncResultSchema, UiConfig, UiConfigSchema, UpgradeOptions, UpgradeOptionsSchema, UpgradeResult, UpgradeResultSchema, bosContract, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, buildRuntimePluginsForConfig, clearConfigCache, cliCommandMeta, createPlugin, createPluginRuntime, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, findConfigPath, getConfig, getFastKvBaseUrlForNetwork, getHostDevelopmentPort, getProjectRoot, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, isLocalDevelopmentTarget, loadBosConfig, loadConfig, oc, parsePluginBosUrl, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, resolvePluginRuntimeName, z };
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
- import { buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork } from "./fastkv.mjs";
1
+ import { buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parsePluginBosUrl } from "./fastkv.mjs";
2
2
  import { Context, Effect, Layer, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z } from "./sdk.mjs";
3
3
  import { ApiPluginConfigSchema, BosConfigSchema, BosPluginRefSchema, BosStagingSchema, ClientRuntimeConfigSchema, ClientRuntimeInfoSchema, FederationEntrySchema, HostConfigSchema, RuntimeConfigSchema, RuntimePluginConfigSchema, SharedConfigSchema, SharedDepConfigSchema, SourceModeSchema, UiConfigSchema } from "./types.mjs";
4
- import { buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath } from "./config.mjs";
4
+ import { buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, resolvePluginRuntimeName } from "./config.mjs";
5
5
  import { BuildOptionsSchema, BuildResultSchema, ConfigResultSchema, DevOptionsSchema, DevResultSchema, InitOptionsSchema, InitResultSchema, KeyPublishOptionsSchema, KeyPublishResultSchema, PluginAddOptionsSchema, PluginAddResultSchema, PluginListResultSchema, PluginPublishOptionsSchema, PluginPublishResultSchema, PluginRemoveOptionsSchema, PluginRemoveResultSchema, PublishOptionsSchema, PublishResultSchema, StartOptionsSchema, StartResultSchema, StatusResultSchema, SyncOptionsSchema, SyncResultSchema, UpgradeOptionsSchema, UpgradeResultSchema, bosContract } from "./contract.mjs";
6
6
  import { cliCommandMeta } from "./contract.meta.mjs";
7
7
  import "./plugin.mjs";
8
8
 
9
- export { ApiPluginConfigSchema, BosConfigSchema, BosPluginRefSchema, BosStagingSchema, BuildOptionsSchema, BuildResultSchema, ClientRuntimeConfigSchema, ClientRuntimeInfoSchema, ConfigResultSchema, Context, DevOptionsSchema, DevResultSchema, Effect, FederationEntrySchema, HostConfigSchema, InitOptionsSchema, InitResultSchema, KeyPublishOptionsSchema, KeyPublishResultSchema, Layer, PluginAddOptionsSchema, PluginAddResultSchema, PluginListResultSchema, PluginPublishOptionsSchema, PluginPublishResultSchema, PluginRemoveOptionsSchema, PluginRemoveResultSchema, PluginRuntime, PublishOptionsSchema, PublishResultSchema, RuntimeConfigSchema, RuntimePluginConfigSchema, Scope, SharedConfigSchema, SharedDepConfigSchema, SourceModeSchema, StartOptionsSchema, StartResultSchema, StatusResultSchema, SyncOptionsSchema, SyncResultSchema, UiConfigSchema, UpgradeOptionsSchema, UpgradeResultSchema, bosContract, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, buildRuntimePluginsForConfig, clearConfigCache, cliCommandMeta, createPlugin, createPluginRuntime, fetchBosConfigFromFastKv, findConfigPath, getConfig, getFastKvBaseUrlForNetwork, getHostDevelopmentPort, getProjectRoot, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, isLocalDevelopmentTarget, loadBosConfig, loadConfig, oc, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, z };
9
+ export { ApiPluginConfigSchema, BosConfigSchema, BosPluginRefSchema, BosStagingSchema, BuildOptionsSchema, BuildResultSchema, ClientRuntimeConfigSchema, ClientRuntimeInfoSchema, ConfigResultSchema, Context, DevOptionsSchema, DevResultSchema, Effect, FederationEntrySchema, HostConfigSchema, InitOptionsSchema, InitResultSchema, KeyPublishOptionsSchema, KeyPublishResultSchema, Layer, PluginAddOptionsSchema, PluginAddResultSchema, PluginListResultSchema, PluginPublishOptionsSchema, PluginPublishResultSchema, PluginRemoveOptionsSchema, PluginRemoveResultSchema, PluginRuntime, PublishOptionsSchema, PublishResultSchema, RuntimeConfigSchema, RuntimePluginConfigSchema, Scope, SharedConfigSchema, SharedDepConfigSchema, SourceModeSchema, StartOptionsSchema, StartResultSchema, StatusResultSchema, SyncOptionsSchema, SyncResultSchema, UiConfigSchema, UpgradeOptionsSchema, UpgradeResultSchema, bosContract, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, buildRuntimePluginsForConfig, clearConfigCache, cliCommandMeta, createPlugin, createPluginRuntime, fetchBosConfigFromFastKv, fetchPluginFromRegistry, fetchRemotePluginManifest, findConfigPath, getConfig, getFastKvBaseUrlForNetwork, getHostDevelopmentPort, getProjectRoot, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, isLocalDevelopmentTarget, loadBosConfig, loadConfig, oc, parsePluginBosUrl, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath, resolvePluginRuntimeName, z };
package/dist/near-cli.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
- let effect = require("effect");
3
2
  let node_crypto = require("node:crypto");
3
+ let effect = require("effect");
4
4
  let node_child_process = require("node:child_process");
5
5
 
6
6
  //#region src/near-cli.ts
package/dist/near-cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { Effect } from "effect";
2
1
  import { generateKeyPairSync } from "node:crypto";
2
+ import { Effect } from "effect";
3
3
  import { spawn } from "node:child_process";
4
4
 
5
5
  //#region src/near-cli.ts