@usine/github 0.0.0 → 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 +110 -1
- package/dist/github-app.d.ts +23 -0
- package/dist/github-app.d.ts.map +1 -0
- package/dist/github-app.js +169 -0
- package/dist/github-app.js.map +1 -0
- package/dist/http.d.ts +19 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +68 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/item-writer.d.ts +22 -0
- package/dist/item-writer.d.ts.map +1 -0
- package/dist/item-writer.js +66 -0
- package/dist/item-writer.js.map +1 -0
- package/dist/jwt.d.ts +10 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +72 -0
- package/dist/jwt.js.map +1 -0
- package/dist/local-secrets.d.ts +28 -0
- package/dist/local-secrets.d.ts.map +1 -0
- package/dist/local-secrets.js +56 -0
- package/dist/local-secrets.js.map +1 -0
- package/dist/model.d.ts +128 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +133 -0
- package/dist/model.js.map +1 -0
- package/dist/polling/model.d.ts +624 -0
- package/dist/polling/model.d.ts.map +1 -0
- package/dist/polling/model.js +188 -0
- package/dist/polling/model.js.map +1 -0
- package/dist/polling/polling.d.ts +18 -0
- package/dist/polling/polling.d.ts.map +1 -0
- package/dist/polling/polling.js +320 -0
- package/dist/polling/polling.js.map +1 -0
- package/dist/polling/queries.d.ts +3 -0
- package/dist/polling/queries.d.ts.map +1 -0
- package/dist/polling/queries.js +125 -0
- package/dist/polling/queries.js.map +1 -0
- package/package.json +49 -4
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Option, Schema, SchemaGetter } from "effect";
|
|
2
|
+
const PositiveInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1));
|
|
3
|
+
const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
4
|
+
const Timestamp = Schema.String.check(Schema.isPattern(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/u, {
|
|
5
|
+
message: "Expected a GitHub UTC timestamp",
|
|
6
|
+
}));
|
|
7
|
+
/**
|
|
8
|
+
* The payload keys that hold a `Timestamp` above. Bound to the slice schemas:
|
|
9
|
+
* a field added to a slice with a `Timestamp` value MUST be listed here, or it
|
|
10
|
+
* silently joins the content hash and re-fires every item once (ADR 0007 keeps
|
|
11
|
+
* timestamps in the payload but out of the hash).
|
|
12
|
+
*/
|
|
13
|
+
export const TIMESTAMP_FIELDS = new Set([
|
|
14
|
+
"closedAt",
|
|
15
|
+
"createdAt",
|
|
16
|
+
"mergedAt",
|
|
17
|
+
"submittedAt",
|
|
18
|
+
"updatedAt",
|
|
19
|
+
]);
|
|
20
|
+
export const EntityTag = Schema.NonEmptyString.pipe(Schema.brand("GitHubEntityTag"));
|
|
21
|
+
export const RepositoryLabelName = Schema.NonEmptyString.pipe(Schema.brand("GitHubRepositoryLabelName"));
|
|
22
|
+
/** A complete label catalog and the ETag for its canonical REST URL. */
|
|
23
|
+
export class RepositoryLabelCatalog extends Schema.Class("@usine/github/RepositoryLabelCatalog")({
|
|
24
|
+
entityTag: Schema.OptionFromNullOr(EntityTag),
|
|
25
|
+
labels: Schema.Array(RepositoryLabelName).check(Schema.isUnique()),
|
|
26
|
+
}) {
|
|
27
|
+
}
|
|
28
|
+
/** GitHub confirmed that the catalog named by its ETag has not changed. */
|
|
29
|
+
export class RepositoryLabelsNotModified extends Schema.TaggedClass("@usine/github/RepositoryLabelsNotModified")("RepositoryLabelsNotModified", {}) {
|
|
30
|
+
}
|
|
31
|
+
export const RepositoryLabelDetection = Schema.Union([
|
|
32
|
+
RepositoryLabelCatalog,
|
|
33
|
+
RepositoryLabelsNotModified,
|
|
34
|
+
]);
|
|
35
|
+
/** Efficiency-only REST cursor. Losing it is safe because Event dedup is permanent. */
|
|
36
|
+
export class PollCursor extends Schema.Class("@usine/github/PollCursor")({
|
|
37
|
+
entityTag: Schema.OptionFromNullOr(EntityTag),
|
|
38
|
+
watermark: Schema.OptionFromNullOr(Schema.DateTimeUtcFromString),
|
|
39
|
+
}) {
|
|
40
|
+
static empty = new PollCursor({
|
|
41
|
+
entityTag: Option.none(),
|
|
42
|
+
watermark: Option.none(),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export class ChangedIssue extends Schema.TaggedClass("@usine/github/ChangedIssue")("ChangedIssue", {
|
|
46
|
+
number: PositiveInt,
|
|
47
|
+
updatedAt: Schema.DateTimeUtc,
|
|
48
|
+
}) {
|
|
49
|
+
}
|
|
50
|
+
export class ChangedPullRequest extends Schema.TaggedClass("@usine/github/ChangedPullRequest")("ChangedPullRequest", {
|
|
51
|
+
number: PositiveInt,
|
|
52
|
+
updatedAt: Schema.DateTimeUtc,
|
|
53
|
+
}) {
|
|
54
|
+
}
|
|
55
|
+
export const ChangedItem = Schema.Union([ChangedIssue, ChangedPullRequest]);
|
|
56
|
+
export class RepositoryNotModified extends Schema.TaggedClass("@usine/github/RepositoryNotModified")("RepositoryNotModified", {
|
|
57
|
+
cursor: PollCursor,
|
|
58
|
+
nextPollAt: Schema.Option(Schema.DateTimeUtc),
|
|
59
|
+
}) {
|
|
60
|
+
}
|
|
61
|
+
export class RepositoryChanges extends Schema.TaggedClass("@usine/github/RepositoryChanges")("RepositoryChanges", {
|
|
62
|
+
cursor: PollCursor,
|
|
63
|
+
items: Schema.Array(ChangedItem),
|
|
64
|
+
/** True when the page cap ended the walk early; the rest arrives next cycle. */
|
|
65
|
+
backlog: Schema.Boolean,
|
|
66
|
+
nextPollAt: Schema.Option(Schema.DateTimeUtc),
|
|
67
|
+
}) {
|
|
68
|
+
}
|
|
69
|
+
export const ChangeDetection = Schema.Union([RepositoryNotModified, RepositoryChanges]);
|
|
70
|
+
/**
|
|
71
|
+
* GitHub declares most GraphQL connections nullable. A null connection and an
|
|
72
|
+
* empty one carry the same information, so the boundary normalizes null to
|
|
73
|
+
* empty — the domain type (and the CEL environment typed on it) stays
|
|
74
|
+
* non-null, and both shapes hash identically.
|
|
75
|
+
*/
|
|
76
|
+
const orEmpty = (schema, empty) => Schema.NullOr(schema).pipe(Schema.decodeTo(schema, {
|
|
77
|
+
decode: SchemaGetter.transform((value) => value ?? empty),
|
|
78
|
+
encode: SchemaGetter.transform((value) => value),
|
|
79
|
+
}));
|
|
80
|
+
const emptyConnection = { totalCount: 0, nodes: [] };
|
|
81
|
+
const Actor = Schema.Struct({ login: Schema.NonEmptyString });
|
|
82
|
+
const NullableActor = Schema.NullOr(Actor);
|
|
83
|
+
const Label = Schema.Struct({ name: Schema.NonEmptyString });
|
|
84
|
+
const Labels = Schema.Struct({ totalCount: NonNegativeInt, nodes: Schema.Array(Label) });
|
|
85
|
+
const IssueComment = Schema.Struct({
|
|
86
|
+
author: NullableActor,
|
|
87
|
+
body: Schema.String,
|
|
88
|
+
createdAt: Timestamp,
|
|
89
|
+
});
|
|
90
|
+
const IssueComments = Schema.Struct({
|
|
91
|
+
totalCount: NonNegativeInt,
|
|
92
|
+
nodes: Schema.Array(IssueComment),
|
|
93
|
+
});
|
|
94
|
+
/** Exact v1 issue payload slice recorded by issue #11. */
|
|
95
|
+
export const IssuePayload = Schema.Struct({
|
|
96
|
+
number: PositiveInt,
|
|
97
|
+
title: Schema.String,
|
|
98
|
+
body: Schema.String,
|
|
99
|
+
url: Schema.NonEmptyString,
|
|
100
|
+
state: Schema.String,
|
|
101
|
+
stateReason: Schema.NullOr(Schema.String),
|
|
102
|
+
createdAt: Timestamp,
|
|
103
|
+
updatedAt: Timestamp,
|
|
104
|
+
closedAt: Schema.NullOr(Timestamp),
|
|
105
|
+
author: NullableActor,
|
|
106
|
+
issueType: Schema.NullOr(Schema.Struct({ name: Schema.String })),
|
|
107
|
+
milestone: Schema.NullOr(Schema.Struct({ title: Schema.String })),
|
|
108
|
+
labels: orEmpty(Labels, emptyConnection),
|
|
109
|
+
assignees: Schema.Struct({ totalCount: NonNegativeInt, nodes: Schema.Array(Actor) }),
|
|
110
|
+
comments: IssueComments,
|
|
111
|
+
closedByPullRequestsReferences: orEmpty(Schema.Struct({
|
|
112
|
+
totalCount: NonNegativeInt,
|
|
113
|
+
nodes: Schema.Array(Schema.Struct({
|
|
114
|
+
number: PositiveInt,
|
|
115
|
+
state: Schema.String,
|
|
116
|
+
isDraft: Schema.Boolean,
|
|
117
|
+
url: Schema.NonEmptyString,
|
|
118
|
+
})),
|
|
119
|
+
}), emptyConnection),
|
|
120
|
+
});
|
|
121
|
+
/** Null when the reviewer is a deleted user or a mannequin — real content, kept. */
|
|
122
|
+
const RequestedReviewer = Schema.NullOr(Schema.Struct({ login: Schema.optionalKey(Schema.NonEmptyString) }));
|
|
123
|
+
const Review = Schema.Struct({
|
|
124
|
+
author: NullableActor,
|
|
125
|
+
state: Schema.String,
|
|
126
|
+
body: Schema.String,
|
|
127
|
+
submittedAt: Schema.NullOr(Timestamp),
|
|
128
|
+
commit: Schema.NullOr(Schema.Struct({ oid: Schema.NonEmptyString })),
|
|
129
|
+
});
|
|
130
|
+
const ReviewThreadComment = Schema.Struct({ author: NullableActor, body: Schema.String });
|
|
131
|
+
/** Exact v1 pull-request payload slice recorded by issue #11. */
|
|
132
|
+
export const PullRequestPayload = Schema.Struct({
|
|
133
|
+
number: PositiveInt,
|
|
134
|
+
title: Schema.String,
|
|
135
|
+
body: Schema.String,
|
|
136
|
+
url: Schema.NonEmptyString,
|
|
137
|
+
state: Schema.String,
|
|
138
|
+
isDraft: Schema.Boolean,
|
|
139
|
+
merged: Schema.Boolean,
|
|
140
|
+
createdAt: Timestamp,
|
|
141
|
+
updatedAt: Timestamp,
|
|
142
|
+
mergedAt: Schema.NullOr(Timestamp),
|
|
143
|
+
author: NullableActor,
|
|
144
|
+
baseRefName: Schema.String,
|
|
145
|
+
headRefName: Schema.String,
|
|
146
|
+
headRefOid: Schema.NonEmptyString,
|
|
147
|
+
additions: NonNegativeInt,
|
|
148
|
+
deletions: NonNegativeInt,
|
|
149
|
+
changedFiles: NonNegativeInt,
|
|
150
|
+
reviewDecision: Schema.NullOr(Schema.String),
|
|
151
|
+
statusCheckRollup: Schema.NullOr(Schema.Struct({ state: Schema.String })),
|
|
152
|
+
labels: orEmpty(Labels, emptyConnection),
|
|
153
|
+
reviewRequests: orEmpty(Schema.Struct({
|
|
154
|
+
totalCount: NonNegativeInt,
|
|
155
|
+
nodes: Schema.Array(Schema.Struct({ requestedReviewer: RequestedReviewer })),
|
|
156
|
+
}), emptyConnection),
|
|
157
|
+
reviews: orEmpty(Schema.Struct({ totalCount: NonNegativeInt, nodes: Schema.Array(Review) }), emptyConnection),
|
|
158
|
+
reviewThreads: Schema.Struct({
|
|
159
|
+
totalCount: NonNegativeInt,
|
|
160
|
+
nodes: Schema.Array(Schema.Struct({
|
|
161
|
+
isResolved: Schema.Boolean,
|
|
162
|
+
isOutdated: Schema.Boolean,
|
|
163
|
+
path: Schema.String,
|
|
164
|
+
comments: Schema.Struct({
|
|
165
|
+
totalCount: NonNegativeInt,
|
|
166
|
+
nodes: Schema.Array(ReviewThreadComment),
|
|
167
|
+
}),
|
|
168
|
+
})),
|
|
169
|
+
}),
|
|
170
|
+
comments: IssueComments,
|
|
171
|
+
closingIssuesReferences: orEmpty(Schema.Struct({
|
|
172
|
+
totalCount: NonNegativeInt,
|
|
173
|
+
nodes: Schema.Array(Schema.Struct({ number: PositiveInt, state: Schema.String })),
|
|
174
|
+
}), emptyConnection),
|
|
175
|
+
});
|
|
176
|
+
export const ContentHash = Schema.String.check(Schema.isPattern(/^[a-f0-9]{64}$/u, { message: "Expected a SHA-256 content hash" })).pipe(Schema.brand("GitHubContentHash"));
|
|
177
|
+
export class IssueSnapshot extends Schema.TaggedClass("@usine/github/IssueSnapshot")("IssueSnapshot", {
|
|
178
|
+
payload: IssuePayload,
|
|
179
|
+
contentHash: ContentHash,
|
|
180
|
+
}) {
|
|
181
|
+
}
|
|
182
|
+
export class PullRequestSnapshot extends Schema.TaggedClass("@usine/github/PullRequestSnapshot")("PullRequestSnapshot", {
|
|
183
|
+
payload: PullRequestPayload,
|
|
184
|
+
contentHash: ContentHash,
|
|
185
|
+
}) {
|
|
186
|
+
}
|
|
187
|
+
export const PayloadSnapshot = Schema.Union([IssueSnapshot, PullRequestSnapshot]);
|
|
188
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/polling/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Repository } from "@usine/core";
|
|
2
|
+
import { Context, Crypto, Effect, Layer, Option } from "effect";
|
|
3
|
+
import { HttpClient } from "effect/unstable/http";
|
|
4
|
+
import { GitHubApp } from "../github-app.ts";
|
|
5
|
+
import { type GitHubAppError } from "../model.ts";
|
|
6
|
+
import { EntityTag, PollCursor, RepositoryLabelCatalog, RepositoryLabelsNotModified, type ChangeDetection, type ChangedItem, type PayloadSnapshot } from "./model.ts";
|
|
7
|
+
declare const GitHubPolling_base: Context.ServiceClass<GitHubPolling, "@usine/github/GitHubPolling", {
|
|
8
|
+
readonly changes: (repository: Repository.Name, cursor: PollCursor) => Effect.Effect<ChangeDetection, GitHubAppError>;
|
|
9
|
+
readonly labels: (repository: Repository.Name, entityTag: Option.Option<EntityTag>) => Effect.Effect<RepositoryLabelCatalog | RepositoryLabelsNotModified, GitHubAppError>;
|
|
10
|
+
readonly snapshot: (repository: Repository.Name, item: ChangedItem) => Effect.Effect<PayloadSnapshot, GitHubAppError>;
|
|
11
|
+
}>;
|
|
12
|
+
/** GitHub change detection and snapshot fetching behind one external seam. */
|
|
13
|
+
export declare class GitHubPolling extends GitHubPolling_base {
|
|
14
|
+
/** Live GitHub polling adapter over an installation token and Effect HTTP. */
|
|
15
|
+
static readonly layer: Layer.Layer<GitHubPolling, never, Crypto.Crypto | GitHubApp | HttpClient.HttpClient>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=polling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/polling/polling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAS,OAAO,EAAE,MAAM,EAAY,MAAM,EAAE,KAAK,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACzF,OAAO,EAAE,UAAU,EAAyC,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY7C,OAAO,EAAwB,KAAK,cAAc,EAAwB,MAAM,aAAa,CAAC;AAC9F,OAAO,EAIL,SAAS,EAGT,UAAU,EAGV,sBAAsB,EACtB,2BAA2B,EAK3B,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;;sBAuJE,CAChB,UAAU,EAAE,UAAU,CAAC,IAAI,EAC3B,MAAM,EAAE,UAAU,KACf,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;qBAClC,CACf,UAAU,EAAE,UAAU,CAAC,IAAI,EAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,sBAAsB,GAAG,2BAA2B,EAAE,cAAc,CAAC;uBACrE,CACjB,UAAU,EAAE,UAAU,CAAC,IAAI,EAC3B,IAAI,EAAE,WAAW,KACd,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;;AAfvD,8EAA8E;AAC9E,qBAAa,aAAc,SAAQ,kBAgBD;IAChC,8EAA8E;IAC9E,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAChC,aAAa,EACb,KAAK,EACL,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,UAAU,CAClD,CAmTC;CACH"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { Repository } from "@usine/core";
|
|
2
|
+
import { Clock, Context, Crypto, DateTime, Effect, Layer, Option, Schema } from "effect";
|
|
3
|
+
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
|
|
4
|
+
import { GitHubApp } from "../github-app.js";
|
|
5
|
+
import { API_ROOT, authorized, invalidResponse, pollIntervalMillis, rateLimitResetMillis, rateLimitRetryEpoch, retryAfterMillis, statusError, transportError, } from "../http.js";
|
|
6
|
+
import { GitHubRateLimitError } from "../model.js";
|
|
7
|
+
import { ChangedIssue, ChangedPullRequest, ContentHash, EntityTag, IssuePayload, IssueSnapshot, PollCursor, PullRequestPayload, PullRequestSnapshot, RepositoryLabelCatalog, RepositoryLabelsNotModified, RepositoryLabelName, RepositoryChanges, RepositoryNotModified, TIMESTAMP_FIELDS, } from "./model.js";
|
|
8
|
+
import { ISSUE_PAYLOAD_QUERY, PULL_REQUEST_PAYLOAD_QUERY } from "./queries.js";
|
|
9
|
+
const WATERMARK_OVERLAP_MS = 5_000;
|
|
10
|
+
const RATE_LIMIT_PRESSURE_THRESHOLD = 100;
|
|
11
|
+
/** Bounds one cycle's REST walk; the watermark resumes the remainder next cycle. */
|
|
12
|
+
const MAX_CHANGE_PAGES = 10;
|
|
13
|
+
/** A pathological catalog cannot turn one repository poll into an unbounded walk. */
|
|
14
|
+
const MAX_LABEL_PAGES = 100;
|
|
15
|
+
/** GraphQL rate limiting sometimes omits reset headers; wait at least this long. */
|
|
16
|
+
const GRAPHQL_RATE_LIMIT_FALLBACK_MS = 60_000;
|
|
17
|
+
const RestChangedItem = Schema.Struct({
|
|
18
|
+
number: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),
|
|
19
|
+
updatedAt: Schema.DateTimeUtcFromString,
|
|
20
|
+
pullRequest: Schema.optionalKey(Schema.Unknown),
|
|
21
|
+
}).pipe(Schema.encodeKeys({ updatedAt: "updated_at", pullRequest: "pull_request" }));
|
|
22
|
+
const RestChangedItems = Schema.Array(RestChangedItem);
|
|
23
|
+
const RestRepositoryLabels = Schema.Array(Schema.Struct({ name: RepositoryLabelName }));
|
|
24
|
+
/** The GraphQL transport envelope; `errors` arrives on HTTP 200 and must be read. */
|
|
25
|
+
const GraphqlEnvelope = Schema.Struct({
|
|
26
|
+
data: Schema.optionalKey(Schema.Unknown),
|
|
27
|
+
errors: Schema.optionalKey(Schema.Array(Schema.Struct({
|
|
28
|
+
message: Schema.String,
|
|
29
|
+
type: Schema.optionalKey(Schema.String),
|
|
30
|
+
}))),
|
|
31
|
+
});
|
|
32
|
+
const IssueData = Schema.Struct({
|
|
33
|
+
repository: Schema.OptionFromNullOr(Schema.Struct({ issue: Schema.OptionFromNullOr(IssuePayload) })),
|
|
34
|
+
});
|
|
35
|
+
const PullRequestData = Schema.Struct({
|
|
36
|
+
repository: Schema.OptionFromNullOr(Schema.Struct({ pullRequest: Schema.OptionFromNullOr(PullRequestPayload) })),
|
|
37
|
+
});
|
|
38
|
+
const canonicalContent = (value) => {
|
|
39
|
+
if (Array.isArray(value))
|
|
40
|
+
return value.map(canonicalContent);
|
|
41
|
+
if (Schema.is(Schema.JsonObject)(value)) {
|
|
42
|
+
return Object.fromEntries(Object.entries(value)
|
|
43
|
+
.filter(([key]) => !TIMESTAMP_FIELDS.has(key))
|
|
44
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
45
|
+
.map(([key, child]) => [key, canonicalContent(child)]));
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
};
|
|
49
|
+
const dateTimeAt = (epochMillis) => DateTime.make(epochMillis);
|
|
50
|
+
const toChangedItems = (decoded) => decoded.map((item) => item.pullRequest === undefined
|
|
51
|
+
? new ChangedIssue({ number: item.number, updatedAt: item.updatedAt })
|
|
52
|
+
: new ChangedPullRequest({ number: item.number, updatedAt: item.updatedAt }));
|
|
53
|
+
const latestDateTime = (candidates) => {
|
|
54
|
+
const epochs = candidates.flatMap((candidate) => Option.match(candidate, { onNone: () => [], onSome: (value) => [value] }));
|
|
55
|
+
if (epochs.length === 0)
|
|
56
|
+
return Option.none();
|
|
57
|
+
return dateTimeAt(Math.max(...epochs));
|
|
58
|
+
};
|
|
59
|
+
const nextPollAt = (headers, now) => latestDateTime([
|
|
60
|
+
pollIntervalMillis(headers, now),
|
|
61
|
+
retryAfterMillis(headers["retry-after"], now),
|
|
62
|
+
rateLimitResetMillis(headers, RATE_LIMIT_PRESSURE_THRESHOLD),
|
|
63
|
+
]);
|
|
64
|
+
/** `<https://...>; rel="next"` from a Link header, when GitHub has more pages. */
|
|
65
|
+
const nextPageUrl = (link) => {
|
|
66
|
+
if (link === undefined)
|
|
67
|
+
return Option.none();
|
|
68
|
+
const match = /<(?<url>[^>]+)>;\s*rel="next"/u.exec(link);
|
|
69
|
+
return Option.fromNullishOr(match?.groups?.["url"]);
|
|
70
|
+
};
|
|
71
|
+
const sinceParameter = (watermark) => {
|
|
72
|
+
const epoch = DateTime.toEpochMillis(watermark) - WATERMARK_OVERLAP_MS;
|
|
73
|
+
return `${new Date(epoch - (epoch % 1_000)).toISOString().slice(0, 19)}Z`;
|
|
74
|
+
};
|
|
75
|
+
const changesUrl = (repository, cursor) => {
|
|
76
|
+
const { name, owner } = Repository.parts(repository);
|
|
77
|
+
const url = new URL(`${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues`);
|
|
78
|
+
url.searchParams.set("state", "all");
|
|
79
|
+
url.searchParams.set("sort", "updated");
|
|
80
|
+
url.searchParams.set("direction", "asc");
|
|
81
|
+
url.searchParams.set("per_page", "100");
|
|
82
|
+
if (Option.isSome(cursor.watermark)) {
|
|
83
|
+
url.searchParams.set("since", sinceParameter(cursor.watermark.value));
|
|
84
|
+
}
|
|
85
|
+
return url.toString();
|
|
86
|
+
};
|
|
87
|
+
const labelsUrl = (repository) => {
|
|
88
|
+
const { name, owner } = Repository.parts(repository);
|
|
89
|
+
const url = new URL(`${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/labels`);
|
|
90
|
+
url.searchParams.set("per_page", "100");
|
|
91
|
+
return url.toString();
|
|
92
|
+
};
|
|
93
|
+
const itemLabelsUrl = (repository, item) => {
|
|
94
|
+
const { name, owner } = Repository.parts(repository);
|
|
95
|
+
const url = new URL(`${API_ROOT}/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues/${item}/labels`);
|
|
96
|
+
url.searchParams.set("per_page", "100");
|
|
97
|
+
return url.toString();
|
|
98
|
+
};
|
|
99
|
+
const newerWatermark = (cursor, items) => {
|
|
100
|
+
const epochs = items.map(({ updatedAt }) => DateTime.toEpochMillis(updatedAt));
|
|
101
|
+
if (Option.isSome(cursor.watermark)) {
|
|
102
|
+
epochs.push(DateTime.toEpochMillis(cursor.watermark.value));
|
|
103
|
+
}
|
|
104
|
+
return epochs.length === 0 ? Option.none() : dateTimeAt(Math.max(...epochs));
|
|
105
|
+
};
|
|
106
|
+
const makeContentHash = (crypto) => Effect.fn("GitHubPolling.contentHash")(function* (payload) {
|
|
107
|
+
const encoded = new TextEncoder().encode(JSON.stringify(canonicalContent(payload)));
|
|
108
|
+
// An in-memory SHA-256 digest cannot fail for expected reasons: a failure
|
|
109
|
+
// here is a violated platform invariant, not a domain failure.
|
|
110
|
+
const digest = yield* crypto.digest("SHA-256", encoded).pipe(Effect.orDie);
|
|
111
|
+
return ContentHash.make(Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join(""));
|
|
112
|
+
});
|
|
113
|
+
/** GitHub change detection and snapshot fetching behind one external seam. */
|
|
114
|
+
export class GitHubPolling extends Context.Service()("@usine/github/GitHubPolling") {
|
|
115
|
+
/** Live GitHub polling adapter over an installation token and Effect HTTP. */
|
|
116
|
+
static layer = Layer.effect(GitHubPolling, Effect.gen(function* () {
|
|
117
|
+
const app = yield* GitHubApp;
|
|
118
|
+
const crypto = yield* Crypto.Crypto;
|
|
119
|
+
const http = yield* HttpClient.HttpClient;
|
|
120
|
+
const contentHash = makeContentHash(crypto);
|
|
121
|
+
const execute = Effect.fn("GitHubPolling.execute")(function* (operation, request) {
|
|
122
|
+
return yield* http
|
|
123
|
+
.execute(request)
|
|
124
|
+
.pipe(Effect.mapError((error) => transportError(operation, error)));
|
|
125
|
+
});
|
|
126
|
+
const changesPage = Effect.fn("GitHubPolling.changesPage")(function* (url) {
|
|
127
|
+
const token = yield* app.installationToken();
|
|
128
|
+
const request = HttpClientRequest.get(url).pipe(authorized(token.value));
|
|
129
|
+
const response = yield* execute("poll-repository-changes", request);
|
|
130
|
+
const now = yield* Clock.currentTimeMillis;
|
|
131
|
+
if (response.status !== 200) {
|
|
132
|
+
return yield* statusError("poll-repository-changes", response, now);
|
|
133
|
+
}
|
|
134
|
+
const decoded = yield* HttpClientResponse.schemaBodyJson(RestChangedItems)(response).pipe(Effect.mapError((error) => invalidResponse("poll-repository-changes", error.message)));
|
|
135
|
+
return {
|
|
136
|
+
items: toChangedItems(decoded),
|
|
137
|
+
next: nextPageUrl(response.headers.link),
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
const labelsPage = Effect.fn("GitHubPolling.labelsPage")(function* (operation, url) {
|
|
141
|
+
const token = yield* app.installationToken();
|
|
142
|
+
const request = HttpClientRequest.get(url).pipe(authorized(token.value));
|
|
143
|
+
const response = yield* execute(operation, request);
|
|
144
|
+
const now = yield* Clock.currentTimeMillis;
|
|
145
|
+
if (response.status !== 200) {
|
|
146
|
+
return yield* statusError(operation, response, now);
|
|
147
|
+
}
|
|
148
|
+
const decoded = yield* HttpClientResponse.schemaBodyJson(RestRepositoryLabels)(response).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
|
|
149
|
+
return {
|
|
150
|
+
labels: decoded.map(({ name }) => name),
|
|
151
|
+
next: nextPageUrl(response.headers.link),
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
/** Walks the pages after an already-fetched first one; one cap for every label walk. */
|
|
155
|
+
const remainingLabelPages = Effect.fn("GitHubPolling.remainingLabelPages")(function* (operation, firstPage) {
|
|
156
|
+
const catalog = [...firstPage.labels];
|
|
157
|
+
let next = firstPage.next;
|
|
158
|
+
let pages = 1;
|
|
159
|
+
while (Option.isSome(next) && pages < MAX_LABEL_PAGES) {
|
|
160
|
+
const page = yield* labelsPage(operation, next.value);
|
|
161
|
+
catalog.push(...page.labels);
|
|
162
|
+
next = page.next;
|
|
163
|
+
pages += 1;
|
|
164
|
+
}
|
|
165
|
+
if (Option.isSome(next)) {
|
|
166
|
+
return yield* invalidResponse(operation, `GitHub label list exceeded ${MAX_LABEL_PAGES} pages`);
|
|
167
|
+
}
|
|
168
|
+
return catalog.sort((left, right) => left.localeCompare(right));
|
|
169
|
+
});
|
|
170
|
+
const allLabels = Effect.fn("GitHubPolling.allLabels")(function* (operation, initialUrl) {
|
|
171
|
+
return yield* remainingLabelPages(operation, yield* labelsPage(operation, initialUrl));
|
|
172
|
+
});
|
|
173
|
+
const labels = Effect.fn("GitHubPolling.labels")(function* (repository, entityTag) {
|
|
174
|
+
yield* Effect.annotateCurrentSpan({ repository });
|
|
175
|
+
const token = yield* app.installationToken();
|
|
176
|
+
let request = HttpClientRequest.get(labelsUrl(repository)).pipe(authorized(token.value));
|
|
177
|
+
if (Option.isSome(entityTag)) {
|
|
178
|
+
request = HttpClientRequest.setHeader(request, "if-none-match", entityTag.value);
|
|
179
|
+
}
|
|
180
|
+
const response = yield* execute("list-repository-labels", request);
|
|
181
|
+
const now = yield* Clock.currentTimeMillis;
|
|
182
|
+
if (response.status === 304)
|
|
183
|
+
return new RepositoryLabelsNotModified();
|
|
184
|
+
if (response.status !== 200) {
|
|
185
|
+
return yield* statusError("list-repository-labels", response, now);
|
|
186
|
+
}
|
|
187
|
+
const firstPage = yield* HttpClientResponse.schemaBodyJson(RestRepositoryLabels)(response).pipe(Effect.mapError((error) => invalidResponse("list-repository-labels", error.message)));
|
|
188
|
+
const catalog = yield* remainingLabelPages("list-repository-labels", {
|
|
189
|
+
labels: firstPage.map(({ name }) => name),
|
|
190
|
+
next: nextPageUrl(response.headers.link),
|
|
191
|
+
});
|
|
192
|
+
const catalogEntityTag = Schema.decodeUnknownOption(EntityTag)(response.headers.etag);
|
|
193
|
+
if (Option.isNone(catalogEntityTag)) {
|
|
194
|
+
yield* Effect.logWarning("GitHub omitted the label catalog ETag; next poll is unconditional", {
|
|
195
|
+
repository,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return new RepositoryLabelCatalog({ entityTag: catalogEntityTag, labels: catalog });
|
|
199
|
+
});
|
|
200
|
+
const changes = Effect.fn("GitHubPolling.changes")(function* (repository, cursor) {
|
|
201
|
+
const token = yield* app.installationToken();
|
|
202
|
+
let request = HttpClientRequest.get(changesUrl(repository, cursor)).pipe(authorized(token.value));
|
|
203
|
+
if (Option.isSome(cursor.entityTag)) {
|
|
204
|
+
request = HttpClientRequest.setHeader(request, "if-none-match", cursor.entityTag.value);
|
|
205
|
+
}
|
|
206
|
+
const response = yield* execute("poll-repository-changes", request);
|
|
207
|
+
const now = yield* Clock.currentTimeMillis;
|
|
208
|
+
const recommended = nextPollAt(response.headers, now);
|
|
209
|
+
if (response.status === 304) {
|
|
210
|
+
return new RepositoryNotModified({ cursor, nextPollAt: recommended });
|
|
211
|
+
}
|
|
212
|
+
if (response.status !== 200) {
|
|
213
|
+
return yield* statusError("poll-repository-changes", response, now);
|
|
214
|
+
}
|
|
215
|
+
const decoded = yield* HttpClientResponse.schemaBodyJson(RestChangedItems)(response).pipe(Effect.mapError((error) => invalidResponse("poll-repository-changes", error.message)));
|
|
216
|
+
const items = toChangedItems(decoded);
|
|
217
|
+
// The ETag is efficiency-only: a page without one costs conditional
|
|
218
|
+
// requests next cycle, never correctness. Only the first page's tag
|
|
219
|
+
// matches the canonical URL the next cycle re-requests.
|
|
220
|
+
const entityTag = Schema.decodeUnknownOption(EntityTag)(response.headers.etag);
|
|
221
|
+
if (Option.isNone(entityTag)) {
|
|
222
|
+
yield* Effect.logWarning("GitHub omitted the changes ETag; next poll is unconditional", {
|
|
223
|
+
repository,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
const allItems = [...items];
|
|
227
|
+
let next = nextPageUrl(response.headers.link);
|
|
228
|
+
let pages = 1;
|
|
229
|
+
while (Option.isSome(next) && pages < MAX_CHANGE_PAGES) {
|
|
230
|
+
const page = yield* changesPage(next.value);
|
|
231
|
+
allItems.push(...page.items);
|
|
232
|
+
next = page.next;
|
|
233
|
+
pages += 1;
|
|
234
|
+
}
|
|
235
|
+
const backlog = Option.isSome(next);
|
|
236
|
+
if (backlog) {
|
|
237
|
+
yield* Effect.logInfo("GitHub changes walk hit the page cap; backlog remains", {
|
|
238
|
+
repository,
|
|
239
|
+
pages,
|
|
240
|
+
items: allItems.length,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return new RepositoryChanges({
|
|
244
|
+
cursor: new PollCursor({ entityTag, watermark: newerWatermark(cursor, allItems) }),
|
|
245
|
+
items: allItems,
|
|
246
|
+
backlog,
|
|
247
|
+
nextPollAt: recommended,
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
const graphql = Effect.fn("GitHubPolling.graphql")(function* (operation, repository, number, query, dataSchema) {
|
|
251
|
+
const token = yield* app.installationToken();
|
|
252
|
+
const { name, owner } = Repository.parts(repository);
|
|
253
|
+
const request = HttpClientRequest.post(`${API_ROOT}/graphql`).pipe(HttpClientRequest.bodyJsonUnsafe({ query, variables: { owner, name, number } }), authorized(token.value));
|
|
254
|
+
const response = yield* execute(operation, request);
|
|
255
|
+
const now = yield* Clock.currentTimeMillis;
|
|
256
|
+
if (response.status !== 200)
|
|
257
|
+
return yield* statusError(operation, response, now);
|
|
258
|
+
const envelope = yield* HttpClientResponse.schemaBodyJson(GraphqlEnvelope)(response).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
|
|
259
|
+
// GraphQL reports failures on HTTP 200: rate limiting becomes a typed
|
|
260
|
+
// wait; anything else keeps its messages for diagnosis.
|
|
261
|
+
if (envelope.errors !== undefined && envelope.errors.length > 0) {
|
|
262
|
+
const rateLimited = envelope.errors.some((error) => error.type === "RATE_LIMITED");
|
|
263
|
+
if (rateLimited) {
|
|
264
|
+
const retryAt = Option.getOrElse(rateLimitRetryEpoch(response.headers, now), () => now + GRAPHQL_RATE_LIMIT_FALLBACK_MS);
|
|
265
|
+
return yield* new GitHubRateLimitError({
|
|
266
|
+
operation,
|
|
267
|
+
retryAt: DateTime.makeUnsafe(retryAt),
|
|
268
|
+
message: "GitHub GraphQL asked the poller to wait before retrying",
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return yield* invalidResponse(operation, `GraphQL errors: ${envelope.errors.map((error) => error.message).join("; ")}`);
|
|
272
|
+
}
|
|
273
|
+
return yield* Schema.decodeUnknownEffect(dataSchema)(envelope.data).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
|
|
274
|
+
});
|
|
275
|
+
const snapshot = Effect.fn("GitHubPolling.snapshot")((repository, item) => Effect.gen(function* () {
|
|
276
|
+
const completeLabels = Effect.fn("GitHubPolling.completeItemLabels")(function* (payload) {
|
|
277
|
+
if (payload.labels.nodes.length >= payload.labels.totalCount)
|
|
278
|
+
return payload.labels;
|
|
279
|
+
yield* Effect.logDebug("Completing truncated Item label connection for Board matching", {
|
|
280
|
+
repository,
|
|
281
|
+
item: item.number,
|
|
282
|
+
listedLabels: payload.labels.nodes.length,
|
|
283
|
+
totalLabels: payload.labels.totalCount,
|
|
284
|
+
});
|
|
285
|
+
const names = yield* allLabels("fetch-item-labels", itemLabelsUrl(repository, item.number));
|
|
286
|
+
return { totalCount: names.length, nodes: names.map((name) => ({ name })) };
|
|
287
|
+
});
|
|
288
|
+
if (item._tag === "ChangedIssue") {
|
|
289
|
+
const data = yield* graphql("fetch-issue-snapshot", repository, item.number, ISSUE_PAYLOAD_QUERY, IssueData);
|
|
290
|
+
const payload = Option.flatMap(data.repository, ({ issue }) => issue);
|
|
291
|
+
if (Option.isNone(payload)) {
|
|
292
|
+
return yield* invalidResponse("fetch-issue-snapshot", `issue ${item.number} came back null — deleted, transferred, or access lost`);
|
|
293
|
+
}
|
|
294
|
+
const completePayload = {
|
|
295
|
+
...payload.value,
|
|
296
|
+
labels: yield* completeLabels(payload.value),
|
|
297
|
+
};
|
|
298
|
+
return new IssueSnapshot({
|
|
299
|
+
payload: completePayload,
|
|
300
|
+
contentHash: yield* contentHash(completePayload),
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
const data = yield* graphql("fetch-pull-request-snapshot", repository, item.number, PULL_REQUEST_PAYLOAD_QUERY, PullRequestData);
|
|
304
|
+
const payload = Option.flatMap(data.repository, ({ pullRequest }) => pullRequest);
|
|
305
|
+
if (Option.isNone(payload)) {
|
|
306
|
+
return yield* invalidResponse("fetch-pull-request-snapshot", `pull request ${item.number} came back null — deleted or access lost`);
|
|
307
|
+
}
|
|
308
|
+
const completePayload = {
|
|
309
|
+
...payload.value,
|
|
310
|
+
labels: yield* completeLabels(payload.value),
|
|
311
|
+
};
|
|
312
|
+
return new PullRequestSnapshot({
|
|
313
|
+
payload: completePayload,
|
|
314
|
+
contentHash: yield* contentHash(completePayload),
|
|
315
|
+
});
|
|
316
|
+
}));
|
|
317
|
+
return { changes, labels, snapshot };
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=polling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/polling/polling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const ISSUE_PAYLOAD_QUERY = "\n query UsineIssuePayload($owner: String!, $name: String!, $number: Int!) {\n repository(owner: $owner, name: $name) {\n issue(number: $number) {\n number\n title\n body\n url\n state\n stateReason\n createdAt\n updatedAt\n closedAt\n author { login }\n issueType { name }\n milestone { title }\n labels(first: 50) {\n totalCount\n nodes { name }\n }\n assignees(first: 10) {\n totalCount\n nodes { login }\n }\n comments(last: 20) {\n totalCount\n nodes {\n author { login }\n body\n createdAt\n }\n }\n closedByPullRequestsReferences(first: 10, includeClosedPrs: true) {\n totalCount\n nodes {\n number\n state\n isDraft\n url\n }\n }\n }\n }\n }\n";
|
|
2
|
+
export declare const PULL_REQUEST_PAYLOAD_QUERY = "\n query UsinePullRequestPayload($owner: String!, $name: String!, $number: Int!) {\n repository(owner: $owner, name: $name) {\n pullRequest(number: $number) {\n number\n title\n body\n url\n state\n isDraft\n merged\n createdAt\n updatedAt\n mergedAt\n author { login }\n baseRefName\n headRefName\n headRefOid\n additions\n deletions\n changedFiles\n reviewDecision\n statusCheckRollup { state }\n labels(first: 50) {\n totalCount\n nodes { name }\n }\n reviewRequests(first: 10) {\n totalCount\n nodes {\n requestedReviewer {\n ... on User { login }\n }\n }\n }\n reviews(last: 20) {\n totalCount\n nodes {\n author { login }\n state\n body\n submittedAt\n commit { oid }\n }\n }\n reviewThreads(first: 50) {\n totalCount\n nodes {\n isResolved\n isOutdated\n path\n comments(first: 10) {\n totalCount\n nodes {\n author { login }\n body\n }\n }\n }\n }\n comments(last: 20) {\n totalCount\n nodes {\n author { login }\n body\n createdAt\n }\n }\n closingIssuesReferences(first: 10) {\n totalCount\n nodes {\n number\n state\n }\n }\n }\n }\n }\n";
|
|
3
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/polling/queries.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,q9BA4C/B,CAAC;AAEF,eAAO,MAAM,0BAA0B,8qDA8EtC,CAAC"}
|