@ms-cloudpack/api-server 0.33.2 → 0.33.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.
package/lib/startApiServer.js
CHANGED
|
@@ -131,7 +131,7 @@ export async function startApiServer(params) {
|
|
|
131
131
|
case 'subscribe': {
|
|
132
132
|
const { path: subscriptionPath, id } = request.data;
|
|
133
133
|
disposables.set(id, bus.subscribe(subscriptionPath,
|
|
134
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
|
|
135
135
|
(data) => sendMessage({ type: 'notify', id, path: subscriptionPath, data })));
|
|
136
136
|
break;
|
|
137
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startApiServer.js","sourceRoot":"","sources":["../src/startApiServer.ts"],"names":[],"mappings":"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","sourcesContent":["import getPort from 'get-port';\nimport http from 'http';\nimport https from 'https';\nimport WebSocket, { WebSocketServer } from 'ws';\nimport type { DataBus } from '@ms-cloudpack/data-bus';\nimport type { TaskRunner } from './utilities/TaskRunner.js';\nimport { getCachePath } from './utilities/getCachePath.js';\nimport fsExtra from 'fs-extra';\nimport type { TaskDescription } from './types/TaskDescription.js';\nimport type { TaskEndDescription } from './types/TaskEndDescription.js';\nimport type { TaskStartDescription } from './types/TaskStartDescription.js';\nimport type { ApiServer } from './types/ApiServer.js';\nimport type { Session } from './types/Session.js';\nimport { validateOverride } from './utilities/validateOverride.js';\nimport { parseHttpsConfig, getDomain } from '@ms-cloudpack/create-express-app';\nimport type { TelemetryClient } from '@ms-cloudpack/telemetry';\nimport { editCloudpackConfig } from './utilities/editCloudpackConfig.js';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport { reloadCountSource, taskListSource, taskStatsSource } from './data/busSources.js';\nimport type { TaskStats } from './types/TaskStats.js';\nimport { addPackageOverride, type AddPackageOverrideInput } from './apis/addPackageOverride.js';\nimport type { ValidatePackageOverrideInput, ValidatePackageOverrideOutput } from './apis/validatePackageOverride.js';\nimport { openCodeEditor, type OpenCodeEditorInput } from './apis/openCodeEditor.js';\nimport { openFilePath, type OpenFilePathInput } from './apis/openFilePath.js';\nimport { reportMetric, type ReportMetricInput } from './apis/reportMetric.js';\n\n/**\n * The api server handles the data pub/sub (for things like reporting build status)\n * and hosting the dashboard verb backend (for executing actions like loading vscode,\n * changing dependencies, connecting new projects to the running session, etc.)\n *\n * Each time `cloudpack start` is run, an api server will start up for that session. The\n * hosted web page will have a \"cloudpack-api-server\" header which points\n * to the websocket server.\n *\n * The bundle server will call the api server to publish build status updates.\n *\n * The app server will burn the api server url on the host html, so that client-side\n * javascript can connect and subscribe to page changes.\n */\nexport async function startApiServer(params: {\n session: Session;\n telemetryClient: TelemetryClient;\n packages: PackageDefinitionsCache;\n bus: DataBus;\n taskRunner: TaskRunner;\n}): Promise<ApiServer> {\n const { session, telemetryClient, packages, bus, taskRunner } = params;\n const host = getDomain(session.config?.devServer?.domain);\n const port = await getPort({ port: [9890, 9891, 9892, 9893] });\n const sessionStats: TaskStats = {\n status: 'idle',\n\n remainingTasks: 0,\n totalTasks: 0,\n\n totalErrors: 0,\n totalWarnings: 0,\n };\n\n const allTasks = new Map<string, TaskDescription>();\n\n function reportStart(taskStart: TaskStartDescription): void {\n const previousResult = allTasks.get(taskStart.id);\n const now = new Date().getTime();\n\n if (!previousResult) {\n sessionStats.totalTasks++;\n }\n\n if (previousResult?.status === 'complete') {\n sessionStats.totalErrors -= previousResult.errors?.length || 0;\n sessionStats.totalWarnings -= previousResult.warnings?.length || 0;\n }\n\n sessionStats.remainingTasks++;\n sessionStats.status = 'pending';\n\n allTasks.set(taskStart.id, {\n ...taskStart,\n status: 'pending',\n startTime: now,\n });\n\n bus.publish(taskStatsSource, sessionStats);\n bus.publish(taskListSource, { tasks: Array.from(allTasks.values()) });\n }\n\n function reportEnd(taskEnd: TaskEndDescription): void {\n const previousResult = allTasks.get(taskEnd.id);\n const now = new Date().getTime();\n\n if (previousResult) {\n sessionStats.remainingTasks--;\n sessionStats.totalErrors += taskEnd.errors?.length || 0;\n sessionStats.totalWarnings += taskEnd.warnings?.length || 0;\n\n allTasks.set(taskEnd.id, {\n ...previousResult,\n ...taskEnd,\n status: 'complete',\n durationMilliseconds: now - previousResult.startTime,\n lastUpdated: now,\n });\n\n if (sessionStats.remainingTasks === 0) {\n sessionStats.status = 'idle';\n }\n\n bus.publish(taskStatsSource, sessionStats);\n bus.publish(taskListSource, { tasks: Array.from(allTasks.values()) });\n }\n }\n\n taskRunner.on('executeStarted', reportStart);\n taskRunner.on('executeCompleted', reportEnd);\n\n bus.publish([session.id, 'status'], sessionStats);\n\n // Create a node http(s) server.\n let server: http.Server | https.Server;\n const httpsConfig = session.config?.devServer?.https;\n const protocol = httpsConfig ? 'wss' : 'ws';\n\n if (httpsConfig) {\n const { key, cert, passphrase } = parseHttpsConfig(httpsConfig);\n\n if (!key || !cert) {\n console.error('Invalid https config in cloudpack.config.json. Make sure key and cert are valid.');\n\n throw new Error('Invalid https config.');\n }\n\n server = https\n .createServer(\n {\n key,\n cert,\n passphrase,\n },\n () => {\n /* no-op */\n },\n )\n .listen(port, host);\n } else {\n server = http.createServer().listen(port, host);\n }\n\n // Create a websocket server which listens for subscriptions and verb requests,\n // and broadcasts the data to all connected clients.\n const socketServer = new WebSocketServer({ server }, () => {\n // console.log(`ApiServer: Started on port ${port}`);\n }).on('connection', (socket: WebSocket) => {\n const disposables = new Map<number, () => void>();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function sendMessage(message: any) {\n socket.send(JSON.stringify(message, null, 2));\n }\n\n socket.send(\n JSON.stringify({\n type: 'sequence',\n sequence: session.sequence,\n }),\n );\n\n socket\n .on('message', (rawData) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const request = JSON.parse(rawData.toString()) as {\n type: string;\n requestId?: string;\n data: Record<string, unknown>;\n };\n\n switch (request.type) {\n /**\n * Subscribe to a data subscription.\n */\n case 'subscribe': {\n const { path: subscriptionPath, id } = request.data;\n\n disposables.set(\n id as number,\n bus.subscribe(\n subscriptionPath as string[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: any) => sendMessage({ type: 'notify', id, path: subscriptionPath, data }),\n ),\n );\n\n break;\n }\n\n /**\n * Unsubscribe from a data subscription.\n */\n case 'unsubscribe': {\n const id = request.data.id as number | undefined;\n if (id) {\n const dispose = disposables.get(id);\n\n if (dispose) {\n dispose();\n disposables.delete(id);\n }\n }\n\n break;\n }\n\n /**\n * Open a file in VSCode.\n */\n case 'openSource': {\n openCodeEditor({ input: request.data as OpenCodeEditorInput, ctx: {} }).catch(() => {\n // ignore\n });\n break;\n }\n\n /**\n * Open a file or folder in the OS's default file manager.\n */\n case 'open': {\n openFilePath({ input: request.data as OpenFilePathInput, ctx: { session } }).catch(() => {\n // ignore\n });\n break;\n }\n\n /**\n * Opens the cloudpack config in VSCode for the user to manually edit. If the file doesn't exist,\n * it will be created.\n */\n case 'editConfig': {\n editCloudpackConfig(session.appPath).catch(() => {\n /* no-op */\n });\n break;\n }\n\n /**\n * Adds an override to the cloudpack config.\n */\n case 'addOverride': {\n // TODO: Send filename from request data to findResolveMapEntry when chromium Issue 1371551 is fixed.\n (async () => {\n const { packageName, importPath } = request.data as AddPackageOverrideInput;\n await addPackageOverride({\n input: { packageName, importPath },\n ctx: { session, bus, packages, taskRunner },\n });\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'validateOverride': {\n // TODO: Get filename from request data when chromium Issue 1371551 is fixed.\n const requestId = request.requestId || '';\n (async () => {\n const input = request.data as ValidatePackageOverrideInput;\n const fixable = await validateOverride(input, { session, packages });\n const result: ValidatePackageOverrideOutput = { fixable };\n sendMessage({ type: 'validateOverride', requestId, data: result });\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'restartAllTasks': {\n console.log('ApiServer: Restarting all tasks');\n\n // Clear entire local cache.\n // eslint-disable-next-line @ms-cloudpack/internal/no-sync-filesystem\n fsExtra.emptyDirSync(getCachePath());\n\n // All tasks can be removed as notifyReload()\n // will cause the client to add the tasks again.\n allTasks.forEach((_, id) => {\n taskRunner.remove(id);\n });\n\n // Update session version.\n session.incrementSessionVersion();\n\n notifyReload();\n break;\n }\n\n case 'restartTask': {\n const { id, inputPath } = request.data as Record<string, string>;\n console.log(`ApiServer: Restarting task ${id}`);\n taskRunner.remove(id);\n session.incrementTargetVersion(inputPath);\n notifyReload();\n break;\n }\n\n case 'reportMetric': {\n reportMetric({ input: request.data as ReportMetricInput, ctx: { telemetryClient } });\n break;\n }\n }\n } catch (err) {\n console.error('ApiServer: error handling message');\n console.error('Error:', (err as Error).stack || err);\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n console.error('Message:', rawData.toString());\n }\n })\n .on('close', () => {\n for (const d of disposables.values()) {\n d();\n }\n });\n });\n\n const notifyReload = () => {\n session.sequence++;\n socketServer.clients.forEach((socket: WebSocket) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(\n JSON.stringify({\n type: 'reload',\n data: { sessionId: session.id },\n }),\n );\n }\n });\n };\n\n bus.subscribe(reloadCountSource, notifyReload);\n\n return {\n url: `${protocol}://${host}:${port}`,\n port,\n close: () =>\n new Promise<void>((resolve, reject) => {\n socketServer.clients.forEach((socket: WebSocket) => socket.terminate());\n socketServer.close((err) => (err ? reject(err) : resolve()));\n server.close();\n }),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"startApiServer.js","sourceRoot":"","sources":["../src/startApiServer.ts"],"names":[],"mappings":"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","sourcesContent":["import getPort from 'get-port';\nimport http from 'http';\nimport https from 'https';\nimport WebSocket, { WebSocketServer } from 'ws';\nimport type { DataBus } from '@ms-cloudpack/data-bus';\nimport type { TaskRunner } from './utilities/TaskRunner.js';\nimport { getCachePath } from './utilities/getCachePath.js';\nimport fsExtra from 'fs-extra';\nimport type { TaskDescription } from './types/TaskDescription.js';\nimport type { TaskEndDescription } from './types/TaskEndDescription.js';\nimport type { TaskStartDescription } from './types/TaskStartDescription.js';\nimport type { ApiServer } from './types/ApiServer.js';\nimport type { Session } from './types/Session.js';\nimport { validateOverride } from './utilities/validateOverride.js';\nimport { parseHttpsConfig, getDomain } from '@ms-cloudpack/create-express-app';\nimport type { TelemetryClient } from '@ms-cloudpack/telemetry';\nimport { editCloudpackConfig } from './utilities/editCloudpackConfig.js';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport { reloadCountSource, taskListSource, taskStatsSource } from './data/busSources.js';\nimport type { TaskStats } from './types/TaskStats.js';\nimport { addPackageOverride, type AddPackageOverrideInput } from './apis/addPackageOverride.js';\nimport type { ValidatePackageOverrideInput, ValidatePackageOverrideOutput } from './apis/validatePackageOverride.js';\nimport { openCodeEditor, type OpenCodeEditorInput } from './apis/openCodeEditor.js';\nimport { openFilePath, type OpenFilePathInput } from './apis/openFilePath.js';\nimport { reportMetric, type ReportMetricInput } from './apis/reportMetric.js';\n\n/**\n * The api server handles the data pub/sub (for things like reporting build status)\n * and hosting the dashboard verb backend (for executing actions like loading vscode,\n * changing dependencies, connecting new projects to the running session, etc.)\n *\n * Each time `cloudpack start` is run, an api server will start up for that session. The\n * hosted web page will have a \"cloudpack-api-server\" header which points\n * to the websocket server.\n *\n * The bundle server will call the api server to publish build status updates.\n *\n * The app server will burn the api server url on the host html, so that client-side\n * javascript can connect and subscribe to page changes.\n */\nexport async function startApiServer(params: {\n session: Session;\n telemetryClient: TelemetryClient;\n packages: PackageDefinitionsCache;\n bus: DataBus;\n taskRunner: TaskRunner;\n}): Promise<ApiServer> {\n const { session, telemetryClient, packages, bus, taskRunner } = params;\n const host = getDomain(session.config?.devServer?.domain);\n const port = await getPort({ port: [9890, 9891, 9892, 9893] });\n const sessionStats: TaskStats = {\n status: 'idle',\n\n remainingTasks: 0,\n totalTasks: 0,\n\n totalErrors: 0,\n totalWarnings: 0,\n };\n\n const allTasks = new Map<string, TaskDescription>();\n\n function reportStart(taskStart: TaskStartDescription): void {\n const previousResult = allTasks.get(taskStart.id);\n const now = new Date().getTime();\n\n if (!previousResult) {\n sessionStats.totalTasks++;\n }\n\n if (previousResult?.status === 'complete') {\n sessionStats.totalErrors -= previousResult.errors?.length || 0;\n sessionStats.totalWarnings -= previousResult.warnings?.length || 0;\n }\n\n sessionStats.remainingTasks++;\n sessionStats.status = 'pending';\n\n allTasks.set(taskStart.id, {\n ...taskStart,\n status: 'pending',\n startTime: now,\n });\n\n bus.publish(taskStatsSource, sessionStats);\n bus.publish(taskListSource, { tasks: Array.from(allTasks.values()) });\n }\n\n function reportEnd(taskEnd: TaskEndDescription): void {\n const previousResult = allTasks.get(taskEnd.id);\n const now = new Date().getTime();\n\n if (previousResult) {\n sessionStats.remainingTasks--;\n sessionStats.totalErrors += taskEnd.errors?.length || 0;\n sessionStats.totalWarnings += taskEnd.warnings?.length || 0;\n\n allTasks.set(taskEnd.id, {\n ...previousResult,\n ...taskEnd,\n status: 'complete',\n durationMilliseconds: now - previousResult.startTime,\n lastUpdated: now,\n });\n\n if (sessionStats.remainingTasks === 0) {\n sessionStats.status = 'idle';\n }\n\n bus.publish(taskStatsSource, sessionStats);\n bus.publish(taskListSource, { tasks: Array.from(allTasks.values()) });\n }\n }\n\n taskRunner.on('executeStarted', reportStart);\n taskRunner.on('executeCompleted', reportEnd);\n\n bus.publish([session.id, 'status'], sessionStats);\n\n // Create a node http(s) server.\n let server: http.Server | https.Server;\n const httpsConfig = session.config?.devServer?.https;\n const protocol = httpsConfig ? 'wss' : 'ws';\n\n if (httpsConfig) {\n const { key, cert, passphrase } = parseHttpsConfig(httpsConfig);\n\n if (!key || !cert) {\n console.error('Invalid https config in cloudpack.config.json. Make sure key and cert are valid.');\n\n throw new Error('Invalid https config.');\n }\n\n server = https\n .createServer(\n {\n key,\n cert,\n passphrase,\n },\n () => {\n /* no-op */\n },\n )\n .listen(port, host);\n } else {\n server = http.createServer().listen(port, host);\n }\n\n // Create a websocket server which listens for subscriptions and verb requests,\n // and broadcasts the data to all connected clients.\n const socketServer = new WebSocketServer({ server }, () => {\n // console.log(`ApiServer: Started on port ${port}`);\n }).on('connection', (socket: WebSocket) => {\n const disposables = new Map<number, () => void>();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function sendMessage(message: any) {\n socket.send(JSON.stringify(message, null, 2));\n }\n\n socket.send(\n JSON.stringify({\n type: 'sequence',\n sequence: session.sequence,\n }),\n );\n\n socket\n .on('message', (rawData) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const request = JSON.parse(rawData.toString()) as {\n type: string;\n requestId?: string;\n data: Record<string, unknown>;\n };\n\n switch (request.type) {\n /**\n * Subscribe to a data subscription.\n */\n case 'subscribe': {\n const { path: subscriptionPath, id } = request.data;\n\n disposables.set(\n id as number,\n bus.subscribe(\n subscriptionPath as string[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n (data: any) => sendMessage({ type: 'notify', id, path: subscriptionPath, data }),\n ),\n );\n\n break;\n }\n\n /**\n * Unsubscribe from a data subscription.\n */\n case 'unsubscribe': {\n const id = request.data.id as number | undefined;\n if (id) {\n const dispose = disposables.get(id);\n\n if (dispose) {\n dispose();\n disposables.delete(id);\n }\n }\n\n break;\n }\n\n /**\n * Open a file in VSCode.\n */\n case 'openSource': {\n openCodeEditor({ input: request.data as OpenCodeEditorInput, ctx: {} }).catch(() => {\n // ignore\n });\n break;\n }\n\n /**\n * Open a file or folder in the OS's default file manager.\n */\n case 'open': {\n openFilePath({ input: request.data as OpenFilePathInput, ctx: { session } }).catch(() => {\n // ignore\n });\n break;\n }\n\n /**\n * Opens the cloudpack config in VSCode for the user to manually edit. If the file doesn't exist,\n * it will be created.\n */\n case 'editConfig': {\n editCloudpackConfig(session.appPath).catch(() => {\n /* no-op */\n });\n break;\n }\n\n /**\n * Adds an override to the cloudpack config.\n */\n case 'addOverride': {\n // TODO: Send filename from request data to findResolveMapEntry when chromium Issue 1371551 is fixed.\n (async () => {\n const { packageName, importPath } = request.data as AddPackageOverrideInput;\n await addPackageOverride({\n input: { packageName, importPath },\n ctx: { session, bus, packages, taskRunner },\n });\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'validateOverride': {\n // TODO: Get filename from request data when chromium Issue 1371551 is fixed.\n const requestId = request.requestId || '';\n (async () => {\n const input = request.data as ValidatePackageOverrideInput;\n const fixable = await validateOverride(input, { session, packages });\n const result: ValidatePackageOverrideOutput = { fixable };\n sendMessage({ type: 'validateOverride', requestId, data: result });\n })().catch(() => {\n // no-op\n });\n break;\n }\n\n case 'restartAllTasks': {\n console.log('ApiServer: Restarting all tasks');\n\n // Clear entire local cache.\n // eslint-disable-next-line @ms-cloudpack/internal/no-sync-filesystem\n fsExtra.emptyDirSync(getCachePath());\n\n // All tasks can be removed as notifyReload()\n // will cause the client to add the tasks again.\n allTasks.forEach((_, id) => {\n taskRunner.remove(id);\n });\n\n // Update session version.\n session.incrementSessionVersion();\n\n notifyReload();\n break;\n }\n\n case 'restartTask': {\n const { id, inputPath } = request.data as Record<string, string>;\n console.log(`ApiServer: Restarting task ${id}`);\n taskRunner.remove(id);\n session.incrementTargetVersion(inputPath);\n notifyReload();\n break;\n }\n\n case 'reportMetric': {\n reportMetric({ input: request.data as ReportMetricInput, ctx: { telemetryClient } });\n break;\n }\n }\n } catch (err) {\n console.error('ApiServer: error handling message');\n console.error('Error:', (err as Error).stack || err);\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n console.error('Message:', rawData.toString());\n }\n })\n .on('close', () => {\n for (const d of disposables.values()) {\n d();\n }\n });\n });\n\n const notifyReload = () => {\n session.sequence++;\n socketServer.clients.forEach((socket: WebSocket) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(\n JSON.stringify({\n type: 'reload',\n data: { sessionId: session.id },\n }),\n );\n }\n });\n };\n\n bus.subscribe(reloadCountSource, notifyReload);\n\n return {\n url: `${protocol}://${host}:${port}`,\n port,\n close: () =>\n new Promise<void>((resolve, reject) => {\n socketServer.clients.forEach((socket: WebSocket) => socket.terminate());\n socketServer.close((err) => (err ? reject(err) : resolve()));\n server.close();\n }),\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.d.ts","sourceRoot":"","sources":["../../src/utilities/TaskRunner.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,YAAY,MAAM,QAAQ,CAAC;AAOlC;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,cAAc,CAAc;IAEpC,OAAO,CAAC,UAAU,CAAyB;;IAY3C;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TaskRunner.d.ts","sourceRoot":"","sources":["../../src/utilities/TaskRunner.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,YAAY,MAAM,QAAQ,CAAC;AAOlC;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,cAAc,CAAc;IAEpC,OAAO,CAAC,UAAU,CAAyB;;IAY3C;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IA6F1E;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAazB"}
|
|
@@ -53,9 +53,7 @@ export class TaskRunner extends EventEmitter {
|
|
|
53
53
|
// Delete from rerun list (if present).
|
|
54
54
|
this._requiresRerun.delete(id);
|
|
55
55
|
try {
|
|
56
|
-
|
|
57
|
-
// https://github.com/sindresorhus/p-queue/issues/175
|
|
58
|
-
taskResult = (await this._queue.add(async () => {
|
|
56
|
+
taskResult = await this._queue.add(async () => {
|
|
59
57
|
const startDescription = {
|
|
60
58
|
...task.getStartDescription?.(),
|
|
61
59
|
id: task.id,
|
|
@@ -68,7 +66,10 @@ export class TaskRunner extends EventEmitter {
|
|
|
68
66
|
};
|
|
69
67
|
this.emit('executeCompleted', endDescription);
|
|
70
68
|
return result;
|
|
71
|
-
}
|
|
69
|
+
},
|
|
70
|
+
// Removes void from return type.
|
|
71
|
+
// Read more on: https://github.com/sindresorhus/p-queue/issues/175
|
|
72
|
+
{ throwOnTimeout: true });
|
|
72
73
|
completed = true;
|
|
73
74
|
}
|
|
74
75
|
catch (err) {
|
|
@@ -79,6 +80,11 @@ export class TaskRunner extends EventEmitter {
|
|
|
79
80
|
log(`Task finished: "${name}:${id}"`);
|
|
80
81
|
// Delete from pending list.
|
|
81
82
|
this._pendingTasks.delete(id);
|
|
83
|
+
// Extra check to ensure that the task returned a value.
|
|
84
|
+
// It should never throw, if it does we have a bug.
|
|
85
|
+
if (taskResult === undefined) {
|
|
86
|
+
throw new Error(`Task "${name}:${id}" returned undefined`);
|
|
87
|
+
}
|
|
82
88
|
if (completed) {
|
|
83
89
|
// Update finished Tasks.
|
|
84
90
|
this._completedTasks.set(id, taskResult);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../../src/utilities/TaskRunner.ts"],"names":[],"mappings":"AAIA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,6DAA6D;AAC7D,MAAM,GAAG,GAAG,CAAC,GAAG,QAAmB,EAAE,EAAE;IACrC,2CAA2C;AAC7C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,YAAY;IAU1C;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAU,IAAmB,EAAE,OAAqB;QACrD,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACnC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAEvC,KAAK,EAAE,EAAE,CAAC;QAEV,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAwB,CAAC;QACnE,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,GAAG,CAAC,sCAAsC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;YACzD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAiC,CAAC;QAC3E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,GAAG,CAAC,oCAAoC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAChC,IAAI,UAA+B,CAAC;YACpC,IAAI,SAAkB,CAAC;YACvB,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,GAAG,CAAC;gBACF,uCAAuC;gBACvC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,CAAC;oBACH,
|
|
1
|
+
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../../src/utilities/TaskRunner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TaskStartDescription } from '../types/TaskStartDescription.js';\nimport type { TaskEndDescription } from '../types/TaskEndDescription.js';\nimport type { TaskOptions } from '../types/TaskOptions.js';\nimport type { Task } from '../types/Task.js';\nimport PQueue from 'p-queue';\nimport EventEmitter from 'events';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst log = (...messages: unknown[]) => {\n // console.log(`TaskRunner:`, ...messages);\n};\n\n/**\n * TaskRunner class manages the state of Tasks.\n * This class is to be called by the api server.\n */\nexport class TaskRunner extends EventEmitter {\n private _queue: PQueue;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _pendingTasks: Map<string, Promise<any>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _completedTasks: Map<string, any>;\n private _requiresRerun: Set<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _prevTasks: Map<string, Task<any>>;\n\n constructor() {\n super();\n\n this._queue = new PQueue({ concurrency: 10 });\n this._pendingTasks = new Map();\n this._completedTasks = new Map();\n this._requiresRerun = new Set();\n this._prevTasks = new Map();\n }\n\n /**\n * The add method enqueues a Task and returns its Promise.\n * If a Task with the same id has already been processed,\n * it returns either the result or the promise.\n * Rerun flag forces the Task to be run again.\n */\n add<TReturn>(task: Task<TReturn>, options?: TaskOptions): Promise<TReturn> {\n const { name, id, execute } = task;\n const { rerun, watch } = options || {};\n\n watch?.();\n\n if (!this._prevTasks.get(id)) {\n this._prevTasks.set(id, task);\n }\n\n // Check if we are already completed the task with that id.\n const action = this._completedTasks.get(id) as TReturn | undefined;\n if (action !== undefined && !rerun) {\n log(`Previous action found, returning: \"${name}:${id}\"`);\n return Promise.resolve(action);\n }\n\n // Check if we are already running the task with that id.\n const pending = this._pendingTasks.get(id) as Promise<TReturn> | undefined;\n if (pending !== undefined) {\n if (rerun) {\n this._requiresRerun.add(id);\n }\n log(`Previous action found, waiting: \"${name}:${id}\"`);\n return pending;\n }\n\n const resultPromise = (async () => {\n let taskResult: TReturn | undefined;\n let taskError: unknown;\n let completed = false;\n\n do {\n // Delete from rerun list (if present).\n this._requiresRerun.delete(id);\n try {\n taskResult = await this._queue.add(\n async () => {\n const startDescription: TaskStartDescription = {\n ...task.getStartDescription?.(),\n id: task.id,\n };\n this.emit('executeStarted', startDescription);\n\n const result = await execute();\n\n const endDescription: TaskEndDescription = {\n ...task.getEndDescription?.(result),\n id: task.id,\n };\n this.emit('executeCompleted', endDescription);\n\n return result;\n },\n // Removes void from return type.\n // Read more on: https://github.com/sindresorhus/p-queue/issues/175\n { throwOnTimeout: true },\n );\n completed = true;\n } catch (err) {\n // Save the error--it will be thrown later if a rerun was not requested.\n taskError = err;\n }\n } while (this._requiresRerun.has(id));\n\n log(`Task finished: \"${name}:${id}\"`);\n\n // Delete from pending list.\n this._pendingTasks.delete(id);\n\n // Extra check to ensure that the task returned a value.\n // It should never throw, if it does we have a bug.\n if (taskResult === undefined) {\n throw new Error(`Task \"${name}:${id}\" returned undefined`);\n }\n\n if (completed) {\n // Update finished Tasks.\n this._completedTasks.set(id, taskResult);\n // Resolve the promise.\n return taskResult;\n }\n\n // If the task never completed successfully, throw the error from earlier.\n throw taskError;\n })();\n\n this._pendingTasks.set(id, resultPromise);\n this._completedTasks.delete(id);\n\n return resultPromise;\n }\n\n /**\n * The remove method disposes a task if available\n * and then removes it from the TaskRunner.\n *\n * This is useful when the state of a task needs to be cleared.\n *\n * It is intended to be used by the api server\n * to clear the TaskRunner's state before reloading the page.\n */\n remove(id: string): void {\n this._prevTasks\n .get(id)\n ?.dispose?.()\n .catch(() => {\n log(`Error disposing task: ${id}`);\n });\n this._prevTasks.get(id)?.clear?.();\n this._prevTasks.delete(id);\n this._requiresRerun.delete(id);\n this._pendingTasks.delete(id);\n this._completedTasks.delete(id);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ms-cloudpack/api-server",
|
|
3
|
-
"version": "0.33.
|
|
3
|
+
"version": "0.33.4",
|
|
4
4
|
"description": "An implementation of the API server that does interacts with a task scheduler.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"@lage-run/logger": "^1.3.0",
|
|
28
28
|
"@lage-run/scheduler": "^1.1.9",
|
|
29
29
|
"@lage-run/target-graph": "^0.8.9",
|
|
30
|
-
"@ms-cloudpack/bundler": "^0.18.
|
|
30
|
+
"@ms-cloudpack/bundler": "^0.18.10",
|
|
31
31
|
"@ms-cloudpack/bundler-types": "^0.25.2",
|
|
32
32
|
"@ms-cloudpack/config": "^0.17.38",
|
|
33
33
|
"@ms-cloudpack/config-types": "^0.7.0",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"@ms-cloudpack/package-utilities": "^7.0.1",
|
|
41
41
|
"@ms-cloudpack/path-string-parsing": "^1.2.1",
|
|
42
42
|
"@ms-cloudpack/path-utilities": "^2.6.1",
|
|
43
|
-
"@ms-cloudpack/remote-cache": "^0.6.
|
|
44
|
-
"@ms-cloudpack/task-reporter": "^0.11.
|
|
43
|
+
"@ms-cloudpack/remote-cache": "^0.6.2",
|
|
44
|
+
"@ms-cloudpack/task-reporter": "^0.11.3",
|
|
45
45
|
"@ms-cloudpack/telemetry": "^0.5.1",
|
|
46
46
|
"@trpc/client": "^10.45.0",
|
|
47
47
|
"@trpc/server": "^10.45.0",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"filenamify": "^6.0.0",
|
|
51
51
|
"fs-extra": "^11.2.0",
|
|
52
52
|
"get-port": "^7.0.0",
|
|
53
|
-
"p-queue": "^
|
|
53
|
+
"p-queue": "^8.0.1",
|
|
54
54
|
"semver": "^7.6.0",
|
|
55
55
|
"uuid": "^9.0.0",
|
|
56
56
|
"ws": "^8.16.0",
|