@aicalas/loopy 0.1.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 +101 -0
- package/dist/adapters.d.ts +111 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +27 -0
- package/dist/adapters.js.map +1 -0
- package/dist/attention/github.d.ts +57 -0
- package/dist/attention/github.d.ts.map +1 -0
- package/dist/attention/github.js +162 -0
- package/dist/attention/github.js.map +1 -0
- package/dist/authoring/attention-config.d.ts +16 -0
- package/dist/authoring/attention-config.d.ts.map +1 -0
- package/dist/authoring/attention-config.js +19 -0
- package/dist/authoring/attention-config.js.map +1 -0
- package/dist/authoring/channel-config.d.ts +16 -0
- package/dist/authoring/channel-config.d.ts.map +1 -0
- package/dist/authoring/channel-config.js +16 -0
- package/dist/authoring/channel-config.js.map +1 -0
- package/dist/authoring/define.d.ts +13 -0
- package/dist/authoring/define.d.ts.map +1 -0
- package/dist/authoring/define.js +13 -0
- package/dist/authoring/define.js.map +1 -0
- package/dist/authoring/effect-config.d.ts +16 -0
- package/dist/authoring/effect-config.d.ts.map +1 -0
- package/dist/authoring/effect-config.js +17 -0
- package/dist/authoring/effect-config.js.map +1 -0
- package/dist/authoring/harness-config.d.ts +30 -0
- package/dist/authoring/harness-config.d.ts.map +1 -0
- package/dist/authoring/harness-config.js +36 -0
- package/dist/authoring/harness-config.js.map +1 -0
- package/dist/authoring/index.d.ts +10 -0
- package/dist/authoring/index.d.ts.map +1 -0
- package/dist/authoring/index.js +9 -0
- package/dist/authoring/index.js.map +1 -0
- package/dist/authoring/schema.d.ts +9 -0
- package/dist/authoring/schema.d.ts.map +1 -0
- package/dist/authoring/schema.js +28 -0
- package/dist/authoring/schema.js.map +1 -0
- package/dist/authoring/types.d.ts +115 -0
- package/dist/authoring/types.d.ts.map +1 -0
- package/dist/authoring/types.js +2 -0
- package/dist/authoring/types.js.map +1 -0
- package/dist/authoring/watcher-config.d.ts +33 -0
- package/dist/authoring/watcher-config.d.ts.map +1 -0
- package/dist/authoring/watcher-config.js +61 -0
- package/dist/authoring/watcher-config.js.map +1 -0
- package/dist/build/discover.d.ts +34 -0
- package/dist/build/discover.d.ts.map +1 -0
- package/dist/build/discover.js +165 -0
- package/dist/build/discover.js.map +1 -0
- package/dist/build/identity.d.ts +9 -0
- package/dist/build/identity.d.ts.map +1 -0
- package/dist/build/identity.js +0 -0
- package/dist/build/identity.js.map +1 -0
- package/dist/channels/github.d.ts +14 -0
- package/dist/channels/github.d.ts.map +1 -0
- package/dist/channels/github.js +118 -0
- package/dist/channels/github.js.map +1 -0
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +2 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/cli-help.d.ts +23 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +186 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.d.ts +37 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +385 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +71 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +426 -0
- package/dist/config.js.map +1 -0
- package/dist/core/calls.d.ts +67 -0
- package/dist/core/calls.d.ts.map +1 -0
- package/dist/core/calls.js +109 -0
- package/dist/core/calls.js.map +1 -0
- package/dist/core/identifiers.d.ts +24 -0
- package/dist/core/identifiers.d.ts.map +1 -0
- package/dist/core/identifiers.js +129 -0
- package/dist/core/identifiers.js.map +1 -0
- package/dist/core/prompt.d.ts +5 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +47 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/reconcile.d.ts +27 -0
- package/dist/core/reconcile.d.ts.map +1 -0
- package/dist/core/reconcile.js +36 -0
- package/dist/core/reconcile.js.map +1 -0
- package/dist/core/wire.d.ts +332 -0
- package/dist/core/wire.d.ts.map +1 -0
- package/dist/core/wire.js +543 -0
- package/dist/core/wire.js.map +1 -0
- package/dist/emitters/github.d.ts +15 -0
- package/dist/emitters/github.d.ts.map +1 -0
- package/dist/emitters/github.js +43 -0
- package/dist/emitters/github.js.map +1 -0
- package/dist/emitters/index.d.ts +2 -0
- package/dist/emitters/index.d.ts.map +1 -0
- package/dist/emitters/index.js +2 -0
- package/dist/emitters/index.js.map +1 -0
- package/dist/git.d.ts +17 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +122 -0
- package/dist/git.js.map +1 -0
- package/dist/github/client.d.ts +53 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +169 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/trigger.d.ts +12 -0
- package/dist/github/trigger.d.ts.map +1 -0
- package/dist/github/trigger.js +21 -0
- package/dist/github/trigger.js.map +1 -0
- package/dist/github/writes.d.ts +4 -0
- package/dist/github/writes.d.ts.map +1 -0
- package/dist/github/writes.js +21 -0
- package/dist/github/writes.js.map +1 -0
- package/dist/harnesses/base.d.ts +41 -0
- package/dist/harnesses/base.d.ts.map +1 -0
- package/dist/harnesses/base.js +182 -0
- package/dist/harnesses/base.js.map +1 -0
- package/dist/harnesses/claude-executable.d.ts +42 -0
- package/dist/harnesses/claude-executable.d.ts.map +1 -0
- package/dist/harnesses/claude-executable.js +138 -0
- package/dist/harnesses/claude-executable.js.map +1 -0
- package/dist/harnesses/claude.d.ts +35 -0
- package/dist/harnesses/claude.d.ts.map +1 -0
- package/dist/harnesses/claude.js +160 -0
- package/dist/harnesses/claude.js.map +1 -0
- package/dist/harnesses/codex.d.ts +40 -0
- package/dist/harnesses/codex.d.ts.map +1 -0
- package/dist/harnesses/codex.js +118 -0
- package/dist/harnesses/codex.js.map +1 -0
- package/dist/harnesses/index.d.ts +2 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +2 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/opencode.d.ts +33 -0
- package/dist/harnesses/opencode.d.ts.map +1 -0
- package/dist/harnesses/opencode.js +203 -0
- package/dist/harnesses/opencode.js.map +1 -0
- package/dist/identifiers.d.ts +26 -0
- package/dist/identifiers.d.ts.map +1 -0
- package/dist/identifiers.js +62 -0
- package/dist/identifiers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +10 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +44 -0
- package/dist/log.js.map +1 -0
- package/dist/settings.d.ts +43 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +128 -0
- package/dist/settings.js.map +1 -0
- package/dist/temporal/activities.d.ts +57 -0
- package/dist/temporal/activities.d.ts.map +1 -0
- package/dist/temporal/activities.js +366 -0
- package/dist/temporal/activities.js.map +1 -0
- package/dist/temporal/answers.d.ts +48 -0
- package/dist/temporal/answers.d.ts.map +1 -0
- package/dist/temporal/answers.js +78 -0
- package/dist/temporal/answers.js.map +1 -0
- package/dist/temporal/client.d.ts +13 -0
- package/dist/temporal/client.d.ts.map +1 -0
- package/dist/temporal/client.js +20 -0
- package/dist/temporal/client.js.map +1 -0
- package/dist/temporal/contracts.d.ts +19 -0
- package/dist/temporal/contracts.d.ts.map +1 -0
- package/dist/temporal/contracts.js +22 -0
- package/dist/temporal/contracts.js.map +1 -0
- package/dist/temporal/drain.d.ts +19 -0
- package/dist/temporal/drain.d.ts.map +1 -0
- package/dist/temporal/drain.js +109 -0
- package/dist/temporal/drain.js.map +1 -0
- package/dist/temporal/executions.d.ts +18 -0
- package/dist/temporal/executions.d.ts.map +1 -0
- package/dist/temporal/executions.js +15 -0
- package/dist/temporal/executions.js.map +1 -0
- package/dist/temporal/handle.d.ts +39 -0
- package/dist/temporal/handle.d.ts.map +1 -0
- package/dist/temporal/handle.js +95 -0
- package/dist/temporal/handle.js.map +1 -0
- package/dist/temporal/history.d.ts +75 -0
- package/dist/temporal/history.d.ts.map +1 -0
- package/dist/temporal/history.js +310 -0
- package/dist/temporal/history.js.map +1 -0
- package/dist/temporal/observe.d.ts +85 -0
- package/dist/temporal/observe.d.ts.map +1 -0
- package/dist/temporal/observe.js +110 -0
- package/dist/temporal/observe.js.map +1 -0
- package/dist/temporal/schedules.d.ts +26 -0
- package/dist/temporal/schedules.d.ts.map +1 -0
- package/dist/temporal/schedules.js +200 -0
- package/dist/temporal/schedules.js.map +1 -0
- package/dist/temporal/status.d.ts +63 -0
- package/dist/temporal/status.d.ts.map +1 -0
- package/dist/temporal/status.js +153 -0
- package/dist/temporal/status.js.map +1 -0
- package/dist/temporal/stuck.d.ts +58 -0
- package/dist/temporal/stuck.d.ts.map +1 -0
- package/dist/temporal/stuck.js +53 -0
- package/dist/temporal/stuck.js.map +1 -0
- package/dist/temporal/supervisor.d.ts +11 -0
- package/dist/temporal/supervisor.d.ts.map +1 -0
- package/dist/temporal/supervisor.js +506 -0
- package/dist/temporal/supervisor.js.map +1 -0
- package/dist/temporal/worker.d.ts +21 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +82 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflow-bundle.js +12742 -0
- package/dist/temporal/workflows.d.ts +9 -0
- package/dist/temporal/workflows.d.ts.map +1 -0
- package/dist/temporal/workflows.js +144 -0
- package/dist/temporal/workflows.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/watchers/base.d.ts +4 -0
- package/dist/watchers/base.d.ts.map +1 -0
- package/dist/watchers/base.js +7 -0
- package/dist/watchers/base.js.map +1 -0
- package/dist/watchers/github/client.d.ts +52 -0
- package/dist/watchers/github/client.d.ts.map +1 -0
- package/dist/watchers/github/client.js +165 -0
- package/dist/watchers/github/client.js.map +1 -0
- package/dist/watchers/github/index.d.ts +19 -0
- package/dist/watchers/github/index.d.ts.map +1 -0
- package/dist/watchers/github/index.js +83 -0
- package/dist/watchers/github/index.js.map +1 -0
- package/dist/watchers/index.d.ts +2 -0
- package/dist/watchers/index.d.ts.map +1 -0
- package/dist/watchers/index.js +2 -0
- package/dist/watchers/index.js.map +1 -0
- package/dist/worker-lock.d.ts +11 -0
- package/dist/worker-lock.d.ts.map +1 -0
- package/dist/worker-lock.js +53 -0
- package/dist/worker-lock.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type PollResult } from "../core/wire.js";
|
|
2
|
+
/**
|
|
3
|
+
* One polling tick. Instance children inherit this Workflow Execution's Task Queue, which keeps a
|
|
4
|
+
* run on the control queue without the poll having to name it. Pinning a run to the build it
|
|
5
|
+
* started on is the drain's job, not the queue's - the queue name is fixed configuration, so it is
|
|
6
|
+
* the same string across restarts.
|
|
7
|
+
*/
|
|
8
|
+
export declare function PollWorkflow(input: unknown): Promise<PollResult>;
|
|
9
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/temporal/workflows.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,UAAU,EAKhB,MAAM,iBAAiB,CAAC;AAiBzB;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA4EtE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { ActivityFailure, ApplicationFailure, isCancellation, ParentClosePolicy, proxyActivities, startChild, } from "@temporalio/workflow";
|
|
2
|
+
import { parseObserveInstancesResult, parsePollWorkflowInput, parseTriggerCandidates, } from "../core/wire.js";
|
|
3
|
+
const CONTROL_ACTIVITY_TIMEOUT_MS = 30_000;
|
|
4
|
+
const REPEATABLE_RETRY_POLICY = {
|
|
5
|
+
maximumAttempts: 3,
|
|
6
|
+
initialInterval: 1_000,
|
|
7
|
+
backoffCoefficient: 2,
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* One polling tick. Instance children inherit this Workflow Execution's Task Queue, which keeps a
|
|
11
|
+
* run on the control queue without the poll having to name it. Pinning a run to the build it
|
|
12
|
+
* started on is the drain's job, not the queue's - the queue name is fixed configuration, so it is
|
|
13
|
+
* the same string across restarts.
|
|
14
|
+
*/
|
|
15
|
+
export async function PollWorkflow(input) {
|
|
16
|
+
const request = parsePollWorkflowInput(input);
|
|
17
|
+
// Started before intake and awaited on every exit: a stuck instance's only reporter is this
|
|
18
|
+
// observer, so a broken watcher must not silence it.
|
|
19
|
+
const observed = observeInstances(request);
|
|
20
|
+
if (request.watcher === undefined) {
|
|
21
|
+
return { status: "completed", started: [], skipped: [], ...(await observed) };
|
|
22
|
+
}
|
|
23
|
+
const activities = proxyActivities({
|
|
24
|
+
activityId: "watcher",
|
|
25
|
+
startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
|
|
26
|
+
retry: REPEATABLE_RETRY_POLICY,
|
|
27
|
+
});
|
|
28
|
+
let watcherResult;
|
|
29
|
+
try {
|
|
30
|
+
watcherResult = await activities.run_watcher({
|
|
31
|
+
repository: request.repository,
|
|
32
|
+
watcher: request.watcher,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (!(error instanceof ActivityFailure))
|
|
37
|
+
throw error;
|
|
38
|
+
return {
|
|
39
|
+
status: "failed",
|
|
40
|
+
started: [],
|
|
41
|
+
skipped: [],
|
|
42
|
+
...(await observed),
|
|
43
|
+
reason: `watcher-activity-failed:${failureType(error.cause)}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
let candidates;
|
|
47
|
+
try {
|
|
48
|
+
candidates = parseTriggerCandidates(watcherResult);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return {
|
|
52
|
+
status: "failed",
|
|
53
|
+
started: [],
|
|
54
|
+
skipped: [],
|
|
55
|
+
...(await observed),
|
|
56
|
+
reason: `watcher-result-invalid:${errorMessage(error)}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const started = [];
|
|
60
|
+
const skipped = [];
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
for (const trigger of candidates) {
|
|
63
|
+
const workflowId = `${request.instanceIdPrefix}${request.workflow}:${trigger.digest}`;
|
|
64
|
+
if (seen.has(workflowId))
|
|
65
|
+
continue;
|
|
66
|
+
seen.add(workflowId);
|
|
67
|
+
const instanceInput = {
|
|
68
|
+
workflow: request.workflow,
|
|
69
|
+
repository: request.repository,
|
|
70
|
+
defaultBranch: request.defaultBranch,
|
|
71
|
+
trigger,
|
|
72
|
+
agentTaskQueue: request.agentTaskQueue,
|
|
73
|
+
...(request.attention === undefined ? {} : { attention: request.attention }),
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
await startChild(request.workflow, {
|
|
77
|
+
args: [instanceInput],
|
|
78
|
+
workflowId,
|
|
79
|
+
workflowIdReusePolicy: "ALLOW_DUPLICATE",
|
|
80
|
+
parentClosePolicy: ParentClosePolicy.ABANDON,
|
|
81
|
+
});
|
|
82
|
+
started.push(workflowId);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (isOpenWorkflowConflict(error))
|
|
86
|
+
skipped.push(workflowId);
|
|
87
|
+
else
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
status: "completed",
|
|
93
|
+
started,
|
|
94
|
+
skipped,
|
|
95
|
+
...(await observed),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The control-side observer: one scan reports `stuck` instances - whose own code fails every
|
|
100
|
+
* Workflow Task and so cannot reach the attention port - and collects ask replies for instances
|
|
101
|
+
* parked in `awaiting_answer`. Best-effort - both conditions are level-triggered and the next tick
|
|
102
|
+
* re-observes them, so a failed scan is swallowed rather than failing the poll.
|
|
103
|
+
*/
|
|
104
|
+
async function observeInstances(request) {
|
|
105
|
+
const activities = proxyActivities({
|
|
106
|
+
activityId: "observe-instances",
|
|
107
|
+
startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
|
|
108
|
+
retry: REPEATABLE_RETRY_POLICY,
|
|
109
|
+
});
|
|
110
|
+
try {
|
|
111
|
+
const result = await activities.observe_instances({
|
|
112
|
+
repository: request.repository,
|
|
113
|
+
workflow: request.workflow,
|
|
114
|
+
});
|
|
115
|
+
return parseObserveInstancesResult(result);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (isCancellation(error))
|
|
119
|
+
throw error;
|
|
120
|
+
if (!(error instanceof ActivityFailure))
|
|
121
|
+
throw error;
|
|
122
|
+
return { stuck: [], answered: [] };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function failureType(cause) {
|
|
126
|
+
return cause instanceof ApplicationFailure
|
|
127
|
+
? cause.type && cause.type !== "Error"
|
|
128
|
+
? cause.type
|
|
129
|
+
: "ApplicationFailure"
|
|
130
|
+
: (cause?.constructor.name ?? "Error");
|
|
131
|
+
}
|
|
132
|
+
function errorMessage(error) {
|
|
133
|
+
return error instanceof Error ? error.message : String(error);
|
|
134
|
+
}
|
|
135
|
+
function isOpenWorkflowConflict(error) {
|
|
136
|
+
let current = error;
|
|
137
|
+
while (current instanceof Error) {
|
|
138
|
+
if (current.name === "WorkflowExecutionAlreadyStartedError")
|
|
139
|
+
return true;
|
|
140
|
+
current = current.cause;
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/temporal/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/watchers/base.ts"],"names":[],"mappings":"AAAA,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/watchers/base.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Octokit } from "octokit";
|
|
2
|
+
import type { JsonObject, JsonValue } from "../../core/wire.js";
|
|
3
|
+
import { FetchUnavailableError } from "../base.js";
|
|
4
|
+
export interface PullInfo extends JsonObject {
|
|
5
|
+
number: number;
|
|
6
|
+
head_ref: string;
|
|
7
|
+
head_sha: string;
|
|
8
|
+
base_ref: string;
|
|
9
|
+
html_url: string;
|
|
10
|
+
labels: string[];
|
|
11
|
+
title: string;
|
|
12
|
+
body: string;
|
|
13
|
+
}
|
|
14
|
+
export interface IssueInfo extends JsonObject {
|
|
15
|
+
number: number;
|
|
16
|
+
title: string;
|
|
17
|
+
body: string;
|
|
18
|
+
html_url: string;
|
|
19
|
+
labels: string[];
|
|
20
|
+
}
|
|
21
|
+
/** `owner/name`: the shape every GitHub port validates a declared repository against. */
|
|
22
|
+
export declare const REPOSITORY_PATTERN: RegExp;
|
|
23
|
+
export declare class GitHubAuthenticationError extends Error {
|
|
24
|
+
}
|
|
25
|
+
export declare class GitHubUnavailableError extends FetchUnavailableError {
|
|
26
|
+
}
|
|
27
|
+
export declare function authenticationDiagnostic(environment?: NodeJS.ProcessEnv): string | undefined;
|
|
28
|
+
export declare class GitHubClient {
|
|
29
|
+
private readonly octokit;
|
|
30
|
+
private readonly owner;
|
|
31
|
+
private readonly repo;
|
|
32
|
+
readonly repository: string;
|
|
33
|
+
constructor(token: string, repository: string, octokit?: Octokit);
|
|
34
|
+
static fromEnvironment(repository: string, environment?: NodeJS.ProcessEnv): GitHubClient;
|
|
35
|
+
openPullsWithLabel(label: string): Promise<PullInfo[]>;
|
|
36
|
+
openIssuesWithLabel(label: string): Promise<IssueInfo[]>;
|
|
37
|
+
getPull(number: number): Promise<PullInfo>;
|
|
38
|
+
labels(number: number): Promise<string[]>;
|
|
39
|
+
commentBodies(number: number): Promise<string[]>;
|
|
40
|
+
createComment(number: number, body: string): Promise<void>;
|
|
41
|
+
setLabels(number: number, labels: readonly string[]): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Create the repository-level label if it is absent. Issue-label writes require the label to
|
|
44
|
+
* exist in the repository first; creation answers 422 `already_exists` for a label that does,
|
|
45
|
+
* which is this method's success case. The inputs are fixed application constants, so no other
|
|
46
|
+
* validation failure shares that status here.
|
|
47
|
+
*/
|
|
48
|
+
ensureLabel(name: string, color: string, description: string): Promise<void>;
|
|
49
|
+
private request;
|
|
50
|
+
}
|
|
51
|
+
export declare function asJsonValue(value: unknown): JsonValue;
|
|
52
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/watchers/github/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,qBAAa,yBAA0B,SAAQ,KAAK;CAAG;AACvD,qBAAa,sBAAuB,SAAQ,qBAAqB;CAAG;AAEpE,wBAAgB,wBAAwB,CAEtC,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,MAAM,GAAG,SAAS,CAIpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAS/D;IAED,MAAM,CAAC,eAAe,CACpB,UAAU,EAAE,MAAM,EAElB,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,YAAY,CAQd;IAEK,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAe3D;IAEK,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmB7D;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAe/C;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAU9C;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUrD;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/D;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;IAED;;;;;OAKG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAejF;YAEa,OAAO;CAOtB;AAeD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAErD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Octokit } from "octokit";
|
|
2
|
+
import { FetchUnavailableError } from "../base.js";
|
|
3
|
+
/** `owner/name`: the shape every GitHub port validates a declared repository against. */
|
|
4
|
+
export const REPOSITORY_PATTERN = /^[^/\s]+\/[^/\s]+$/;
|
|
5
|
+
export class GitHubAuthenticationError extends Error {
|
|
6
|
+
}
|
|
7
|
+
export class GitHubUnavailableError extends FetchUnavailableError {
|
|
8
|
+
}
|
|
9
|
+
export function authenticationDiagnostic(
|
|
10
|
+
/* istanbul ignore next -- production environment boundary */
|
|
11
|
+
environment = process.env) {
|
|
12
|
+
return environment.GITHUB_TOKEN || environment.GH_TOKEN
|
|
13
|
+
? undefined
|
|
14
|
+
: "set GITHUB_TOKEN or GH_TOKEN to authenticate with GitHub";
|
|
15
|
+
}
|
|
16
|
+
export class GitHubClient {
|
|
17
|
+
octokit;
|
|
18
|
+
owner;
|
|
19
|
+
repo;
|
|
20
|
+
repository;
|
|
21
|
+
constructor(token, repository, octokit) {
|
|
22
|
+
this.repository = repository;
|
|
23
|
+
this.octokit = octokit ?? new Octokit({ auth: token });
|
|
24
|
+
const separator = repository.indexOf("/");
|
|
25
|
+
if (separator <= 0 || separator === repository.length - 1) {
|
|
26
|
+
throw new Error(`invalid GitHub repository: ${repository}`);
|
|
27
|
+
}
|
|
28
|
+
this.owner = repository.slice(0, separator);
|
|
29
|
+
this.repo = repository.slice(separator + 1);
|
|
30
|
+
}
|
|
31
|
+
static fromEnvironment(repository,
|
|
32
|
+
/* istanbul ignore next -- production environment boundary */
|
|
33
|
+
environment = process.env) {
|
|
34
|
+
const token = environment.GITHUB_TOKEN || environment.GH_TOKEN;
|
|
35
|
+
if (!token) {
|
|
36
|
+
throw new GitHubAuthenticationError("set GITHUB_TOKEN or GH_TOKEN to authenticate with GitHub");
|
|
37
|
+
}
|
|
38
|
+
return new GitHubClient(token, repository);
|
|
39
|
+
}
|
|
40
|
+
async openPullsWithLabel(label) {
|
|
41
|
+
const issues = await this.request(`list pulls labelled ${JSON.stringify(label)}`, () => this.octokit.paginate(this.octokit.rest.issues.listForRepo, {
|
|
42
|
+
owner: this.owner,
|
|
43
|
+
repo: this.repo,
|
|
44
|
+
labels: label,
|
|
45
|
+
state: "open",
|
|
46
|
+
per_page: 100,
|
|
47
|
+
}));
|
|
48
|
+
const pulls = [];
|
|
49
|
+
for (const issue of issues) {
|
|
50
|
+
if (issue.pull_request !== undefined)
|
|
51
|
+
pulls.push(await this.getPull(issue.number));
|
|
52
|
+
}
|
|
53
|
+
return pulls;
|
|
54
|
+
}
|
|
55
|
+
async openIssuesWithLabel(label) {
|
|
56
|
+
const issues = await this.request(`list issues labelled ${JSON.stringify(label)}`, () => this.octokit.paginate(this.octokit.rest.issues.listForRepo, {
|
|
57
|
+
owner: this.owner,
|
|
58
|
+
repo: this.repo,
|
|
59
|
+
labels: label,
|
|
60
|
+
state: "open",
|
|
61
|
+
per_page: 100,
|
|
62
|
+
}));
|
|
63
|
+
return issues
|
|
64
|
+
.filter((issue) => issue.pull_request === undefined)
|
|
65
|
+
.map((issue) => ({
|
|
66
|
+
number: issue.number,
|
|
67
|
+
title: issue.title ?? "",
|
|
68
|
+
body: issue.body ?? "",
|
|
69
|
+
html_url: issue.html_url,
|
|
70
|
+
labels: issue.labels.map(labelName),
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
async getPull(number) {
|
|
74
|
+
const response = await this.request(`get pull #${number}`, () => this.octokit.rest.pulls.get({ owner: this.owner, repo: this.repo, pull_number: number }));
|
|
75
|
+
const pull = response.data;
|
|
76
|
+
return {
|
|
77
|
+
number: pull.number,
|
|
78
|
+
head_ref: pull.head.ref,
|
|
79
|
+
head_sha: pull.head.sha,
|
|
80
|
+
base_ref: pull.base.ref,
|
|
81
|
+
html_url: pull.html_url,
|
|
82
|
+
labels: pull.labels.map(labelName),
|
|
83
|
+
title: pull.title ?? "",
|
|
84
|
+
body: pull.body ?? "",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async labels(number) {
|
|
88
|
+
const response = await this.request(`get labels for #${number}`, () => this.octokit.rest.issues.listLabelsOnIssue({
|
|
89
|
+
owner: this.owner,
|
|
90
|
+
repo: this.repo,
|
|
91
|
+
issue_number: number,
|
|
92
|
+
per_page: 100,
|
|
93
|
+
}));
|
|
94
|
+
return response.data.map(labelName);
|
|
95
|
+
}
|
|
96
|
+
async commentBodies(number) {
|
|
97
|
+
const comments = await this.request(`list comments for #${number}`, () => this.octokit.paginate(this.octokit.rest.issues.listComments, {
|
|
98
|
+
owner: this.owner,
|
|
99
|
+
repo: this.repo,
|
|
100
|
+
issue_number: number,
|
|
101
|
+
per_page: 100,
|
|
102
|
+
}));
|
|
103
|
+
return comments.map((comment) => comment.body ?? "");
|
|
104
|
+
}
|
|
105
|
+
async createComment(number, body) {
|
|
106
|
+
await this.request(`comment on #${number}`, () => this.octokit.rest.issues.createComment({
|
|
107
|
+
owner: this.owner,
|
|
108
|
+
repo: this.repo,
|
|
109
|
+
issue_number: number,
|
|
110
|
+
body,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
async setLabels(number, labels) {
|
|
114
|
+
await this.request(`set labels for #${number}`, () => this.octokit.rest.issues.setLabels({
|
|
115
|
+
owner: this.owner,
|
|
116
|
+
repo: this.repo,
|
|
117
|
+
issue_number: number,
|
|
118
|
+
labels: [...labels],
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create the repository-level label if it is absent. Issue-label writes require the label to
|
|
123
|
+
* exist in the repository first; creation answers 422 `already_exists` for a label that does,
|
|
124
|
+
* which is this method's success case. The inputs are fixed application constants, so no other
|
|
125
|
+
* validation failure shares that status here.
|
|
126
|
+
*/
|
|
127
|
+
async ensureLabel(name, color, description) {
|
|
128
|
+
try {
|
|
129
|
+
await this.request(`create label ${JSON.stringify(name)}`, () => this.octokit.rest.issues.createLabel({
|
|
130
|
+
owner: this.owner,
|
|
131
|
+
repo: this.repo,
|
|
132
|
+
name,
|
|
133
|
+
color,
|
|
134
|
+
description,
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
if (error instanceof GitHubUnavailableError && causeStatus(error) === 422)
|
|
139
|
+
return;
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async request(what, operation) {
|
|
144
|
+
try {
|
|
145
|
+
return await operation();
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw new GitHubUnavailableError(`${what}: ${errorMessage(error)}`, { cause: error });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function causeStatus(error) {
|
|
153
|
+
const status = error.cause?.status;
|
|
154
|
+
return typeof status === "number" ? status : undefined;
|
|
155
|
+
}
|
|
156
|
+
function labelName(label) {
|
|
157
|
+
return typeof label === "string" ? label : (label.name ?? "");
|
|
158
|
+
}
|
|
159
|
+
function errorMessage(error) {
|
|
160
|
+
return error instanceof Error ? error.message : String(error);
|
|
161
|
+
}
|
|
162
|
+
export function asJsonValue(value) {
|
|
163
|
+
return JSON.parse(JSON.stringify(value));
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/watchers/github/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { FetchContext, WatcherCandidate, WatcherSpec } from "../../adapters.js";
|
|
3
|
+
import { GitHubClient } from "../../github/client.js";
|
|
4
|
+
export declare const gitHubPullRequestOptionsSchema: z.ZodObject<{
|
|
5
|
+
repository: z.ZodString;
|
|
6
|
+
label: z.ZodString;
|
|
7
|
+
credentials: z.ZodDefault<z.ZodLiteral<"env">>;
|
|
8
|
+
}, z.core.$strict>;
|
|
9
|
+
export declare const gitHubIssueOptionsSchema: z.ZodObject<{
|
|
10
|
+
repository: z.ZodString;
|
|
11
|
+
label: z.ZodString;
|
|
12
|
+
credentials: z.ZodDefault<z.ZodLiteral<"env">>;
|
|
13
|
+
}, z.core.$strict>;
|
|
14
|
+
export type GitHubClientFactory = (repository: string, credentials: "env") => GitHubClient;
|
|
15
|
+
export declare function githubPullRequest(context: FetchContext, clientFactory?: GitHubClientFactory): Promise<WatcherCandidate[]>;
|
|
16
|
+
export declare function githubIssue(context: FetchContext, clientFactory?: GitHubClientFactory): Promise<WatcherCandidate[]>;
|
|
17
|
+
export declare const gitHubPullRequestWatcher: WatcherSpec;
|
|
18
|
+
export declare const gitHubIssueWatcher: WatcherSpec;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/watchers/github/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAA4B,YAAY,EAAsB,MAAM,wBAAwB,CAAC;AAGpG,eAAO,MAAM,8BAA8B;;;;kBAMhC,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;kBAM1B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,KAAK,YAAY,CAAC;AAI3F,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EAErB,aAAa,GAAE,mBAA0C,GACxD,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB7B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EAErB,aAAa,GAAE,mBAA0C,GACxD,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED,eAAO,MAAM,wBAAwB,EAAE,WAMtC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAMhC,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { authenticationDiagnostic, GitHubClient, REPOSITORY_PATTERN } from "../../github/client.js";
|
|
3
|
+
import { log } from "../../log.js";
|
|
4
|
+
export const gitHubPullRequestOptionsSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
repository: z.string().regex(REPOSITORY_PATTERN),
|
|
7
|
+
label: z.string().min(1),
|
|
8
|
+
credentials: z.literal("env").default("env"),
|
|
9
|
+
})
|
|
10
|
+
.strict();
|
|
11
|
+
export const gitHubIssueOptionsSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
repository: z.string().regex(REPOSITORY_PATTERN),
|
|
14
|
+
label: z.string().min(1),
|
|
15
|
+
credentials: z.literal("env").default("env"),
|
|
16
|
+
})
|
|
17
|
+
.strict();
|
|
18
|
+
const defaultClientFactory = (repository) => GitHubClient.fromEnvironment(repository);
|
|
19
|
+
export async function githubPullRequest(context,
|
|
20
|
+
/* istanbul ignore next -- production authentication boundary */
|
|
21
|
+
clientFactory = defaultClientFactory) {
|
|
22
|
+
const options = gitHubPullRequestOptionsSchema.parse(context.options);
|
|
23
|
+
const client = clientFactory(options.repository, options.credentials);
|
|
24
|
+
const output = [];
|
|
25
|
+
for (const info of await client.openPullsWithLabel(options.label)) {
|
|
26
|
+
output.push({
|
|
27
|
+
repository: options.repository,
|
|
28
|
+
kind: "pull_request",
|
|
29
|
+
id: String(info.number),
|
|
30
|
+
baseBranch: info.base_ref,
|
|
31
|
+
targetBranch: info.head_ref,
|
|
32
|
+
data: {
|
|
33
|
+
number: info.number,
|
|
34
|
+
url: info.html_url,
|
|
35
|
+
title: info.title,
|
|
36
|
+
body: info.body,
|
|
37
|
+
head_ref: info.head_ref,
|
|
38
|
+
head_sha: info.head_sha,
|
|
39
|
+
labels: info.labels,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
log.info(`polled PR #${info.number} @ ${info.head_sha.slice(0, 12)}`);
|
|
43
|
+
}
|
|
44
|
+
return output;
|
|
45
|
+
}
|
|
46
|
+
export async function githubIssue(context,
|
|
47
|
+
/* istanbul ignore next -- production authentication boundary */
|
|
48
|
+
clientFactory = defaultClientFactory) {
|
|
49
|
+
const options = gitHubIssueOptionsSchema.parse(context.options);
|
|
50
|
+
const client = clientFactory(options.repository, options.credentials);
|
|
51
|
+
const output = [];
|
|
52
|
+
for (const info of await client.openIssuesWithLabel(options.label)) {
|
|
53
|
+
output.push({
|
|
54
|
+
repository: options.repository,
|
|
55
|
+
kind: "issue",
|
|
56
|
+
id: String(info.number),
|
|
57
|
+
data: {
|
|
58
|
+
number: info.number,
|
|
59
|
+
url: info.html_url,
|
|
60
|
+
title: info.title,
|
|
61
|
+
body: info.body,
|
|
62
|
+
labels: info.labels,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
log.info(`polled issue #${info.number} (${info.title})`);
|
|
66
|
+
}
|
|
67
|
+
return output;
|
|
68
|
+
}
|
|
69
|
+
export const gitHubPullRequestWatcher = {
|
|
70
|
+
name: "github_pull_request",
|
|
71
|
+
source: "github",
|
|
72
|
+
optionsSchema: gitHubPullRequestOptionsSchema,
|
|
73
|
+
fetch: githubPullRequest,
|
|
74
|
+
checkStartup: authenticationDiagnostic,
|
|
75
|
+
};
|
|
76
|
+
export const gitHubIssueWatcher = {
|
|
77
|
+
name: "github_issue",
|
|
78
|
+
source: "github",
|
|
79
|
+
optionsSchema: gitHubIssueOptionsSchema,
|
|
80
|
+
fetch: githubIssue,
|
|
81
|
+
checkStartup: authenticationDiagnostic,
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/watchers/github/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watchers/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watchers/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class WorkerLockError extends Error {
|
|
2
|
+
constructor(message: string, options?: ErrorOptions);
|
|
3
|
+
}
|
|
4
|
+
export declare class WorkerProcessLock {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
private descriptor;
|
|
7
|
+
constructor(path: string);
|
|
8
|
+
acquire(): void;
|
|
9
|
+
release(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=worker-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-lock.d.ts","sourceRoot":"","sources":["../src/worker-lock.ts"],"names":[],"mappings":"AAKA,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF;AAED,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,IAAI,EAAE,MAAM,EAEvB;IAED,OAAO,IAAI,IAAI,CAgBd;IAED,OAAO,IAAI,IAAI,CASd;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { closeSync, mkdirSync, openSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { flockSync } from "fs-ext";
|
|
4
|
+
export class WorkerLockError extends Error {
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(message, options);
|
|
7
|
+
this.name = "WorkerLockError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class WorkerProcessLock {
|
|
11
|
+
path;
|
|
12
|
+
descriptor;
|
|
13
|
+
constructor(path) {
|
|
14
|
+
this.path = path;
|
|
15
|
+
}
|
|
16
|
+
acquire() {
|
|
17
|
+
if (this.descriptor !== undefined)
|
|
18
|
+
return;
|
|
19
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
20
|
+
const descriptor = openSync(this.path, "a+");
|
|
21
|
+
try {
|
|
22
|
+
flockSync(descriptor, "exnb");
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
closeSync(descriptor);
|
|
26
|
+
if (isLockContention(error)) {
|
|
27
|
+
throw new WorkerLockError(`another loopy Worker Process holds ${this.path}`, {
|
|
28
|
+
cause: error,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
this.descriptor = descriptor;
|
|
34
|
+
}
|
|
35
|
+
release() {
|
|
36
|
+
if (this.descriptor === undefined)
|
|
37
|
+
return;
|
|
38
|
+
const descriptor = this.descriptor;
|
|
39
|
+
this.descriptor = undefined;
|
|
40
|
+
try {
|
|
41
|
+
flockSync(descriptor, "un");
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
closeSync(descriptor);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isLockContention(error) {
|
|
49
|
+
if (!(error instanceof Error) || !("code" in error))
|
|
50
|
+
return false;
|
|
51
|
+
return error.code === "EAGAIN" || error.code === "EWOULDBLOCK";
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=worker-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-lock.js","sourceRoot":"","sources":["../src/worker-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IACnB,IAAI,CAAS;IACd,UAAU,CAAqB;IAEvC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO;QAC1C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,UAAU,CAAC,CAAC;YACtB,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,eAAe,CAAC,sCAAsC,IAAI,CAAC,IAAI,EAAE,EAAE;oBAC3E,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC;YACH,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC;AACjE,CAAC"}
|