@optimizely/ocp-local-env 1.0.0-beta.4

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 (160) hide show
  1. package/README.md +165 -0
  2. package/dist/package.json +104 -0
  3. package/dist/public/bundle.da978bb5437cd82e6d37.js +3 -0
  4. package/dist/public/bundle.da978bb5437cd82e6d37.js.LICENSE.txt +49 -0
  5. package/dist/public/bundle.da978bb5437cd82e6d37.js.map +1 -0
  6. package/dist/public/index.html +1 -0
  7. package/dist/src/cli.d.ts +2 -0
  8. package/dist/src/cli.js +88 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/executor/FunctionExecutor.d.ts +56 -0
  11. package/dist/src/executor/FunctionExecutor.js +175 -0
  12. package/dist/src/executor/FunctionExecutor.js.map +1 -0
  13. package/dist/src/executor/JobExecutor.d.ts +60 -0
  14. package/dist/src/executor/JobExecutor.js +203 -0
  15. package/dist/src/executor/JobExecutor.js.map +1 -0
  16. package/dist/src/executor/LifecycleExecutor.d.ts +45 -0
  17. package/dist/src/executor/LifecycleExecutor.js +153 -0
  18. package/dist/src/executor/LifecycleExecutor.js.map +1 -0
  19. package/dist/src/executor/watcher.d.ts +63 -0
  20. package/dist/src/executor/watcher.js +213 -0
  21. package/dist/src/executor/watcher.js.map +1 -0
  22. package/dist/src/functions/hello.d.ts +4 -0
  23. package/dist/src/functions/hello.js +8 -0
  24. package/dist/src/functions/hello.js.map +1 -0
  25. package/dist/src/index.d.ts +1 -0
  26. package/dist/src/index.js +9 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/jobs/dailyJob.d.ts +4 -0
  29. package/dist/src/jobs/dailyJob.js +8 -0
  30. package/dist/src/jobs/dailyJob.js.map +1 -0
  31. package/dist/src/local_engine/LocalNotifier.d.ts +10 -0
  32. package/dist/src/local_engine/LocalNotifier.js +26 -0
  33. package/dist/src/local_engine/LocalNotifier.js.map +1 -0
  34. package/dist/src/local_engine/local-engine-child-base.d.ts +79 -0
  35. package/dist/src/local_engine/local-engine-child-base.js +304 -0
  36. package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
  37. package/dist/src/local_engine/local-engine-client.d.ts +80 -0
  38. package/dist/src/local_engine/local-engine-client.js +333 -0
  39. package/dist/src/local_engine/local-engine-client.js.map +1 -0
  40. package/dist/src/local_engine/local-engine-types.d.ts +132 -0
  41. package/dist/src/local_engine/local-engine-types.js +6 -0
  42. package/dist/src/local_engine/local-engine-types.js.map +1 -0
  43. package/dist/src/local_engine/local-engine-unified.d.ts +40 -0
  44. package/dist/src/local_engine/local-engine-unified.js +406 -0
  45. package/dist/src/local_engine/local-engine-unified.js.map +1 -0
  46. package/dist/src/local_engine/local-engine-utils.d.ts +70 -0
  47. package/dist/src/local_engine/local-engine-utils.js +192 -0
  48. package/dist/src/local_engine/local-engine-utils.js.map +1 -0
  49. package/dist/src/local_engine/localSDKConfig.d.ts +30 -0
  50. package/dist/src/local_engine/localSDKConfig.js +392 -0
  51. package/dist/src/local_engine/localSDKConfig.js.map +1 -0
  52. package/dist/src/local_engine/storage/LocalConfigStore.d.ts +56 -0
  53. package/dist/src/local_engine/storage/LocalConfigStore.js +129 -0
  54. package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
  55. package/dist/src/local_engine/storage/LocalJobStore.d.ts +110 -0
  56. package/dist/src/local_engine/storage/LocalJobStore.js +239 -0
  57. package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
  58. package/dist/src/local_engine/storage/LocalKVStore.d.ts +105 -0
  59. package/dist/src/local_engine/storage/LocalKVStore.js +1002 -0
  60. package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
  61. package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +27 -0
  62. package/dist/src/local_engine/storage/LocalNotificationStore.js +125 -0
  63. package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
  64. package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +114 -0
  65. package/dist/src/local_engine/storage/LocalSecretsStore.js +319 -0
  66. package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
  67. package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +161 -0
  68. package/dist/src/local_engine/storage/LocalSettingsStore.js +417 -0
  69. package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
  70. package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
  71. package/dist/src/local_engine/storage/NumberSet.js +32 -0
  72. package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
  73. package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
  74. package/dist/src/local_engine/storage/StringSet.js +32 -0
  75. package/dist/src/local_engine/storage/StringSet.js.map +1 -0
  76. package/dist/src/local_engine/types.d.ts +52 -0
  77. package/dist/src/local_engine/types.js +6 -0
  78. package/dist/src/local_engine/types.js.map +1 -0
  79. package/dist/src/local_engine/utils.d.ts +31 -0
  80. package/dist/src/local_engine/utils.js +126 -0
  81. package/dist/src/local_engine/utils.js.map +1 -0
  82. package/dist/src/logging/LogManager.d.ts +89 -0
  83. package/dist/src/logging/LogManager.js +237 -0
  84. package/dist/src/logging/LogManager.js.map +1 -0
  85. package/dist/src/server/api/functions.d.ts +7 -0
  86. package/dist/src/server/api/functions.js +80 -0
  87. package/dist/src/server/api/functions.js.map +1 -0
  88. package/dist/src/server/api/jobs.d.ts +8 -0
  89. package/dist/src/server/api/jobs.js +242 -0
  90. package/dist/src/server/api/jobs.js.map +1 -0
  91. package/dist/src/server/api/lifecycle.d.ts +6 -0
  92. package/dist/src/server/api/lifecycle.js +73 -0
  93. package/dist/src/server/api/lifecycle.js.map +1 -0
  94. package/dist/src/server/api/settings.d.ts +6 -0
  95. package/dist/src/server/api/settings.js +117 -0
  96. package/dist/src/server/api/settings.js.map +1 -0
  97. package/dist/src/server/api/stores.d.ts +2 -0
  98. package/dist/src/server/api/stores.js +341 -0
  99. package/dist/src/server/api/stores.js.map +1 -0
  100. package/dist/src/server/api/v1.d.ts +10 -0
  101. package/dist/src/server/api/v1.js +711 -0
  102. package/dist/src/server/api/v1.js.map +1 -0
  103. package/dist/src/server/api.d.ts +8 -0
  104. package/dist/src/server/api.js +154 -0
  105. package/dist/src/server/api.js.map +1 -0
  106. package/dist/src/server/app-discovery.d.ts +5 -0
  107. package/dist/src/server/app-discovery.js +81 -0
  108. package/dist/src/server/app-discovery.js.map +1 -0
  109. package/dist/src/server/config.d.ts +21 -0
  110. package/dist/src/server/config.js +100 -0
  111. package/dist/src/server/config.js.map +1 -0
  112. package/dist/src/server/websocket.d.ts +0 -0
  113. package/dist/src/server/websocket.js +2 -0
  114. package/dist/src/server/websocket.js.map +1 -0
  115. package/dist/src/server.d.ts +2 -0
  116. package/dist/src/server.js +546 -0
  117. package/dist/src/server.js.map +1 -0
  118. package/dist/src/types/app.d.ts +155 -0
  119. package/dist/src/types/app.js +24 -0
  120. package/dist/src/types/app.js.map +1 -0
  121. package/dist/src/types/kvstore.d.ts +320 -0
  122. package/dist/src/types/kvstore.js +5 -0
  123. package/dist/src/types/kvstore.js.map +1 -0
  124. package/dist/src/ui/components/App.d.ts +6 -0
  125. package/dist/src/ui/components/App.js +255 -0
  126. package/dist/src/ui/components/App.js.map +1 -0
  127. package/dist/src/ui/components/FunctionsView.d.ts +6 -0
  128. package/dist/src/ui/components/FunctionsView.js +217 -0
  129. package/dist/src/ui/components/FunctionsView.js.map +1 -0
  130. package/dist/src/ui/components/JobsView.d.ts +6 -0
  131. package/dist/src/ui/components/JobsView.js +257 -0
  132. package/dist/src/ui/components/JobsView.js.map +1 -0
  133. package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
  134. package/dist/src/ui/components/KVStoreViewer.js +168 -0
  135. package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
  136. package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
  137. package/dist/src/ui/components/NotificationViewer.js +69 -0
  138. package/dist/src/ui/components/NotificationViewer.js.map +1 -0
  139. package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
  140. package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
  141. package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
  142. package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
  143. package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
  144. package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
  145. package/dist/src/ui/components/StoreViewer.d.ts +16 -0
  146. package/dist/src/ui/components/StoreViewer.js +86 -0
  147. package/dist/src/ui/components/StoreViewer.js.map +1 -0
  148. package/dist/src/ui/components/TabbedConsole.d.ts +15 -0
  149. package/dist/src/ui/components/TabbedConsole.js +93 -0
  150. package/dist/src/ui/components/TabbedConsole.js.map +1 -0
  151. package/dist/src/ui/components/common/DataTree.d.ts +15 -0
  152. package/dist/src/ui/components/common/DataTree.js +95 -0
  153. package/dist/src/ui/components/common/DataTree.js.map +1 -0
  154. package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
  155. package/dist/src/ui/components/common/EyeIcon.js +11 -0
  156. package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
  157. package/dist/src/ui/index.d.ts +1 -0
  158. package/dist/src/ui/index.js +20 -0
  159. package/dist/src/ui/index.js.map +1 -0
  160. package/package.json +104 -0
@@ -0,0 +1,546 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startServer = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const http_1 = __importDefault(require("http"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const http_proxy_middleware_1 = require("http-proxy-middleware");
12
+ const open_1 = __importDefault(require("open"));
13
+ const os_1 = __importDefault(require("os"));
14
+ // Import our components
15
+ const watcher_1 = require("./executor/watcher");
16
+ const app_discovery_1 = require("./server/app-discovery");
17
+ const api_1 = require("./server/api");
18
+ const config_1 = require("./server/config");
19
+ const LocalConfigStore_1 = require("./local_engine/storage/LocalConfigStore");
20
+ const LocalSettingsStore_1 = require("./local_engine/storage/LocalSettingsStore");
21
+ const LifecycleExecutor_1 = require("./executor/LifecycleExecutor");
22
+ const FunctionExecutor_1 = require("./executor/FunctionExecutor");
23
+ /**
24
+ * Wait for the dev server to be fully ready
25
+ */
26
+ async function waitForServerReady(baseUrl) {
27
+ console.log('Waiting for dev server to fully initialize...');
28
+ const maxAttempts = 30; // 30 attempts with 200ms delay = 6 seconds max
29
+ const delayMs = 200;
30
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
31
+ try {
32
+ // Check both health and app endpoints
33
+ const healthUrl = `${baseUrl}/devserver/api/health`;
34
+ const appUrl = `${baseUrl}/devserver/api/app`;
35
+ const [healthResponse, appResponse] = await Promise.all([
36
+ fetch(healthUrl),
37
+ fetch(appUrl)
38
+ ]);
39
+ if (healthResponse.ok && appResponse.ok) {
40
+ const healthData = await healthResponse.json();
41
+ const appData = await appResponse.json();
42
+ // Verify health status and app has valid data
43
+ if (healthData.status === 'ok' && appData.name && appData.name !== 'unknown') {
44
+ console.log(`Dev server is ready! (attempt ${attempt}/${maxAttempts})`);
45
+ return;
46
+ }
47
+ }
48
+ }
49
+ catch (error) {
50
+ // Server not ready yet, continue waiting
51
+ }
52
+ // Wait before next attempt
53
+ await new Promise(resolve => setTimeout(resolve, delayMs));
54
+ }
55
+ console.warn('Dev server may not be fully ready, but proceeding with browser open...');
56
+ }
57
+ async function startServer() {
58
+ // Create Express app
59
+ const app = (0, express_1.default)();
60
+ const server = http_1.default.createServer(app);
61
+ // Parse JSON requests
62
+ app.use(express_1.default.json());
63
+ // Serve static files for dev server
64
+ app.use("/devserver/static", express_1.default.static(path_1.default.join(__dirname, "../public")));
65
+ // Serve static files
66
+ app.use(express_1.default.static(path_1.default.join(__dirname, "../public")));
67
+ // Use the configured app root directory
68
+ const appRootDir = path_1.default.resolve(config_1.config.app.rootDir);
69
+ console.log(`Looking for OCP app in: ${appRootDir}`);
70
+ const ocpApp = await (0, app_discovery_1.discoverApp)(appRootDir);
71
+ if (!ocpApp) {
72
+ console.error(`No OCP app found in ${appRootDir}. Make sure app.yml exists.`);
73
+ process.exit(1);
74
+ }
75
+ console.log(`Found OCP app: ${ocpApp.manifest.meta.display_name} v${ocpApp.manifest.meta.version}`);
76
+ // Set up file watcher
77
+ const watcher = new watcher_1.AppWatcher(appRootDir);
78
+ // Set up config store
79
+ const configStore = new LocalConfigStore_1.LocalConfigStore(appRootDir);
80
+ // Set up settings store
81
+ const settingsStore = LocalSettingsStore_1.LocalSettingsStore.getInstance(appRootDir);
82
+ // Set up lifecycle executor
83
+ const lifecycleExecutor = new LifecycleExecutor_1.LifecycleExecutor(appRootDir, ocpApp, settingsStore, configStore);
84
+ // Set up function executor
85
+ const functionExecutor = new FunctionExecutor_1.FunctionExecutor(appRootDir, ocpApp, settingsStore, configStore);
86
+ // Set up API routes with /devserver prefix
87
+ app.use("/devserver/api", (0, api_1.createApiRoutes)(ocpApp, watcher, configStore));
88
+ // Set up v1 API routes at root level
89
+ const { createV1Routes } = require("./server/api/v1");
90
+ app.use("/v1", createV1Routes(ocpApp, watcher, configStore, lifecycleExecutor, settingsStore));
91
+ // Serve assets from the app directory
92
+ app.get("/assets/overview.md", (req, res) => {
93
+ const overviewPath = path_1.default.join(appRootDir, "assets", "directory", "overview.md");
94
+ // Check if the file exists
95
+ if (fs_1.default.existsSync(overviewPath)) {
96
+ // Set content type for markdown
97
+ res.setHeader("Content-Type", "text/markdown; charset=utf-8");
98
+ // Send the file
99
+ res.sendFile(overviewPath);
100
+ }
101
+ else {
102
+ // Return 404 if file doesn't exist
103
+ res.status(404).json({
104
+ error: {
105
+ message: "Overview file not found",
106
+ code: "FILE_NOT_FOUND",
107
+ },
108
+ });
109
+ }
110
+ });
111
+ app.get("/assets/settings.yml", (req, res) => {
112
+ const settingsPath = path_1.default.join(appRootDir, "forms", "settings.yml");
113
+ // Check if the file exists
114
+ if (fs_1.default.existsSync(settingsPath)) {
115
+ try {
116
+ // Read the file content
117
+ const fileContent = fs_1.default.readFileSync(settingsPath);
118
+ // Set content type for plain text
119
+ res.setHeader("Content-Type", "application/x-yaml");
120
+ // Return just the base64 content
121
+ res.send(fileContent);
122
+ }
123
+ catch (error) {
124
+ res.status(500).json({
125
+ error: {
126
+ message: "Error reading settings file",
127
+ code: "FILE_READ_ERROR",
128
+ },
129
+ });
130
+ }
131
+ }
132
+ else {
133
+ // Return 404 if file doesn't exist
134
+ res.status(404).json({
135
+ error: {
136
+ message: "Settings file not found",
137
+ code: "FILE_NOT_FOUND",
138
+ },
139
+ });
140
+ }
141
+ });
142
+ app.get("/assets/icon.svg", (req, res) => {
143
+ const iconPath = path_1.default.join(appRootDir, "assets", "icon.svg");
144
+ // Check if the file exists
145
+ if (fs_1.default.existsSync(iconPath)) {
146
+ // Set content type for SVG
147
+ res.setHeader("Content-Type", "image/svg+xml");
148
+ // Send the file
149
+ res.sendFile(iconPath);
150
+ }
151
+ else {
152
+ // Return 404 if file doesn't exist
153
+ res.status(404).json({
154
+ error: {
155
+ message: "Icon file not found",
156
+ code: "FILE_NOT_FOUND",
157
+ },
158
+ });
159
+ }
160
+ });
161
+ app.get("/assets/logo.svg", (req, res) => {
162
+ const logoPath = path_1.default.join(appRootDir, "assets", "logo.svg");
163
+ // Check if the file exists
164
+ if (fs_1.default.existsSync(logoPath)) {
165
+ // Set content type for SVG
166
+ res.setHeader("Content-Type", "image/svg+xml");
167
+ // Send the file
168
+ res.sendFile(logoPath);
169
+ }
170
+ else {
171
+ // Return 404 if file doesn't exist
172
+ res.status(404).json({
173
+ error: {
174
+ message: "Logo file not found",
175
+ code: "FILE_NOT_FOUND",
176
+ },
177
+ });
178
+ }
179
+ });
180
+ // Set up production-like function execution routes
181
+ // Format: /functions/<app_id>/<function_id>/<guid> and /functions/<app_id>/<function_id>/<guid>/*
182
+ const handleFunctionExecution = async (req, res) => {
183
+ const { app_id, function_id, guid } = req.params;
184
+ const payload = req.body;
185
+ console.log(`[FUNCTION] Executing function: ${app_id}/${function_id} (${req.method})`);
186
+ try {
187
+ // Extract path information for InternalRequest
188
+ const remainingPath = req.params[0] || ''; // Everything after GUID
189
+ const fullpath = req.path.replace(/^\/functions/, ''); // Remove /functions prefix
190
+ const path = remainingPath ? `/${remainingPath}` : '/'; // Path for function code
191
+ console.log(`[FUNCTION] Path handling: originalPath=${req.path}, fullpath=${fullpath}, path=${path}`);
192
+ // Validate app_id matches current app
193
+ if (app_id !== ocpApp.manifest.meta.app_id) {
194
+ return res.status(404).json({
195
+ error: {
196
+ message: `App '${app_id}' not found`,
197
+ code: 'APP_NOT_FOUND'
198
+ }
199
+ });
200
+ }
201
+ // Validate function exists
202
+ const functions = ocpApp.manifest.functions || {};
203
+ if (!functions[function_id]) {
204
+ return res.status(404).json({
205
+ error: {
206
+ message: `Function '${function_id}' not found in app '${app_id}'`,
207
+ code: 'FUNCTION_NOT_FOUND'
208
+ }
209
+ });
210
+ }
211
+ // Validate app is installed
212
+ if (!configStore.isInstalled()) {
213
+ return res.status(403).json({
214
+ error: {
215
+ message: 'App must be installed to execute functions',
216
+ code: 'APP_NOT_INSTALLED'
217
+ }
218
+ });
219
+ }
220
+ // Validate GUID matches stored GUID for this function
221
+ const expectedGuid = configStore.getFunctionGuid(function_id);
222
+ if (guid !== expectedGuid) {
223
+ return res.status(403).json({
224
+ error: {
225
+ message: 'Invalid function GUID',
226
+ code: 'INVALID_GUID'
227
+ }
228
+ });
229
+ }
230
+ // Prepare function execution request
231
+ const functionRequest = {
232
+ functionId: function_id,
233
+ method: req.method,
234
+ fullpath,
235
+ path,
236
+ params: req.query,
237
+ headers: Object.entries(req.headers),
238
+ body: payload
239
+ };
240
+ // Execute function using FunctionExecutor
241
+ const executionResult = await functionExecutor.executeFunction(functionRequest);
242
+ if (executionResult.success) {
243
+ console.log(`[FUNCTION] Function executed successfully: ${function_id} (${executionResult.executionTime}ms)`);
244
+ // Set response headers if provided
245
+ if (executionResult.headers) {
246
+ for (const [key, value] of executionResult.headers) {
247
+ res.set(key, value);
248
+ }
249
+ }
250
+ // Return successful function execution result
251
+ const status = executionResult.status || 200;
252
+ if (executionResult.body !== null && executionResult.body !== undefined) {
253
+ // Function returned a specific response body
254
+ if (Buffer.isBuffer(executionResult.body) || Array.isArray(executionResult.body)) {
255
+ // Binary response
256
+ res.status(status).send(Buffer.from(executionResult.body));
257
+ }
258
+ else {
259
+ // JSON response
260
+ res.status(status).json(executionResult.body);
261
+ }
262
+ }
263
+ else {
264
+ // No specific body, return execution info
265
+ res.status(status).json({
266
+ result: "Function executed successfully",
267
+ logs: executionResult.logs,
268
+ executionTime: executionResult.executionTime
269
+ });
270
+ }
271
+ }
272
+ else {
273
+ console.error(`[FUNCTION] Function execution failed: ${function_id} - ${executionResult.error?.message}`);
274
+ // Return standardized error response for function execution failures
275
+ res.status(500).send("Unexpected error during webhook execution");
276
+ }
277
+ }
278
+ catch (error) {
279
+ console.error(`Error executing function ${function_id}:`, error);
280
+ res.status(500).send("Unexpected error during webhook execution");
281
+ }
282
+ };
283
+ // Global function execution handler (no GUID)
284
+ const handleGlobalFunctionExecution = async (req, res) => {
285
+ const { app_id, function_id } = req.params;
286
+ const payload = req.body;
287
+ console.log(`[GLOBAL FUNCTION] Executing global function: ${app_id}/${function_id} (${req.method})`);
288
+ try {
289
+ // Extract path information for InternalRequest
290
+ const remainingPath = req.params[0] || ''; // Everything after function_id
291
+ const fullpath = req.path.replace(/^\/functions/, ''); // Remove /functions prefix
292
+ const path = remainingPath ? `/${remainingPath}` : '/'; // Path for function code
293
+ console.log(`[GLOBAL FUNCTION] Path handling: originalPath=${req.path}, fullpath=${fullpath}, path=${path}`);
294
+ // Validate app_id matches current app
295
+ if (app_id !== ocpApp.manifest.meta.app_id) {
296
+ return res.status(404).json({
297
+ error: {
298
+ message: `App '${app_id}' not found`,
299
+ code: 'APP_NOT_FOUND'
300
+ }
301
+ });
302
+ }
303
+ // Validate function exists and is global
304
+ const functions = ocpApp.manifest.functions || {};
305
+ if (!functions[function_id]) {
306
+ return res.status(404).json({
307
+ error: {
308
+ message: `Function '${function_id}' not found in app '${app_id}'`,
309
+ code: 'FUNCTION_NOT_FOUND'
310
+ }
311
+ });
312
+ }
313
+ if (!functions[function_id].global) {
314
+ return res.status(403).json({
315
+ error: {
316
+ message: `Function '${function_id}' is not a global function`,
317
+ code: 'NOT_GLOBAL_FUNCTION'
318
+ }
319
+ });
320
+ }
321
+ // Validate app is installed
322
+ if (!configStore.isInstalled()) {
323
+ return res.status(403).json({
324
+ error: {
325
+ message: 'App must be installed to execute functions',
326
+ code: 'APP_NOT_INSTALLED'
327
+ }
328
+ });
329
+ }
330
+ // Prepare function execution request
331
+ const functionRequest = {
332
+ functionId: function_id,
333
+ method: req.method,
334
+ fullpath,
335
+ path,
336
+ params: req.query,
337
+ headers: Object.entries(req.headers),
338
+ body: payload
339
+ };
340
+ // Execute function using FunctionExecutor
341
+ const executionResult = await functionExecutor.executeFunction(functionRequest);
342
+ if (executionResult.success) {
343
+ console.log(`[GLOBAL FUNCTION] Function executed successfully: ${function_id} (${executionResult.executionTime}ms)`);
344
+ // Set response headers if provided
345
+ if (executionResult.headers) {
346
+ for (const [key, value] of executionResult.headers) {
347
+ res.set(key, value);
348
+ }
349
+ }
350
+ // Return successful function execution result
351
+ const status = executionResult.status || 200;
352
+ if (executionResult.body !== null && executionResult.body !== undefined) {
353
+ // Function returned a specific response body
354
+ if (Buffer.isBuffer(executionResult.body) || Array.isArray(executionResult.body)) {
355
+ // Binary response
356
+ res.status(status).send(Buffer.from(executionResult.body));
357
+ }
358
+ else {
359
+ // JSON response
360
+ res.status(status).json(executionResult.body);
361
+ }
362
+ }
363
+ else {
364
+ // No specific body, return execution info
365
+ res.status(status).json({
366
+ result: "Function executed successfully",
367
+ logs: executionResult.logs,
368
+ executionTime: executionResult.executionTime
369
+ });
370
+ }
371
+ }
372
+ else {
373
+ console.error(`[GLOBAL FUNCTION] Function execution failed: ${function_id} - ${executionResult.error?.message}`);
374
+ // Return standardized error response for function execution failures
375
+ res.status(500).send("Unexpected error during webhook execution");
376
+ }
377
+ }
378
+ catch (error) {
379
+ console.error(`Error executing global function ${function_id}:`, error);
380
+ res.status(500).send("Unexpected error during webhook execution");
381
+ }
382
+ };
383
+ // Register function routes for all HTTP methods
384
+ app.get("/functions/:app_id/:function_id/:guid", handleFunctionExecution);
385
+ app.post("/functions/:app_id/:function_id/:guid", handleFunctionExecution);
386
+ app.put("/functions/:app_id/:function_id/:guid", handleFunctionExecution);
387
+ app.delete("/functions/:app_id/:function_id/:guid", handleFunctionExecution);
388
+ app.patch("/functions/:app_id/:function_id/:guid", handleFunctionExecution);
389
+ app.get("/functions/:app_id/:function_id/:guid/*", handleFunctionExecution);
390
+ app.post("/functions/:app_id/:function_id/:guid/*", handleFunctionExecution);
391
+ app.put("/functions/:app_id/:function_id/:guid/*", handleFunctionExecution);
392
+ app.delete("/functions/:app_id/:function_id/:guid/*", handleFunctionExecution);
393
+ app.patch("/functions/:app_id/:function_id/:guid/*", handleFunctionExecution);
394
+ // Register global function routes (no GUID) for all HTTP methods
395
+ app.get("/functions/:app_id/:function_id", handleGlobalFunctionExecution);
396
+ app.post("/functions/:app_id/:function_id", handleGlobalFunctionExecution);
397
+ app.put("/functions/:app_id/:function_id", handleGlobalFunctionExecution);
398
+ app.delete("/functions/:app_id/:function_id", handleGlobalFunctionExecution);
399
+ app.patch("/functions/:app_id/:function_id", handleGlobalFunctionExecution);
400
+ app.get("/functions/:app_id/:function_id/*", handleGlobalFunctionExecution);
401
+ app.post("/functions/:app_id/:function_id/*", handleGlobalFunctionExecution);
402
+ app.put("/functions/:app_id/:function_id/*", handleGlobalFunctionExecution);
403
+ app.delete("/functions/:app_id/:function_id/*", handleGlobalFunctionExecution);
404
+ app.patch("/functions/:app_id/:function_id/*", handleGlobalFunctionExecution);
405
+ // Middleware to modify JavaScript responses containing IFRAME_PARENT_ORIGIN
406
+ app.use(async (req, res, next) => {
407
+ // Skip proxy for /devserver routes, /v1 API routes, /assets routes, /functions routes, and root React app route
408
+ if (req.path.startsWith("/devserver") ||
409
+ req.path.startsWith("/v1") ||
410
+ req.path.startsWith("/assets") ||
411
+ req.path.startsWith("/functions") ||
412
+ req.path === "/") {
413
+ return next();
414
+ }
415
+ // For JavaScript files, we need to potentially modify the content
416
+ const isJSRequest = req.path.endsWith(".js") ||
417
+ req.headers.accept?.includes("javascript") ||
418
+ req.get("content-type")?.includes("javascript");
419
+ if (isJSRequest) {
420
+ try {
421
+ // Fetch from the target directly
422
+ const targetUrl = `https://directory.zaius.com${req.path}${req.url.includes("?") ? req.url.substring(req.url.indexOf("?")) : ""}`;
423
+ const response = await fetch(targetUrl, {
424
+ method: req.method,
425
+ headers: {
426
+ ...req.headers,
427
+ host: "directory.zaius.com",
428
+ },
429
+ });
430
+ if (response.ok) {
431
+ const content = await response.text();
432
+ const host = req.get("host") || "localhost:3000";
433
+ const protocol = req.secure ? "https" : "http";
434
+ // Replace the IFRAME_PARENT_ORIGIN logic with our localhost origin
435
+ let modifiedContent = content.replace(/targetOrigin:[a-zA-Z0-9]*,/g, `targetOrigin:'http://localhost:3000',`);
436
+ modifiedContent = modifiedContent.replace(/e\.host=\["api"\]\.concat\(t\)\.join\("\."\)/g, `e.host='localhost:3000'`);
437
+ console.log(content.match(/e\.host=.{0,40}/g));
438
+ console.log(modifiedContent.match(/e\.host=.{0,40}/g));
439
+ // Set response headers
440
+ response.headers.forEach((value, key) => {
441
+ if (key !== "content-length" && key !== "content-encoding") {
442
+ res.set(key, value);
443
+ }
444
+ });
445
+ res.send(modifiedContent);
446
+ return;
447
+ }
448
+ }
449
+ catch (error) {
450
+ console.error("Error fetching JS file:", error);
451
+ }
452
+ }
453
+ // For all other requests, use the normal proxy
454
+ (0, http_proxy_middleware_1.createProxyMiddleware)({
455
+ target: "https://directory.zaius.com",
456
+ changeOrigin: true,
457
+ secure: true,
458
+ })(req, res, next);
459
+ });
460
+ // Serve the React app for /devserver routes and root
461
+ app.get(["/", "/devserver*"], (req, res) => {
462
+ res.sendFile(path_1.default.resolve(__dirname, "../public/index.html"));
463
+ });
464
+ // Start the file watcher
465
+ watcher.start();
466
+ // Start the server
467
+ const port = config_1.config.server.port;
468
+ server.listen(port, async () => {
469
+ const url = `http://localhost:${port}`;
470
+ console.log(`OCP Local Testing Tool running at ${url}`);
471
+ // Auto-open browser unless disabled, and only once per session
472
+ const shouldOpenBrowser = process.env.OCP_LOCAL_OPEN_BROWSER !== "false";
473
+ if (shouldOpenBrowser) {
474
+ // Use a temporary flag file to ensure browser opens only once per session
475
+ const flagFile = path_1.default.join(os_1.default.tmpdir(), `ocp-local-env-browser-opened-${port}`);
476
+ if (!fs_1.default.existsSync(flagFile)) {
477
+ try {
478
+ // Wait for the dev server to be ready before opening browser
479
+ console.log('Waiting for dev server to be ready...');
480
+ await waitForServerReady(url);
481
+ // Create flag file to prevent multiple opens
482
+ fs_1.default.writeFileSync(flagFile, 'opened');
483
+ console.log('Opening browser...');
484
+ await (0, open_1.default)(url);
485
+ // Clean up flag file on process exit
486
+ process.on('exit', () => {
487
+ try {
488
+ if (fs_1.default.existsSync(flagFile)) {
489
+ fs_1.default.unlinkSync(flagFile);
490
+ }
491
+ }
492
+ catch (e) {
493
+ // Ignore cleanup errors
494
+ }
495
+ });
496
+ }
497
+ catch (error) {
498
+ console.warn('Failed to open browser automatically:', error instanceof Error ? error.message : String(error));
499
+ console.log(`Please open your browser manually and go to: ${url}`);
500
+ }
501
+ }
502
+ }
503
+ else {
504
+ console.log(`Open your browser and go to: ${url}`);
505
+ }
506
+ });
507
+ // Handle shutdown
508
+ const shutdown = async () => {
509
+ console.log("Shutting down...");
510
+ // Stop watcher
511
+ watcher.stop();
512
+ // Cleanup IPC connections
513
+ try {
514
+ await lifecycleExecutor.cleanup();
515
+ await functionExecutor.cleanup();
516
+ console.log("IPC connections cleaned up");
517
+ }
518
+ catch (e) {
519
+ console.warn("Error during IPC cleanup:", e);
520
+ }
521
+ // Close server
522
+ server.close();
523
+ // Clean up browser flag file
524
+ try {
525
+ const flagFile = path_1.default.join(os_1.default.tmpdir(), `ocp-local-env-browser-opened-${port}`);
526
+ if (fs_1.default.existsSync(flagFile)) {
527
+ fs_1.default.unlinkSync(flagFile);
528
+ }
529
+ }
530
+ catch (e) {
531
+ // Ignore cleanup errors
532
+ }
533
+ process.exit(0);
534
+ };
535
+ process.on("SIGINT", shutdown);
536
+ process.on("SIGTERM", shutdown);
537
+ }
538
+ exports.startServer = startServer;
539
+ // Start the server when this file is executed directly
540
+ if (require.main === module) {
541
+ startServer().catch((error) => {
542
+ console.error('Failed to start server:', error);
543
+ process.exit(1);
544
+ });
545
+ }
546
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}