@sshkeda/task 0.0.0-stage → 1.0.0
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,112 @@
|
|
|
1
|
+
import { Context, Duration, Effect, Exit, FileSystem, Option, Path, Ref, Tracer } from "effect";
|
|
2
|
+
import type { PlatformError } from "effect";
|
|
3
|
+
import { HttpBody, HttpClient, HttpClientResponse } from "effect/http";
|
|
4
|
+
import { OtlpLogger, OtlpTracer } from "effect/observability";
|
|
5
|
+
|
|
6
|
+
import { InternalInvariantBroken } from "./invariant-errors.ts";
|
|
7
|
+
import { TASK_STATE_DIRECTORY_NAME, TASK_TRACE_LABEL_PREFIX } from "./names-from-package-json.ts";
|
|
8
|
+
import { causeWithPrintableErrors } from "./report-cause.ts";
|
|
9
|
+
import { TASK_PACKAGE } from "./task-package.ts";
|
|
10
|
+
|
|
11
|
+
const NEWLINE = new TextEncoder().encode("\n");
|
|
12
|
+
|
|
13
|
+
export class TraceFile extends Context.Service<
|
|
14
|
+
TraceFile,
|
|
15
|
+
Effect.Success<ReturnType<typeof makeTraceFile>>
|
|
16
|
+
>()(`${TASK_PACKAGE.name}/TraceFile`) {}
|
|
17
|
+
|
|
18
|
+
export const makeTraceFile = Effect.fn("makeTraceFile")(function* (input: {
|
|
19
|
+
readonly traceFilePath: string;
|
|
20
|
+
readonly thread: "main-thread" | "worker";
|
|
21
|
+
readonly maxBatchSize?: number;
|
|
22
|
+
readonly onIncomplete?: (reason: string) => Effect.Effect<void>;
|
|
23
|
+
}) {
|
|
24
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
25
|
+
const path = yield* Path.Path;
|
|
26
|
+
const whyIncomplete = yield* Ref.make<string | null>(null);
|
|
27
|
+
const markIncomplete = (reason: string) =>
|
|
28
|
+
Ref.modify(whyIncomplete, (firstReason) =>
|
|
29
|
+
firstReason === null ? [true, reason] : [false, firstReason],
|
|
30
|
+
).pipe(
|
|
31
|
+
Effect.andThen((isFirstReason) =>
|
|
32
|
+
isFirstReason ? (input.onIncomplete?.(reason) ?? Effect.void) : Effect.void,
|
|
33
|
+
),
|
|
34
|
+
);
|
|
35
|
+
yield* fileSystem
|
|
36
|
+
.makeDirectory(path.dirname(input.traceFilePath), { recursive: true })
|
|
37
|
+
.pipe(
|
|
38
|
+
Effect.catchTag("PlatformError", (error) =>
|
|
39
|
+
markIncomplete(`${path.dirname(input.traceFilePath)} could not be made (${error.message})`),
|
|
40
|
+
),
|
|
41
|
+
);
|
|
42
|
+
const markUnwritable = (error: PlatformError.PlatformError) =>
|
|
43
|
+
markIncomplete(`${input.traceFilePath} could not be written (${error.message})`);
|
|
44
|
+
const traceFileHandle = yield* fileSystem
|
|
45
|
+
.open(input.traceFilePath, { flag: "a", mode: 0o600 })
|
|
46
|
+
.pipe(
|
|
47
|
+
Effect.asSome,
|
|
48
|
+
Effect.catchTag("PlatformError", (error) =>
|
|
49
|
+
markUnwritable(error).pipe(Effect.as(Option.none())),
|
|
50
|
+
),
|
|
51
|
+
);
|
|
52
|
+
const appendLine = (line: Uint8Array) =>
|
|
53
|
+
Option.match(traceFileHandle, {
|
|
54
|
+
onNone: () => Effect.void,
|
|
55
|
+
onSome: (handle) => {
|
|
56
|
+
const lineWithNewline = new Uint8Array(Bun.concatArrayBuffers([line, NEWLINE]));
|
|
57
|
+
return handle
|
|
58
|
+
.writeAll(lineWithNewline)
|
|
59
|
+
.pipe(Effect.catchTag("PlatformError", (error) => markUnwritable(error)));
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const otlpOptions = {
|
|
63
|
+
url: `${TASK_STATE_DIRECTORY_NAME.slice(1)}:trace-file`,
|
|
64
|
+
resource: {
|
|
65
|
+
serviceName: TASK_PACKAGE.name,
|
|
66
|
+
serviceVersion: TASK_PACKAGE.version,
|
|
67
|
+
attributes: { [`${TASK_TRACE_LABEL_PREFIX}.thread`]: input.thread },
|
|
68
|
+
},
|
|
69
|
+
maxBatchSize: input.maxBatchSize,
|
|
70
|
+
shutdownTimeout: Duration.infinity,
|
|
71
|
+
};
|
|
72
|
+
const exporters = yield* Effect.all({
|
|
73
|
+
tracer: OtlpTracer.make(otlpOptions),
|
|
74
|
+
logger: OtlpLogger.make(otlpOptions),
|
|
75
|
+
}).pipe(
|
|
76
|
+
Effect.provideService(
|
|
77
|
+
HttpClient.HttpClient,
|
|
78
|
+
HttpClient.make((request) =>
|
|
79
|
+
request.body instanceof HttpBody.Uint8Array
|
|
80
|
+
? appendLine(request.body.body).pipe(
|
|
81
|
+
Effect.as(HttpClientResponse.fromWeb(request, new Response(null, { status: 204 }))),
|
|
82
|
+
)
|
|
83
|
+
: Effect.die(
|
|
84
|
+
new InternalInvariantBroken({
|
|
85
|
+
area: "trace export",
|
|
86
|
+
invariant: `the trace file cannot hold a ${request.body._tag} body`,
|
|
87
|
+
}),
|
|
88
|
+
),
|
|
89
|
+
),
|
|
90
|
+
),
|
|
91
|
+
);
|
|
92
|
+
return {
|
|
93
|
+
filePath: input.traceFilePath,
|
|
94
|
+
tracer: Tracer.make({
|
|
95
|
+
span: (options) => {
|
|
96
|
+
const span = exporters.tracer.span(options);
|
|
97
|
+
const end = span.end.bind(span);
|
|
98
|
+
span.end = (endTime, exit) => {
|
|
99
|
+
end(
|
|
100
|
+
endTime,
|
|
101
|
+
Exit.isFailure(exit) ? Exit.failCause(causeWithPrintableErrors(exit.cause)) : exit,
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
return span;
|
|
105
|
+
},
|
|
106
|
+
context: exporters.tracer.context,
|
|
107
|
+
}),
|
|
108
|
+
logger: exporters.logger,
|
|
109
|
+
whyIncomplete: Ref.get(whyIncomplete),
|
|
110
|
+
markIncomplete,
|
|
111
|
+
};
|
|
112
|
+
});
|