@trackunit/iris-app-build-utilities 1.12.72 → 1.12.73
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/CHANGELOG.md +7 -0
- package/package.json +3 -3
- package/src/createInvokeProxyMiddleware.d.ts +3 -3
- package/src/createInvokeProxyMiddleware.js +4 -4
- package/src/devServerUtils.d.ts +2 -2
- package/src/devServerUtils.js +3 -3
- package/src/getIrisAppDevServer.d.ts +2 -2
- package/src/getIrisAppDevServer.js +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -1
- package/src/{serverlessUtils.d.ts → serversideUtils.d.ts} +7 -7
- package/src/{serverlessUtils.js → serversideUtils.js} +11 -11
- package/src/{spawnServerlessExtensions.d.ts → spawnServersideExtensions.d.ts} +6 -6
- package/src/{spawnServerlessExtensions.js → spawnServersideExtensions.js} +23 -23
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/iris-app-build-utilities",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.73",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"repository": "https://github.com/Trackunit/manager",
|
|
6
6
|
"engines": {
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"tslib": "^2.6.2",
|
|
16
16
|
"csp-header": "^5.2.1",
|
|
17
17
|
"@rspack/core": "1.6.7",
|
|
18
|
-
"@trackunit/iris-app-api": "1.14.
|
|
18
|
+
"@trackunit/iris-app-api": "1.14.67",
|
|
19
19
|
"@nx/devkit": "22.4.4",
|
|
20
|
-
"@trackunit/shared-utils": "1.13.
|
|
20
|
+
"@trackunit/shared-utils": "1.13.64",
|
|
21
21
|
"http-proxy-middleware": "3.0.5",
|
|
22
22
|
"pacote": "^21.0.4",
|
|
23
23
|
"semver": "7.5.4"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ServersidePortMap } from "./spawnServersideExtensions";
|
|
3
3
|
type MiddlewareRequest = IncomingMessage & {
|
|
4
4
|
originalUrl?: string;
|
|
5
5
|
};
|
|
@@ -7,7 +7,7 @@ type MiddlewareResponse = ServerResponse<IncomingMessage>;
|
|
|
7
7
|
type MiddlewareNext = () => void;
|
|
8
8
|
type ProxyHandler = (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext) => void;
|
|
9
9
|
/**
|
|
10
|
-
* Creates /invoke middleware that routes to local
|
|
10
|
+
* Creates /invoke middleware that routes to local serverside processes when available.
|
|
11
11
|
*/
|
|
12
|
-
export declare const createInvokeProxyMiddleware: (
|
|
12
|
+
export declare const createInvokeProxyMiddleware: (serversidePortMap: ServersidePortMap | undefined) => ProxyHandler;
|
|
13
13
|
export {};
|
|
@@ -24,7 +24,7 @@ const createLocalExtensionProxy = (target, extensionId) => {
|
|
|
24
24
|
(0, consoleUtils_1.logError)(`[Proxy] Error proxying to ${extensionId}: ${err.message}`);
|
|
25
25
|
if ("writeHead" in proxyRes && "end" in proxyRes) {
|
|
26
26
|
proxyRes.writeHead(502, { "Content-Type": "application/json" });
|
|
27
|
-
proxyRes.end(JSON.stringify({ error: `
|
|
27
|
+
proxyRes.end(JSON.stringify({ error: `Serverside extension ${extensionId} unavailable` }));
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
},
|
|
@@ -44,15 +44,15 @@ const getOrCreateLocalProxy = (cache, extensionId, port) => {
|
|
|
44
44
|
return newProxy;
|
|
45
45
|
};
|
|
46
46
|
/**
|
|
47
|
-
* Creates /invoke middleware that routes to local
|
|
47
|
+
* Creates /invoke middleware that routes to local serverside processes when available.
|
|
48
48
|
*/
|
|
49
|
-
const createInvokeProxyMiddleware = (
|
|
49
|
+
const createInvokeProxyMiddleware = (serversidePortMap) => {
|
|
50
50
|
const localProxyCache = new Map();
|
|
51
51
|
const remoteProxy = createRemoteIrisProxy();
|
|
52
52
|
return (req, res, next) => {
|
|
53
53
|
const fullPath = req.originalUrl ?? `/invoke${req.url ?? ""}`;
|
|
54
54
|
const extensionId = (0, devServerUtils_1.parseExtensionIdFromPath)(fullPath);
|
|
55
|
-
const localPort = (0, devServerUtils_1.getLocalPort)(extensionId,
|
|
55
|
+
const localPort = (0, devServerUtils_1.getLocalPort)(extensionId, serversidePortMap);
|
|
56
56
|
if (localPort !== undefined && extensionId !== undefined) {
|
|
57
57
|
const endpointPath = (0, devServerUtils_1.extractEndpointPath)(fullPath);
|
|
58
58
|
(0, consoleUtils_1.logInfo)(`[Proxy] ${fullPath} -> ${(0, devServerUtils_1.buildLocalTarget)(localPort)}${endpointPath}`);
|
package/src/devServerUtils.d.ts
CHANGED
|
@@ -50,10 +50,10 @@ export declare const getOrigin: (headers: {
|
|
|
50
50
|
* Determines if a request should be routed to a local extension.
|
|
51
51
|
*
|
|
52
52
|
* @param extensionId - The parsed extension ID
|
|
53
|
-
* @param
|
|
53
|
+
* @param serversidePortMap - Map of extension IDs to local ports
|
|
54
54
|
* @returns {number | undefined} The local port if available, undefined otherwise
|
|
55
55
|
*/
|
|
56
|
-
export declare const getLocalPort: (extensionId: string | undefined,
|
|
56
|
+
export declare const getLocalPort: (extensionId: string | undefined, serversidePortMap: Map<string, number> | undefined) => number | undefined;
|
|
57
57
|
/**
|
|
58
58
|
* Builds the local proxy target URL.
|
|
59
59
|
*
|
package/src/devServerUtils.js
CHANGED
|
@@ -66,14 +66,14 @@ exports.getOrigin = getOrigin;
|
|
|
66
66
|
* Determines if a request should be routed to a local extension.
|
|
67
67
|
*
|
|
68
68
|
* @param extensionId - The parsed extension ID
|
|
69
|
-
* @param
|
|
69
|
+
* @param serversidePortMap - Map of extension IDs to local ports
|
|
70
70
|
* @returns {number | undefined} The local port if available, undefined otherwise
|
|
71
71
|
*/
|
|
72
|
-
const getLocalPort = (extensionId,
|
|
72
|
+
const getLocalPort = (extensionId, serversidePortMap) => {
|
|
73
73
|
if (extensionId === undefined) {
|
|
74
74
|
return undefined;
|
|
75
75
|
}
|
|
76
|
-
return
|
|
76
|
+
return serversidePortMap?.get(extensionId);
|
|
77
77
|
};
|
|
78
78
|
exports.getLocalPort = getLocalPort;
|
|
79
79
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { DevServer as RspackDevServer } from "@rspack/core";
|
|
2
2
|
import type { Configuration as WebpackDevServerConfiguration } from "webpack-dev-server";
|
|
3
|
-
import type {
|
|
3
|
+
import type { ServersidePortMap } from "./spawnServersideExtensions";
|
|
4
4
|
export interface DevServerOptions {
|
|
5
|
-
|
|
5
|
+
serversidePortMap?: ServersidePortMap;
|
|
6
6
|
}
|
|
7
7
|
/** Generates a dev server configuration for webpack. */
|
|
8
8
|
export declare const getIrisAppWebpackDevServer: (webpackDevServerConfiguration?: WebpackDevServerConfiguration, options?: DevServerOptions) => Promise<WebpackDevServerConfiguration>;
|
|
@@ -65,7 +65,7 @@ const createExtensionLoaderHandler = () => {
|
|
|
65
65
|
/** Registers all middlewares on the dev server app. */
|
|
66
66
|
const registerMiddlewares = (app, middlewares, port, options) => {
|
|
67
67
|
// Register /invoke proxy
|
|
68
|
-
app.use("/invoke", (0, createInvokeProxyMiddleware_1.createInvokeProxyMiddleware)(options.
|
|
68
|
+
app.use("/invoke", (0, createInvokeProxyMiddleware_1.createInvokeProxyMiddleware)(options.serversidePortMap));
|
|
69
69
|
// Register CORS origin handler on all routes
|
|
70
70
|
app.use("/", createCorsOriginHandler());
|
|
71
71
|
// Register endpoint handlers
|
package/src/index.d.ts
CHANGED
|
@@ -13,4 +13,4 @@ export * from "./plugin-shared/consoleUtils";
|
|
|
13
13
|
export * from "./plugin-shared/customFieldUtil";
|
|
14
14
|
export * from "./plugin-shared/extensionUtil";
|
|
15
15
|
export * from "./plugin-shared/indexHtmlUtil";
|
|
16
|
-
export * from "./
|
|
16
|
+
export * from "./spawnServersideExtensions";
|
package/src/index.js
CHANGED
|
@@ -16,5 +16,5 @@ tslib_1.__exportStar(require("./plugin-shared/consoleUtils"), exports);
|
|
|
16
16
|
tslib_1.__exportStar(require("./plugin-shared/customFieldUtil"), exports);
|
|
17
17
|
tslib_1.__exportStar(require("./plugin-shared/extensionUtil"), exports);
|
|
18
18
|
tslib_1.__exportStar(require("./plugin-shared/indexHtmlUtil"), exports);
|
|
19
|
-
tslib_1.__exportStar(require("./
|
|
19
|
+
tslib_1.__exportStar(require("./spawnServersideExtensions"), exports);
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure utility functions for
|
|
2
|
+
* Pure utility functions for serverside extension spawning.
|
|
3
3
|
* These functions are side-effect free and easily testable.
|
|
4
4
|
*/
|
|
5
|
-
/** Port range for
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
/**
|
|
9
|
-
export declare const
|
|
5
|
+
/** Port range for serverside extension dev servers */
|
|
6
|
+
export declare const SERVERSIDE_PORT_MIN = 22230;
|
|
7
|
+
export declare const SERVERSIDE_PORT_MAX = 22239;
|
|
8
|
+
/** Serverside extension type constant */
|
|
9
|
+
export declare const SERVERSIDE_EXTENSION_TYPE: "SERVERSIDE_API_EXTENSION";
|
|
10
10
|
/**
|
|
11
11
|
* Creates the spawn command arguments for an extension.
|
|
12
12
|
*
|
|
@@ -18,7 +18,7 @@ export declare const createSpawnCommand: (extensionId: string) => {
|
|
|
18
18
|
args: Array<string>;
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
|
-
* Creates spawn options for a
|
|
21
|
+
* Creates spawn options for a serverside extension process.
|
|
22
22
|
*
|
|
23
23
|
* @param workspaceRoot - The NX workspace root directory
|
|
24
24
|
* @param port - The port to run the extension on
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Pure utility functions for
|
|
3
|
+
* Pure utility functions for serverside extension spawning.
|
|
4
4
|
* These functions are side-effect free and easily testable.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.analyzeProcessExit = exports.splitBufferToLines = exports.formatLogLine = exports.createSpawnOptions = exports.createSpawnCommand = exports.
|
|
8
|
-
/** Port range for
|
|
9
|
-
exports.
|
|
10
|
-
exports.
|
|
11
|
-
/**
|
|
12
|
-
exports.
|
|
7
|
+
exports.analyzeProcessExit = exports.splitBufferToLines = exports.formatLogLine = exports.createSpawnOptions = exports.createSpawnCommand = exports.SERVERSIDE_EXTENSION_TYPE = exports.SERVERSIDE_PORT_MAX = exports.SERVERSIDE_PORT_MIN = void 0;
|
|
8
|
+
/** Port range for serverside extension dev servers */
|
|
9
|
+
exports.SERVERSIDE_PORT_MIN = 22230;
|
|
10
|
+
exports.SERVERSIDE_PORT_MAX = 22239;
|
|
11
|
+
/** Serverside extension type constant */
|
|
12
|
+
exports.SERVERSIDE_EXTENSION_TYPE = "SERVERSIDE_API_EXTENSION";
|
|
13
13
|
/**
|
|
14
14
|
* Creates the spawn command arguments for an extension.
|
|
15
15
|
*
|
|
@@ -22,7 +22,7 @@ const createSpawnCommand = (extensionId) => ({
|
|
|
22
22
|
});
|
|
23
23
|
exports.createSpawnCommand = createSpawnCommand;
|
|
24
24
|
/**
|
|
25
|
-
* Creates spawn options for a
|
|
25
|
+
* Creates spawn options for a serverside extension process.
|
|
26
26
|
*
|
|
27
27
|
* @param workspaceRoot - The NX workspace root directory
|
|
28
28
|
* @param port - The port to run the extension on
|
|
@@ -70,12 +70,12 @@ exports.splitBufferToLines = splitBufferToLines;
|
|
|
70
70
|
*/
|
|
71
71
|
const analyzeProcessExit = (extensionId, code, signal) => {
|
|
72
72
|
if (code !== null && code !== 0) {
|
|
73
|
-
return { isError: true, message: `[
|
|
73
|
+
return { isError: true, message: `[Serverside] ${extensionId} exited with code ${code}` };
|
|
74
74
|
}
|
|
75
75
|
if (signal) {
|
|
76
|
-
return { isError: false, message: `[
|
|
76
|
+
return { isError: false, message: `[Serverside] ${extensionId} terminated by signal ${signal}` };
|
|
77
77
|
}
|
|
78
78
|
return { isError: false, message: null };
|
|
79
79
|
};
|
|
80
80
|
exports.analyzeProcessExit = analyzeProcessExit;
|
|
81
|
-
//# sourceMappingURL=
|
|
81
|
+
//# sourceMappingURL=serversideUtils.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import type { IrisAppManifest } from "@trackunit/iris-app-api";
|
|
2
2
|
import { ChildProcess } from "child_process";
|
|
3
|
-
export type
|
|
4
|
-
export interface
|
|
5
|
-
portMap:
|
|
3
|
+
export type ServersidePortMap = Map<string, number>;
|
|
4
|
+
export interface SpawnedServersideExtensions {
|
|
5
|
+
portMap: ServersidePortMap;
|
|
6
6
|
processes: Array<ChildProcess>;
|
|
7
7
|
cleanup: () => void;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* Spawns serve processes for all
|
|
10
|
+
* Spawns serve processes for all serverside function extensions in the manifest.
|
|
11
11
|
*
|
|
12
12
|
* @param manifest The Iris App manifest containing extensions
|
|
13
13
|
* @param workspaceRoot The root directory of the NX workspace
|
|
14
|
-
* @returns {Promise<
|
|
14
|
+
* @returns {Promise<SpawnedServersideExtensions>} Object containing port map, spawned processes, and cleanup function
|
|
15
15
|
*/
|
|
16
|
-
export declare const
|
|
16
|
+
export declare const spawnServersideExtensions: (manifest: IrisAppManifest, workspaceRoot: string) => Promise<SpawnedServersideExtensions>;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.spawnServersideExtensions = void 0;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
5
|
const getAvailablePort_1 = require("./getAvailablePort");
|
|
6
|
-
const
|
|
6
|
+
const serversideUtils_1 = require("./serversideUtils");
|
|
7
7
|
/**
|
|
8
|
-
* Spawns serve processes for all
|
|
8
|
+
* Spawns serve processes for all serverside function extensions in the manifest.
|
|
9
9
|
*
|
|
10
10
|
* @param manifest The Iris App manifest containing extensions
|
|
11
11
|
* @param workspaceRoot The root directory of the NX workspace
|
|
12
|
-
* @returns {Promise<
|
|
12
|
+
* @returns {Promise<SpawnedServersideExtensions>} Object containing port map, spawned processes, and cleanup function
|
|
13
13
|
*/
|
|
14
|
-
const
|
|
14
|
+
const spawnServersideExtensions = async (manifest, workspaceRoot) => {
|
|
15
15
|
const portMap = new Map();
|
|
16
16
|
const processes = [];
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
17
|
+
const serversideExtensions = manifest.extensions.filter(ext => ext.type === serversideUtils_1.SERVERSIDE_EXTENSION_TYPE);
|
|
18
|
+
if (serversideExtensions.length === 0) {
|
|
19
19
|
return {
|
|
20
20
|
portMap,
|
|
21
21
|
processes,
|
|
@@ -23,47 +23,47 @@ const spawnServerlessExtensions = async (manifest, workspaceRoot) => {
|
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
// eslint-disable-next-line no-console
|
|
26
|
-
console.log(`\n[
|
|
27
|
-
let nextPort =
|
|
28
|
-
for (const extension of
|
|
26
|
+
console.log(`\n[Serverside] Found ${serversideExtensions.length} serverside extension(s)`);
|
|
27
|
+
let nextPort = serversideUtils_1.SERVERSIDE_PORT_MIN;
|
|
28
|
+
for (const extension of serversideExtensions) {
|
|
29
29
|
const extensionId = extension.id;
|
|
30
30
|
// Find available port
|
|
31
31
|
let port;
|
|
32
32
|
try {
|
|
33
|
-
port = await (0, getAvailablePort_1.getAvailablePort)(nextPort,
|
|
33
|
+
port = await (0, getAvailablePort_1.getAvailablePort)(nextPort, serversideUtils_1.SERVERSIDE_PORT_MAX);
|
|
34
34
|
nextPort = port + 1;
|
|
35
35
|
}
|
|
36
36
|
catch {
|
|
37
37
|
// eslint-disable-next-line no-console
|
|
38
|
-
console.error(`[
|
|
38
|
+
console.error(`[Serverside] No available ports for ${extensionId}, skipping`);
|
|
39
39
|
continue;
|
|
40
40
|
}
|
|
41
41
|
// eslint-disable-next-line no-console
|
|
42
|
-
console.log(`[
|
|
43
|
-
const { command, args } = (0,
|
|
44
|
-
const spawnOptions = (0,
|
|
42
|
+
console.log(`[Serverside] Starting ${extensionId} on port ${port}`);
|
|
43
|
+
const { command, args } = (0, serversideUtils_1.createSpawnCommand)(extensionId);
|
|
44
|
+
const spawnOptions = (0, serversideUtils_1.createSpawnOptions)(workspaceRoot, port, process.env);
|
|
45
45
|
const child = (0, child_process_1.spawn)(command, args, spawnOptions);
|
|
46
46
|
// Prefix output with extension name
|
|
47
47
|
child.stdout.on("data", (data) => {
|
|
48
|
-
const lines = (0,
|
|
48
|
+
const lines = (0, serversideUtils_1.splitBufferToLines)(data);
|
|
49
49
|
for (const line of lines) {
|
|
50
50
|
// eslint-disable-next-line no-console
|
|
51
|
-
console.log((0,
|
|
51
|
+
console.log((0, serversideUtils_1.formatLogLine)(extensionId, line));
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
54
|
child.stderr.on("data", (data) => {
|
|
55
|
-
const lines = (0,
|
|
55
|
+
const lines = (0, serversideUtils_1.splitBufferToLines)(data);
|
|
56
56
|
for (const line of lines) {
|
|
57
57
|
// eslint-disable-next-line no-console
|
|
58
|
-
console.error((0,
|
|
58
|
+
console.error((0, serversideUtils_1.formatLogLine)(extensionId, line));
|
|
59
59
|
}
|
|
60
60
|
});
|
|
61
61
|
child.on("error", err => {
|
|
62
62
|
// eslint-disable-next-line no-console
|
|
63
|
-
console.error(`[
|
|
63
|
+
console.error(`[Serverside] Failed to start ${extensionId}: ${err.message}`);
|
|
64
64
|
});
|
|
65
65
|
child.on("exit", (code, signal) => {
|
|
66
|
-
const { isError, message } = (0,
|
|
66
|
+
const { isError, message } = (0, serversideUtils_1.analyzeProcessExit)(extensionId, code, signal);
|
|
67
67
|
if (message !== null) {
|
|
68
68
|
if (isError) {
|
|
69
69
|
// eslint-disable-next-line no-console
|
|
@@ -95,5 +95,5 @@ const spawnServerlessExtensions = async (manifest, workspaceRoot) => {
|
|
|
95
95
|
process.on("SIGTERM", cleanup);
|
|
96
96
|
return { portMap, processes, cleanup };
|
|
97
97
|
};
|
|
98
|
-
exports.
|
|
99
|
-
//# sourceMappingURL=
|
|
98
|
+
exports.spawnServersideExtensions = spawnServersideExtensions;
|
|
99
|
+
//# sourceMappingURL=spawnServersideExtensions.js.map
|