@workflow/next 4.0.1-beta.50 → 4.0.1-beta.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/loader.js CHANGED
@@ -1,12 +1,171 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = workflowLoader;
4
+ const node_net_1 = require("node:net");
5
+ const node_module_1 = require("node:module");
4
6
  const node_path_1 = require("node:path");
5
7
  const core_1 = require("@swc/core");
8
+ const socket_server_js_1 = require("./socket-server.js");
9
+ const step_copy_utils_js_1 = require("./step-copy-utils.js");
6
10
  // Cache decorator options per working directory to avoid reading tsconfig for every file
7
11
  const decoratorOptionsCache = new Map();
8
12
  // Cache for shared utilities from @workflow/builders (ESM module loaded dynamically in CommonJS context)
9
13
  let cachedBuildersModule = null;
14
+ let cachedLoaderStaticDependencies = null;
15
+ // Cache socket connection to avoid reconnecting on every file.
16
+ let socketClientPromise = null;
17
+ let socketClient = null;
18
+ function registerFileDependency(loaderContext, dependencyPath) {
19
+ loaderContext.addDependency?.(dependencyPath);
20
+ loaderContext.addBuildDependency?.(dependencyPath);
21
+ }
22
+ function resolveLoaderStaticDependencies() {
23
+ if (cachedLoaderStaticDependencies) {
24
+ return cachedLoaderStaticDependencies;
25
+ }
26
+ const swcPluginPath = require.resolve('@workflow/swc-plugin');
27
+ const swcPluginBuildHashPath = require.resolve('@workflow/swc-plugin/build-hash.json');
28
+ const workflowBuildersPath = require.resolve('@workflow/builders');
29
+ const swcPluginRequire = (0, node_module_1.createRequire)(swcPluginPath);
30
+ const workflowBuildersRequire = (0, node_module_1.createRequire)(workflowBuildersPath);
31
+ const swcPluginPackageJsonPath = swcPluginRequire.resolve('./package.json');
32
+ const workflowBuildersPackageJsonPath = workflowBuildersRequire.resolve('../package.json');
33
+ const files = new Set([
34
+ __filename,
35
+ require.resolve('./socket-server'),
36
+ require.resolve('./step-copy-utils'),
37
+ swcPluginPath,
38
+ swcPluginBuildHashPath,
39
+ swcPluginPackageJsonPath,
40
+ workflowBuildersPath,
41
+ workflowBuildersPackageJsonPath,
42
+ ]);
43
+ cachedLoaderStaticDependencies = {
44
+ swcPluginPath,
45
+ files: Array.from(files),
46
+ };
47
+ return cachedLoaderStaticDependencies;
48
+ }
49
+ function registerTransformDependencies(loaderContext) {
50
+ const staticDependencies = resolveLoaderStaticDependencies();
51
+ for (const dependencyPath of staticDependencies.files) {
52
+ registerFileDependency(loaderContext, dependencyPath);
53
+ }
54
+ return staticDependencies.swcPluginPath;
55
+ }
56
+ function resetSocketClient(cachedSocket) {
57
+ if (cachedSocket && socketClient && socketClient !== cachedSocket) {
58
+ return;
59
+ }
60
+ socketClientPromise = null;
61
+ socketClient = null;
62
+ }
63
+ async function writeSocketMessage(socket, message) {
64
+ await new Promise((resolve, reject) => {
65
+ socket.write(message, (error) => {
66
+ if (error) {
67
+ reject(error);
68
+ return;
69
+ }
70
+ resolve();
71
+ });
72
+ });
73
+ }
74
+ function shouldUseSocketDiscovery() {
75
+ return Boolean(process.env.WORKFLOW_SOCKET_PORT && process.env.WORKFLOW_SOCKET_AUTH);
76
+ }
77
+ async function getSocketClient() {
78
+ if (!shouldUseSocketDiscovery()) {
79
+ return null;
80
+ }
81
+ if (socketClient?.destroyed) {
82
+ resetSocketClient(socketClient);
83
+ }
84
+ if (!socketClientPromise) {
85
+ socketClientPromise = (async () => {
86
+ try {
87
+ const socketPort = process.env.WORKFLOW_SOCKET_PORT;
88
+ if (!socketPort) {
89
+ throw new Error('Invariant: no socket port provided for workflow loader');
90
+ }
91
+ const port = Number.parseInt(socketPort, 10);
92
+ if (Number.isNaN(port)) {
93
+ throw new Error(`Invariant: invalid socket port provided: ${socketPort}`);
94
+ }
95
+ const socket = (0, node_net_1.connect)({ port, host: '127.0.0.1' });
96
+ // Wait for connection
97
+ await new Promise((resolve, reject) => {
98
+ const onConnect = () => {
99
+ socket.setNoDelay(true);
100
+ cleanup();
101
+ resolve();
102
+ };
103
+ const onError = (error) => {
104
+ cleanup();
105
+ reject(error);
106
+ };
107
+ const timeout = setTimeout(() => {
108
+ cleanup();
109
+ socket.destroy();
110
+ reject(new Error('Socket connection timeout'));
111
+ }, 1000);
112
+ const cleanup = () => {
113
+ clearTimeout(timeout);
114
+ socket.off('connect', onConnect);
115
+ socket.off('error', onError);
116
+ };
117
+ socket.on('connect', onConnect);
118
+ socket.on('error', onError);
119
+ });
120
+ socket.on('close', () => {
121
+ resetSocketClient(socket);
122
+ });
123
+ socket.on('error', () => {
124
+ resetSocketClient(socket);
125
+ });
126
+ socketClient = socket;
127
+ return socket;
128
+ }
129
+ catch (error) {
130
+ resetSocketClient();
131
+ throw error;
132
+ }
133
+ })();
134
+ }
135
+ return socketClientPromise;
136
+ }
137
+ async function notifySocketServer(filename, hasWorkflow, hasStep, hasSerde) {
138
+ if (!shouldUseSocketDiscovery()) {
139
+ return;
140
+ }
141
+ const socket = await getSocketClient();
142
+ if (!socket) {
143
+ throw new Error('Invariant: missing workflow socket connection');
144
+ }
145
+ const authToken = process.env.WORKFLOW_SOCKET_AUTH;
146
+ if (!authToken) {
147
+ throw new Error('Invariant: no socket auth token provided for workflow loader');
148
+ }
149
+ const message = {
150
+ type: 'file-discovered',
151
+ filePath: filename,
152
+ hasWorkflow,
153
+ hasStep,
154
+ hasSerde,
155
+ };
156
+ const serializedMessage = (0, socket_server_js_1.serializeMessage)(message, authToken);
157
+ try {
158
+ await writeSocketMessage(socket, serializedMessage);
159
+ }
160
+ catch (error) {
161
+ resetSocketClient(socket);
162
+ const reconnectedSocket = await getSocketClient();
163
+ if (!reconnectedSocket) {
164
+ throw error;
165
+ }
166
+ await writeSocketMessage(reconnectedSocket, serializedMessage);
167
+ }
168
+ }
10
169
  async function getBuildersModule() {
11
170
  if (cachedBuildersModule) {
12
171
  return cachedBuildersModule;
@@ -22,8 +181,8 @@ async function getDecoratorOptions(workingDir) {
22
181
  return cached;
23
182
  }
24
183
  const promise = (async () => {
25
- const { getDecoratorOptionsForDirectory } = await getBuildersModule();
26
- return getDecoratorOptionsForDirectory(workingDir);
184
+ const { getDecoratorOptionsForDirectoryWithConfigPath } = await getBuildersModule();
185
+ return getDecoratorOptionsForDirectoryWithConfigPath(workingDir);
27
186
  })();
28
187
  decoratorOptionsCache.set(workingDir, promise);
29
188
  return promise;
@@ -48,34 +207,11 @@ async function getModuleSpecifier(filePath, projectRoot) {
48
207
  const { resolveModuleSpecifier } = await getBuildersModule();
49
208
  return resolveModuleSpecifier(filePath, projectRoot).moduleSpecifier;
50
209
  }
51
- // This loader applies the "use workflow"/"use step"
52
- // client transformation
53
- async function workflowLoader(source, sourceMap) {
54
- const filename = this.resourcePath;
55
- const normalizedSource = source.toString();
56
- // Skip generated workflow route files to avoid re-processing them
57
- if (await checkGeneratedFile(filename)) {
58
- return normalizedSource;
59
- }
60
- // Detect workflow patterns in the source code
61
- const patterns = await detectPatterns(normalizedSource);
62
- // For @workflow SDK packages, only transform files with actual directives,
63
- // not files that just match serde patterns (which are internal SDK implementation files)
64
- const isSdkFile = await checkSdkFile(filename);
65
- if (isSdkFile && !patterns.hasDirective) {
66
- return normalizedSource;
67
- }
68
- // Check if file needs transformation based on patterns and path
69
- if (!(await checkShouldTransform(filename, patterns))) {
70
- return normalizedSource;
71
- }
72
- const isTypeScript = filename.endsWith('.ts') ||
73
- filename.endsWith('.tsx') ||
74
- filename.endsWith('.mts') ||
75
- filename.endsWith('.cts');
76
- // Calculate relative filename for SWC plugin
77
- // The SWC plugin uses filename to generate workflowId, so it must be relative
78
- const workingDir = process.cwd();
210
+ async function resolveWorkflowAliasPath(filePath, workingDir) {
211
+ const { resolveWorkflowAliasRelativePath } = await getBuildersModule();
212
+ return resolveWorkflowAliasRelativePath(filePath, workingDir);
213
+ }
214
+ async function getRelativeFilenameForSwc(filename, workingDir) {
79
215
  const normalizedWorkingDir = workingDir
80
216
  .replace(/\\/g, '/')
81
217
  .replace(/\/$/, '');
@@ -84,7 +220,7 @@ async function workflowLoader(source, sourceMap) {
84
220
  const lowerWd = normalizedWorkingDir.toLowerCase();
85
221
  const lowerPath = normalizedFilepath.toLowerCase();
86
222
  let relativeFilename;
87
- if (lowerPath.startsWith(lowerWd + '/')) {
223
+ if (lowerPath.startsWith(`${lowerWd}/`)) {
88
224
  // File is under working directory - manually calculate relative path
89
225
  relativeFilename = normalizedFilepath.substring(normalizedWorkingDir.length + 1);
90
226
  }
@@ -96,10 +232,16 @@ async function workflowLoader(source, sourceMap) {
96
232
  // Use relative() for files outside working directory
97
233
  relativeFilename = (0, node_path_1.relative)(workingDir, filename).replace(/\\/g, '/');
98
234
  if (relativeFilename.startsWith('../')) {
99
- relativeFilename = relativeFilename
100
- .split('/')
101
- .filter((part) => part !== '..')
102
- .join('/');
235
+ const aliasedRelativePath = await resolveWorkflowAliasPath(filename, workingDir);
236
+ if (aliasedRelativePath) {
237
+ relativeFilename = aliasedRelativePath;
238
+ }
239
+ else {
240
+ relativeFilename = relativeFilename
241
+ .split('/')
242
+ .filter((part) => part !== '..')
243
+ .join('/');
244
+ }
103
245
  }
104
246
  }
105
247
  // Final safety check - ensure we never pass an absolute path to SWC
@@ -107,49 +249,127 @@ async function workflowLoader(source, sourceMap) {
107
249
  // This should rarely happen, but use filename split as last resort
108
250
  relativeFilename = normalizedFilepath.split('/').pop() || 'unknown.ts';
109
251
  }
110
- // Get decorator options from tsconfig (cached per working directory)
111
- const decoratorOptions = await getDecoratorOptions(workingDir);
112
- // Resolve module specifier for packages (node_modules or workspace packages)
113
- const moduleSpecifier = await getModuleSpecifier(filename, workingDir);
114
- // Transform with SWC
115
- const result = await (0, core_1.transform)(normalizedSource, {
116
- filename: relativeFilename,
117
- jsc: {
118
- parser: {
119
- ...(isTypeScript
120
- ? {
121
- syntax: 'typescript',
122
- tsx: filename.endsWith('.tsx'),
123
- decorators: decoratorOptions.decorators,
124
- }
125
- : {
126
- syntax: 'ecmascript',
127
- jsx: filename.endsWith('.jsx'),
128
- decorators: decoratorOptions.decorators,
129
- }),
130
- },
131
- target: 'es2022',
132
- experimental: {
133
- plugins: [
134
- [
135
- require.resolve('@workflow/swc-plugin'),
136
- { mode: 'client', moduleSpecifier },
137
- ],
138
- ],
139
- },
140
- transform: {
141
- react: {
142
- runtime: 'preserve',
252
+ return relativeFilename;
253
+ }
254
+ function stripDeferredStepSourceMetadataComment(source) {
255
+ const metadataPattern = new RegExp(`^\\s*//\\s*${step_copy_utils_js_1.DEFERRED_STEP_SOURCE_METADATA_PREFIX}[A-Za-z0-9+/=]+\\s*\\r?\\n?`);
256
+ return source.replace(metadataPattern, '');
257
+ }
258
+ function workflowLoader(source, sourceMap) {
259
+ const callback = this.async?.();
260
+ const run = async () => {
261
+ const filename = this.resourcePath;
262
+ const normalizedSource = source.toString();
263
+ const workingDir = process.cwd();
264
+ const swcPluginPath = registerTransformDependencies(this);
265
+ const isDeferredStepCopyFile = (0, step_copy_utils_js_1.isDeferredStepCopyFilePath)(filename);
266
+ const deferredStepSourceMetadata = isDeferredStepCopyFile
267
+ ? (0, step_copy_utils_js_1.parseDeferredStepSourceMetadata)(normalizedSource)
268
+ : null;
269
+ const sourceWithoutDeferredMetadata = isDeferredStepCopyFile
270
+ ? stripDeferredStepSourceMetadataComment(normalizedSource)
271
+ : normalizedSource;
272
+ const deferredSourceMapResult = isDeferredStepCopyFile
273
+ ? (0, step_copy_utils_js_1.parseInlineSourceMapComment)(sourceWithoutDeferredMetadata)
274
+ : {
275
+ sourceWithoutMapComment: sourceWithoutDeferredMetadata,
276
+ sourceMap: null,
277
+ };
278
+ const sourceForTransform = deferredSourceMapResult.sourceWithoutMapComment;
279
+ // Skip generated workflow route files to avoid re-processing them
280
+ if ((await checkGeneratedFile(filename)) && !isDeferredStepCopyFile) {
281
+ return { code: normalizedSource, map: sourceMap };
282
+ }
283
+ // Detect workflow patterns in the source code
284
+ const patterns = await detectPatterns(normalizedSource);
285
+ // Always notify discovery tracking, even for `false/false`, so files that
286
+ // previously had workflow/step usage are removed from the tracked sets.
287
+ if (!isDeferredStepCopyFile) {
288
+ await notifySocketServer(filename, patterns.hasUseWorkflow, patterns.hasUseStep, patterns.hasSerde);
289
+ // For @workflow SDK packages, only transform files with actual directives,
290
+ // not files that just match serde patterns (which are internal SDK implementation files)
291
+ const isSdkFile = await checkSdkFile(filename);
292
+ if (isSdkFile && !patterns.hasDirective) {
293
+ return { code: normalizedSource, map: sourceMap };
294
+ }
295
+ // Check if file needs transformation based on patterns and path
296
+ if (!(await checkShouldTransform(filename, patterns))) {
297
+ return { code: normalizedSource, map: sourceMap };
298
+ }
299
+ }
300
+ const isTypeScript = filename.endsWith('.ts') ||
301
+ filename.endsWith('.tsx') ||
302
+ filename.endsWith('.mts') ||
303
+ filename.endsWith('.cts');
304
+ // Calculate relative filename for SWC plugin
305
+ // The SWC plugin uses filename to generate workflowId, so it must be relative
306
+ const relativeFilename = deferredStepSourceMetadata?.relativeFilename ||
307
+ (await getRelativeFilenameForSwc(filename, workingDir));
308
+ // Get decorator options from tsconfig (cached per working directory)
309
+ const { options: decoratorOptions, configPath } = await getDecoratorOptions(workingDir);
310
+ if (configPath) {
311
+ registerFileDependency(this, configPath);
312
+ }
313
+ // Resolve module specifier for packages (node_modules or workspace packages)
314
+ const moduleSpecifier = await getModuleSpecifier(deferredStepSourceMetadata?.absolutePath || filename, workingDir);
315
+ const mode = isDeferredStepCopyFile ? 'step' : 'client';
316
+ // Transform with SWC
317
+ const result = await (0, core_1.transform)(sourceForTransform, {
318
+ filename: relativeFilename,
319
+ jsc: {
320
+ parser: {
321
+ ...(isTypeScript
322
+ ? {
323
+ syntax: 'typescript',
324
+ tsx: filename.endsWith('.tsx'),
325
+ decorators: decoratorOptions.decorators,
326
+ }
327
+ : {
328
+ syntax: 'ecmascript',
329
+ jsx: filename.endsWith('.jsx'),
330
+ decorators: decoratorOptions.decorators,
331
+ }),
332
+ },
333
+ target: 'es2022',
334
+ experimental: {
335
+ plugins: [[swcPluginPath, { mode, moduleSpecifier }]],
336
+ },
337
+ transform: {
338
+ react: {
339
+ runtime: 'preserve',
340
+ },
341
+ legacyDecorator: decoratorOptions.legacyDecorator,
342
+ decoratorMetadata: decoratorOptions.decoratorMetadata,
143
343
  },
144
- legacyDecorator: decoratorOptions.legacyDecorator,
145
- decoratorMetadata: decoratorOptions.decoratorMetadata,
146
344
  },
147
- },
148
- minify: false,
149
- inputSourceMap: sourceMap,
150
- sourceMaps: true,
151
- inlineSourcesContent: true,
345
+ minify: false,
346
+ inputSourceMap: isDeferredStepCopyFile
347
+ ? deferredSourceMapResult.sourceMap || sourceMap
348
+ : sourceMap,
349
+ sourceMaps: true,
350
+ inlineSourcesContent: true,
351
+ });
352
+ let transformedMap = sourceMap;
353
+ if (typeof result.map === 'string') {
354
+ try {
355
+ transformedMap = JSON.parse(result.map);
356
+ }
357
+ catch {
358
+ transformedMap = result.map;
359
+ }
360
+ }
361
+ else if (result.map) {
362
+ transformedMap = result.map;
363
+ }
364
+ return { code: result.code, map: transformedMap };
365
+ };
366
+ if (!callback) {
367
+ return run().then((result) => result.code);
368
+ }
369
+ void run()
370
+ .then((result) => callback(null, result.code, result.map))
371
+ .catch((error) => {
372
+ callback(error instanceof Error ? error : new Error(String(error)));
152
373
  });
153
- return result.code;
154
374
  }
155
375
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Message types that can be sent between loader and builder
3
+ */
4
+ export type SocketMessage = {
5
+ type: 'file-discovered';
6
+ filePath: string;
7
+ hasWorkflow: boolean;
8
+ hasStep: boolean;
9
+ hasSerde: boolean;
10
+ } | {
11
+ type: 'trigger-build';
12
+ } | {
13
+ type: 'build-complete';
14
+ };
15
+ /**
16
+ * Configuration for the socket server
17
+ */
18
+ export interface SocketServerConfig {
19
+ isDevServer: boolean;
20
+ onFileDiscovered: (filePath: string, hasWorkflow: boolean, hasStep: boolean, hasSerde: boolean) => void;
21
+ onTriggerBuild: () => void;
22
+ }
23
+ /**
24
+ * Interface for the socket IO instance returned by createSocketServer
25
+ */
26
+ export interface SocketIO {
27
+ emit(event: 'build-complete'): void;
28
+ getAuthToken(): string;
29
+ }
30
+ /**
31
+ * Serialize a message with authentication preamble
32
+ */
33
+ export declare function serializeMessage(message: SocketMessage, authToken: string): string;
34
+ /**
35
+ * Parse and authenticate a message from the socket
36
+ * Returns the parsed message if valid, null otherwise
37
+ */
38
+ export declare function parseMessage(line: string, authToken: string): SocketMessage | null;
39
+ /**
40
+ * Create a TCP socket server for loader<->builder communication.
41
+ * Returns a SocketIO interface for broadcasting messages and the auth token.
42
+ *
43
+ * SECURITY: Server listens on 127.0.0.1 (localhost only) and uses
44
+ * message authentication to prevent processing of unauthorized messages.
45
+ */
46
+ export declare function createSocketServer(config: SocketServerConfig): Promise<SocketIO>;
47
+ //# sourceMappingURL=socket-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-server.d.ts","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;IACV,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,YAAY,IAAI,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,aAAa,GAAG,IAAI,CAoCtB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,QAAQ,CAAC,CA4EnB"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeMessage = serializeMessage;
4
+ exports.parseMessage = parseMessage;
5
+ exports.createSocketServer = createSocketServer;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const node_net_1 = require("node:net");
8
+ /**
9
+ * Magic preamble that must prefix all messages to authenticate them as workflow messages.
10
+ * This prevents accidental processing of messages from port scanners or other local processes.
11
+ */
12
+ const MESSAGE_PREAMBLE = 'WF:';
13
+ /**
14
+ * Generate a random authentication token for this server session.
15
+ * Clients must include this token in all messages.
16
+ */
17
+ function generateAuthToken() {
18
+ return (0, node_crypto_1.randomBytes)(16).toString('hex');
19
+ }
20
+ /**
21
+ * Serialize a message with authentication preamble
22
+ */
23
+ function serializeMessage(message, authToken) {
24
+ return `${MESSAGE_PREAMBLE}${authToken}:${JSON.stringify(message)}\n`;
25
+ }
26
+ /**
27
+ * Parse and authenticate a message from the socket
28
+ * Returns the parsed message if valid, null otherwise
29
+ */
30
+ function parseMessage(line, authToken) {
31
+ const trimmed = line.trim();
32
+ if (!trimmed) {
33
+ return null;
34
+ }
35
+ // Check for preamble
36
+ if (!trimmed.startsWith(MESSAGE_PREAMBLE)) {
37
+ console.warn('Received message without valid preamble, ignoring');
38
+ return null;
39
+ }
40
+ // Extract auth token and payload
41
+ const withoutPreamble = trimmed.slice(MESSAGE_PREAMBLE.length);
42
+ const colonIndex = withoutPreamble.indexOf(':');
43
+ if (colonIndex === -1) {
44
+ console.warn('Received message without auth token separator, ignoring');
45
+ return null;
46
+ }
47
+ const messageToken = withoutPreamble.slice(0, colonIndex);
48
+ const payload = withoutPreamble.slice(colonIndex + 1);
49
+ // Verify auth token
50
+ if (messageToken !== authToken) {
51
+ console.warn('Received message with invalid auth token, ignoring');
52
+ return null;
53
+ }
54
+ // Parse JSON payload
55
+ try {
56
+ return JSON.parse(payload);
57
+ }
58
+ catch (error) {
59
+ console.error('Failed to parse socket message JSON:', error);
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * Create a TCP socket server for loader<->builder communication.
65
+ * Returns a SocketIO interface for broadcasting messages and the auth token.
66
+ *
67
+ * SECURITY: Server listens on 127.0.0.1 (localhost only) and uses
68
+ * message authentication to prevent processing of unauthorized messages.
69
+ */
70
+ async function createSocketServer(config) {
71
+ const authToken = generateAuthToken();
72
+ const clients = new Set();
73
+ let buildTriggered = false;
74
+ const server = (0, node_net_1.createServer)((socket) => {
75
+ socket.setNoDelay(true);
76
+ clients.add(socket);
77
+ // Send build-complete if build already finished (production mode)
78
+ if (buildTriggered && !config.isDevServer) {
79
+ socket.write(serializeMessage({ type: 'build-complete' }, authToken));
80
+ }
81
+ let buffer = '';
82
+ socket.on('data', (data) => {
83
+ buffer += data.toString();
84
+ // Process complete messages (newline-delimited)
85
+ let newlineIndex = buffer.indexOf('\n');
86
+ while (newlineIndex !== -1) {
87
+ const line = buffer.slice(0, newlineIndex);
88
+ buffer = buffer.slice(newlineIndex + 1);
89
+ newlineIndex = buffer.indexOf('\n');
90
+ const message = parseMessage(line, authToken);
91
+ if (!message) {
92
+ continue;
93
+ }
94
+ if (message.type === 'file-discovered') {
95
+ config.onFileDiscovered(message.filePath, message.hasWorkflow, message.hasStep, message.hasSerde);
96
+ }
97
+ else if (message.type === 'trigger-build') {
98
+ config.onTriggerBuild();
99
+ }
100
+ }
101
+ });
102
+ socket.on('end', () => {
103
+ clients.delete(socket);
104
+ });
105
+ socket.on('error', (err) => {
106
+ console.error('Socket error:', err);
107
+ clients.delete(socket);
108
+ });
109
+ });
110
+ // Listen on random available port (localhost only)
111
+ await new Promise((resolve) => {
112
+ server.listen(0, '127.0.0.1', () => {
113
+ const address = server.address();
114
+ if (address && typeof address === 'object') {
115
+ process.env.WORKFLOW_SOCKET_PORT = String(address.port);
116
+ process.env.WORKFLOW_SOCKET_AUTH = authToken;
117
+ }
118
+ resolve();
119
+ });
120
+ });
121
+ return {
122
+ emit: (_event) => {
123
+ buildTriggered = true;
124
+ const message = serializeMessage({ type: 'build-complete' }, authToken);
125
+ for (const client of clients) {
126
+ client.write(message);
127
+ }
128
+ },
129
+ getAuthToken: () => authToken,
130
+ };
131
+ }
132
+ //# sourceMappingURL=socket-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-server.js","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"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"}