@sshkeda/task 0.0.0-stage → 1.0.1
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/LICENSE +21 -0
- package/README.md +131 -2
- package/package.json +41 -4
- package/src/index.ts +2 -0
- package/src/lib/errors/index.ts +15 -0
- package/src/lib/errors/internal/errors.ts +147 -0
- package/src/lib/kill-leftover-processes/index.ts +17 -0
- package/src/lib/kill-leftover-processes/internal/command-words.ts +16 -0
- package/src/lib/kill-leftover-processes/internal/find-process-ids.ts +36 -0
- package/src/lib/kill-leftover-processes/internal/kill-process-groups.ts +270 -0
- package/src/lib/kill-leftover-processes/internal/list-linux-processes-from-proc.ts +191 -0
- package/src/lib/kill-leftover-processes/internal/list-macos-processes-with-sysctl.ts +335 -0
- package/src/lib/kill-leftover-processes/internal/list-processes.ts +58 -0
- package/src/lib/kill-leftover-processes/internal/mark-run-processes.ts +367 -0
- package/src/lib/kill-leftover-processes/internal/process-cleanup-errors.ts +17 -0
- package/src/lib/kill-leftover-processes/internal/send-signal.ts +32 -0
- package/src/lib/kill-leftover-processes/internal/signal-run-processes.ts +48 -0
- package/src/lib/kill-leftover-processes/internal/started-process-groups.ts +107 -0
- package/src/lib/main-thread/index.ts +3 -0
- package/src/lib/main-thread/internal/listen-for-stop-requests.ts +102 -0
- package/src/lib/main-thread/internal/run-main-thread.ts +81 -0
- package/src/lib/main-thread/internal/run-root-task-fiber.ts +191 -0
- package/src/lib/main-thread/internal/stops-at-first-failure.ts +20 -0
- package/src/lib/main-thread/internal/trace-the-run.ts +107 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/index.ts +7 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/follow-imports-from-entry-files.ts +306 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/load-all-reporting-first-failure.ts +11 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/make-module-graph.ts +48 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/read-configured-loaders.ts +64 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/resolve-module-specifiers.ts +60 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/rewrite-worker-imports.ts +118 -0
- package/src/lib/main-thread/lib/find-code-each-task-depends-on/internal/worker-import-errors.ts +19 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/index.ts +7 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/internal/handle-worker-events.ts +348 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/internal/make-task-runs.ts +207 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/lib/run-requested-task-once/index.ts +1 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/lib/run-requested-task-once/internal/await-within-counted-limit.ts +29 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/lib/run-requested-task-once/internal/execute-task.ts +272 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/lib/run-requested-task-once/internal/make-task-setup-clock.ts +129 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/lib/run-requested-task-once/internal/run-requested-tasks.ts +135 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/shared/define-task-run-state.ts +288 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/shared/make-stopwatch.ts +39 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/shared/share-standard-input-with-root-task.ts +36 -0
- package/src/lib/main-thread/lib/run-tasks-on-workers/shared/stop-task.ts +166 -0
- package/src/lib/main-thread/lib/scan-module-source/index.ts +1 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/find-lexical-bindings.ts +154 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/find-task-declarations.ts +205 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/parse-module-text.ts +34 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/read-literal-string.ts +15 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/read-module-loads.ts +316 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/scan-module-text.ts +70 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/unwrap-type-assertions.ts +10 -0
- package/src/lib/main-thread/lib/scan-module-source/internal/visit-non-reference-identifiers.ts +21 -0
- package/src/lib/main-thread/shared/fail-run.ts +36 -0
- package/src/lib/main-thread/shared/find-failure-reason.ts +43 -0
- package/src/lib/main-thread/shared/find-package-directories.ts +34 -0
- package/src/lib/main-thread/shared/find-tasks-reachable-from-root-task-file.ts +246 -0
- package/src/lib/main-thread/shared/list-directory-paths-up-to-root.ts +13 -0
- package/src/lib/main-thread/shared/main-thread-errors.ts +373 -0
- package/src/lib/main-thread/shared/package-json-errors.ts +93 -0
- package/src/lib/main-thread/shared/provide-discovered-tasks.ts +26 -0
- package/src/lib/main-thread/shared/provide-process-groups.ts +63 -0
- package/src/lib/main-thread/shared/provide-run-root-task-config.ts +66 -0
- package/src/lib/main-thread/shared/provide-stop-state.ts +150 -0
- package/src/lib/main-thread/shared/provide-worker-pool.ts +607 -0
- package/src/lib/main-thread/shared/read-bare-package-name.ts +3 -0
- package/src/lib/main-thread/shared/read-package-json.ts +149 -0
- package/src/lib/main-thread/shared/report-task-failure.ts +31 -0
- package/src/lib/preload-rewritten-imports-into-each-worker/index.ts +5 -0
- package/src/lib/preload-rewritten-imports-into-each-worker/internal/load-rewritten-imports.ts +34 -0
- package/src/lib/supervise-the-run/index.ts +15 -0
- package/src/lib/supervise-the-run/internal/adopt-orphans-on-linux.ts +73 -0
- package/src/lib/supervise-the-run/internal/check-root-task-file.ts +8 -0
- package/src/lib/supervise-the-run/internal/report-ready.ts +12 -0
- package/src/lib/supervise-the-run/internal/share-process-groups.ts +25 -0
- package/src/lib/supervise-the-run/internal/start-watching-the-supervisor.ts +6 -0
- package/src/lib/supervise-the-run/internal/supervise-run.ts +155 -0
- package/src/lib/supervise-the-run/internal/talk-to-the-supervisor.ts +53 -0
- package/src/lib/supervise-the-run/internal/watch-the-supervisor.ts +61 -0
- package/src/lib/task/index.ts +5 -0
- package/src/lib/task/internal/make-tasks.ts +82 -0
- package/src/lib/task/internal/run-command.ts +194 -0
- package/src/lib/task/internal/run-root-task.ts +263 -0
- package/src/lib/task/internal/run-task-lists.ts +51 -0
- package/src/lib/task/internal/trust-output-mode-names.ts +18 -0
- package/src/lib/task/internal/trust-task-results.ts +35 -0
- package/src/lib/task/internal/use-task-services.ts +4 -0
- package/src/lib/worker-thread/index.ts +3 -0
- package/src/lib/worker-thread/internal/answer-main-thread-messages.ts +141 -0
- package/src/lib/worker-thread/internal/describe-task-body-result.ts +91 -0
- package/src/lib/worker-thread/internal/name-config-key-not-set.ts +57 -0
- package/src/lib/worker-thread/internal/run-task-body.ts +117 -0
- package/src/lib/worker-thread/internal/serve-on-the-parent-port.ts +63 -0
- package/src/lib/worker-thread/internal/start-worker-thread.ts +41 -0
- package/src/lib/worker-thread/lib/provide-task-services/index.ts +1 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/make-task-logger.ts +34 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/provide-task-services.ts +86 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/read-standard-input-from-main-thread.ts +58 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/resolve-paths-from-package-directory.ts +61 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/run-commands-in-package-directory.ts +24 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/spawn-commands-with-bun.ts +545 -0
- package/src/lib/worker-thread/lib/provide-task-services/internal/spawn-reported-process.ts +151 -0
- package/src/lib/worker-thread/shared/await-main-thread-answers.ts +76 -0
- package/src/lib/worker-thread/shared/decode-task-result-json.ts +114 -0
- package/src/lib/worker-thread/shared/define-task-body-record.ts +11 -0
- package/src/lib/worker-thread/shared/describe-issue-input.ts +52 -0
- package/src/lib/worker-thread/shared/plain-object.ts +8 -0
- package/src/lib/worker-thread/shared/provide-worker-state.ts +160 -0
- package/src/lib/worker-thread/shared/worker-thread-errors.ts +41 -0
- package/src/shared/attribute-reported-failures.ts +25 -0
- package/src/shared/claim-processes-to-report.ts +22 -0
- package/src/shared/command-errors.ts +44 -0
- package/src/shared/complete-discarded-calls-once-sent.ts +12 -0
- package/src/shared/cut-to-graphemes.ts +12 -0
- package/src/shared/environment-config-errors.ts +74 -0
- package/src/shared/error-fields.ts +13 -0
- package/src/shared/find-bun-loader-for-script.ts +32 -0
- package/src/shared/find-node-modules-package-directory.ts +35 -0
- package/src/shared/find-user-locations-in-stack-traces.ts +64 -0
- package/src/shared/format-error-lines.ts +53 -0
- package/src/shared/format-task-lines.ts +21 -0
- package/src/shared/hold-task-logs.ts +24 -0
- package/src/shared/invariant-errors.ts +28 -0
- package/src/shared/mark-task-worker-thread-contexts.ts +29 -0
- package/src/shared/module-graph-errors.ts +49 -0
- package/src/shared/name-config-key.ts +42 -0
- package/src/shared/names-from-package-json.ts +7 -0
- package/src/shared/print-to-standard-error.ts +48 -0
- package/src/shared/process-errors.ts +191 -0
- package/src/shared/read-environment-config.ts +239 -0
- package/src/shared/record-tasks-made.ts +10 -0
- package/src/shared/report-cause.ts +140 -0
- package/src/shared/report-errors.ts +121 -0
- package/src/shared/resolve-task-options.ts +20 -0
- package/src/shared/rpc.ts +161 -0
- package/src/shared/run-in-child-fiber-and-join.ts +16 -0
- package/src/shared/run-marker.ts +7 -0
- package/src/shared/save-standard-stream-flags.ts +57 -0
- package/src/shared/select-cause-reasons.ts +14 -0
- package/src/shared/signal-run-called-twice.ts +11 -0
- package/src/shared/standard-input-streams.ts +41 -0
- package/src/shared/stop-signals.ts +41 -0
- package/src/shared/task-errors.ts +224 -0
- package/src/shared/task-package.ts +5 -0
- package/src/shared/task-results.ts +55 -0
- package/src/shared/task-services.ts +30 -0
- package/src/shared/write-trace-file.ts +112 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { Context, Deferred, Effect, Exit, Layer } from "effect";
|
|
2
|
+
import type { Cause } from "effect";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
FAILURE_REASON_NOT_RECORDED_LINE,
|
|
6
|
+
formatFailureReasonLine,
|
|
7
|
+
} from "../../../shared/format-error-lines.ts";
|
|
8
|
+
import { holdTaskLogsDuring, makeTaskLogHold } from "../../../shared/hold-task-logs.ts";
|
|
9
|
+
import type { StandardErrorWriteFailed } from "../../../shared/print-to-standard-error.ts";
|
|
10
|
+
import type { WorkerExited } from "../../../shared/process-errors.ts";
|
|
11
|
+
import type { STOP_REASONS } from "../../../shared/stop-signals.ts";
|
|
12
|
+
import type {
|
|
13
|
+
RunCalledTwice,
|
|
14
|
+
ServedTaskFailed,
|
|
15
|
+
TaskBodyFailed,
|
|
16
|
+
TaskCleanupFailed,
|
|
17
|
+
TaskSetupTimedOut,
|
|
18
|
+
TaskTimedOut,
|
|
19
|
+
} from "../../../shared/task-errors.ts";
|
|
20
|
+
import { TASK_PACKAGE } from "../../../shared/task-package.ts";
|
|
21
|
+
import type {
|
|
22
|
+
AwaitedTaskFailed,
|
|
23
|
+
SettledTasksFailed,
|
|
24
|
+
TaskNotMadeAtTopLevel,
|
|
25
|
+
TaskWaitsOnItself,
|
|
26
|
+
} from "../../errors/index.ts";
|
|
27
|
+
import type { killAllProcessGroups } from "../../kill-leftover-processes/index.ts";
|
|
28
|
+
import { findFailureReason } from "./find-failure-reason.ts";
|
|
29
|
+
import { FailureReasonNotFormatted, StopRequested } from "./main-thread-errors.ts";
|
|
30
|
+
import type {
|
|
31
|
+
BrokenTasksFound,
|
|
32
|
+
ServingTaskRequestsItself,
|
|
33
|
+
TaskCleanupFrozeWorker,
|
|
34
|
+
TaskCleanupNotStarted,
|
|
35
|
+
TaskCleanupTimedOut,
|
|
36
|
+
} from "./main-thread-errors.ts";
|
|
37
|
+
|
|
38
|
+
const makeShutdown = Effect.gen(function* () {
|
|
39
|
+
const shutdownStartedDeferred = yield* Deferred.make<void>();
|
|
40
|
+
const firstFailureDeferred = yield* Deferred.make<
|
|
41
|
+
| AwaitedTaskFailed
|
|
42
|
+
| BrokenTasksFound
|
|
43
|
+
| Effect.Error<ReturnType<typeof killAllProcessGroups>>
|
|
44
|
+
| RunCalledTwice
|
|
45
|
+
| ServedTaskFailed
|
|
46
|
+
| ServingTaskRequestsItself
|
|
47
|
+
| SettledTasksFailed
|
|
48
|
+
| StandardErrorWriteFailed
|
|
49
|
+
| StopRequested
|
|
50
|
+
| TaskBodyFailed
|
|
51
|
+
| TaskCleanupFailed
|
|
52
|
+
| TaskCleanupFrozeWorker
|
|
53
|
+
| TaskCleanupNotStarted
|
|
54
|
+
| TaskCleanupTimedOut
|
|
55
|
+
| TaskNotMadeAtTopLevel
|
|
56
|
+
| TaskSetupTimedOut
|
|
57
|
+
| TaskTimedOut
|
|
58
|
+
| TaskWaitsOnItself
|
|
59
|
+
| WorkerExited
|
|
60
|
+
>();
|
|
61
|
+
const awaitFailure = Deferred.await(firstFailureDeferred);
|
|
62
|
+
|
|
63
|
+
const forcedStopDeferred = yield* Deferred.make<Effect.Success<typeof awaitFailure>>();
|
|
64
|
+
const printedFailures = new Set<Effect.Success<typeof awaitFailure>>();
|
|
65
|
+
const failureCauseByTaskName = new Map<
|
|
66
|
+
string,
|
|
67
|
+
Cause.Cause<Effect.Success<typeof awaitFailure>>
|
|
68
|
+
>();
|
|
69
|
+
const taskLogHold = makeTaskLogHold();
|
|
70
|
+
return {
|
|
71
|
+
taskLogHold,
|
|
72
|
+
holdTaskLogsDuring: holdTaskLogsDuring(taskLogHold),
|
|
73
|
+
recordTaskFailureCause: (
|
|
74
|
+
taskName: string,
|
|
75
|
+
cause: Cause.Cause<Effect.Success<typeof awaitFailure>>,
|
|
76
|
+
) =>
|
|
77
|
+
Effect.sync(() => {
|
|
78
|
+
if (!failureCauseByTaskName.has(taskName)) {
|
|
79
|
+
failureCauseByTaskName.set(taskName, cause);
|
|
80
|
+
}
|
|
81
|
+
}),
|
|
82
|
+
formatRunFailureReasonLine: (runEndingCause: Cause.Cause<unknown>) =>
|
|
83
|
+
Effect.try({
|
|
84
|
+
try: () => {
|
|
85
|
+
const reason = findFailureReason(runEndingCause, failureCauseByTaskName);
|
|
86
|
+
return reason === null
|
|
87
|
+
? FAILURE_REASON_NOT_RECORDED_LINE
|
|
88
|
+
: formatFailureReasonLine(reason);
|
|
89
|
+
},
|
|
90
|
+
catch: (cause) => new FailureReasonNotFormatted({ cause }),
|
|
91
|
+
}).pipe(
|
|
92
|
+
Effect.catchTag("FailureReasonNotFormatted", (failure) =>
|
|
93
|
+
Effect.succeed(`${failure._tag}: ${failure.message}`),
|
|
94
|
+
),
|
|
95
|
+
),
|
|
96
|
+
recordFirstFailure: (failure: Effect.Success<typeof awaitFailure>) =>
|
|
97
|
+
Deferred.succeed(firstFailureDeferred, failure),
|
|
98
|
+
recordPrintedFailure: (failure: Effect.Success<typeof awaitFailure>) =>
|
|
99
|
+
Effect.sync(() => {
|
|
100
|
+
printedFailures.add(failure);
|
|
101
|
+
}),
|
|
102
|
+
wasPrinted: (failure: Effect.Success<typeof awaitFailure>) =>
|
|
103
|
+
Effect.sync(() => printedFailures.has(failure)),
|
|
104
|
+
requestStop: (signal: (typeof STOP_REASONS)[number]) =>
|
|
105
|
+
Effect.sync(() => {
|
|
106
|
+
const stopRequested = new StopRequested({ signal });
|
|
107
|
+
const stopBecameFirstFailure =
|
|
108
|
+
!Deferred.isDoneUnsafe(shutdownStartedDeferred) &&
|
|
109
|
+
Deferred.doneUnsafe(firstFailureDeferred, Exit.succeed(stopRequested));
|
|
110
|
+
if (stopBecameFirstFailure) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
Deferred.doneUnsafe(forcedStopDeferred, Exit.succeed(stopRequested));
|
|
114
|
+
return false;
|
|
115
|
+
}),
|
|
116
|
+
forceStop: (failure: Effect.Success<typeof awaitFailure>) =>
|
|
117
|
+
Effect.sync(() => {
|
|
118
|
+
Deferred.doneUnsafe(firstFailureDeferred, Exit.succeed(failure));
|
|
119
|
+
Deferred.doneUnsafe(forcedStopDeferred, Exit.succeed(failure));
|
|
120
|
+
}),
|
|
121
|
+
begin: Effect.sync(() => {
|
|
122
|
+
Deferred.doneUnsafe(shutdownStartedDeferred, Exit.void);
|
|
123
|
+
return Deferred.isDoneUnsafe(firstFailureDeferred);
|
|
124
|
+
}),
|
|
125
|
+
isStopping: Effect.sync(
|
|
126
|
+
() =>
|
|
127
|
+
Deferred.isDoneUnsafe(shutdownStartedDeferred) ||
|
|
128
|
+
Deferred.isDoneUnsafe(firstFailureDeferred),
|
|
129
|
+
),
|
|
130
|
+
hasFailed: Deferred.isDone(firstFailureDeferred),
|
|
131
|
+
awaitFailure,
|
|
132
|
+
awaitForcedStop: Deferred.await(forcedStopDeferred),
|
|
133
|
+
isForced: Deferred.isDone(forcedStopDeferred),
|
|
134
|
+
outcome: Effect.gen(function* () {
|
|
135
|
+
if (Deferred.isDoneUnsafe(forcedStopDeferred)) {
|
|
136
|
+
return yield* Deferred.await(forcedStopDeferred);
|
|
137
|
+
}
|
|
138
|
+
if (Deferred.isDoneUnsafe(firstFailureDeferred)) {
|
|
139
|
+
return yield* Deferred.await(firstFailureDeferred);
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}),
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
export class StopState extends Context.Service<StopState, Effect.Success<typeof makeShutdown>>()(
|
|
147
|
+
`${TASK_PACKAGE.name}/StopState`,
|
|
148
|
+
) {}
|
|
149
|
+
|
|
150
|
+
export const StopStateLive = Layer.effect(StopState, makeShutdown);
|