@relaymesh/githook 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/README.md +143 -0
- package/dist/api.d.ts +68 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +260 -0
- package/dist/api.js.map +1 -0
- package/dist/client.d.ts +10 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -0
- package/dist/codec.d.ts +9 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +92 -0
- package/dist/codec.js.map +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +8 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/driver_config.d.ts +3 -0
- package/dist/driver_config.d.ts.map +1 -0
- package/dist/driver_config.js +36 -0
- package/dist/driver_config.js.map +1 -0
- package/dist/event.d.ts +14 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +2 -0
- package/dist/event.js.map +1 -0
- package/dist/event_log_status.d.ts +4 -0
- package/dist/event_log_status.d.ts.map +1 -0
- package/dist/event_log_status.js +4 -0
- package/dist/event_log_status.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/listener.d.ts +15 -0
- package/dist/listener.d.ts.map +1 -0
- package/dist/listener.js +2 -0
- package/dist/listener.js.map +1 -0
- package/dist/metadata.d.ts +12 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +12 -0
- package/dist/metadata.js.map +1 -0
- package/dist/oauth2.d.ts +20 -0
- package/dist/oauth2.d.ts.map +1 -0
- package/dist/oauth2.js +84 -0
- package/dist/oauth2.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +12 -0
- package/dist/retry.js.map +1 -0
- package/dist/scm_client_provider.d.ts +35 -0
- package/dist/scm_client_provider.d.ts.map +1 -0
- package/dist/scm_client_provider.js +131 -0
- package/dist/scm_client_provider.js.map +1 -0
- package/dist/scm_clients.d.ts +36 -0
- package/dist/scm_clients.d.ts.map +1 -0
- package/dist/scm_clients.js +129 -0
- package/dist/scm_clients.js.map +1 -0
- package/dist/subscriber.d.ts +8 -0
- package/dist/subscriber.d.ts.map +1 -0
- package/dist/subscriber.js +185 -0
- package/dist/subscriber.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +112 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +726 -0
- package/dist/worker.js.map +1 -0
- package/gen/cloud/v1/githooks_pb.d.ts +2661 -0
- package/gen/cloud/v1/githooks_pb.js +921 -0
- package/package.json +29 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver_config.d.ts","sourceRoot":"","sources":["../src/driver_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAQxF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function subscriberConfigFromDriver(driver, raw) {
|
|
2
|
+
const normalized = (driver ?? "").trim().toLowerCase();
|
|
3
|
+
if (!normalized) {
|
|
4
|
+
throw new Error("driver is required");
|
|
5
|
+
}
|
|
6
|
+
const cfg = { driver: normalized };
|
|
7
|
+
applyDriverConfig(cfg, normalized, raw);
|
|
8
|
+
return cfg;
|
|
9
|
+
}
|
|
10
|
+
function applyDriverConfig(cfg, name, raw) {
|
|
11
|
+
const payload = parseJSON(raw);
|
|
12
|
+
if (!payload) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
switch (name) {
|
|
16
|
+
case "amqp":
|
|
17
|
+
cfg.amqp = payload;
|
|
18
|
+
return;
|
|
19
|
+
case "nats":
|
|
20
|
+
cfg.nats = payload;
|
|
21
|
+
return;
|
|
22
|
+
case "kafka":
|
|
23
|
+
cfg.kafka = payload;
|
|
24
|
+
return;
|
|
25
|
+
default:
|
|
26
|
+
throw new Error(`unsupported driver: ${name}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function parseJSON(raw) {
|
|
30
|
+
const trimmed = (raw ?? "").trim();
|
|
31
|
+
if (!trimmed) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
return JSON.parse(trimmed);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=driver_config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver_config.js","sourceRoot":"","sources":["../src/driver_config.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,GAAW;IACpE,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,GAAG,GAAqB,EAAE,MAAM,EAAE,UAAwC,EAAE,CAAC;IACnF,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAqB,EAAE,IAAY,EAAE,GAAW;IACzE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,GAAG,CAAC,IAAI,GAAG,OAAmC,CAAC;YAC/C,OAAO;QACT,KAAK,MAAM;YACT,GAAG,CAAC,IAAI,GAAG,OAAmC,CAAC;YAC/C,OAAO;QACT,KAAK,OAAO;YACV,GAAG,CAAC,KAAK,GAAG,OAAoC,CAAC;YACjD,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/event.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
export interface Event {
|
|
3
|
+
provider: string;
|
|
4
|
+
type: string;
|
|
5
|
+
topic: string;
|
|
6
|
+
metadata: Record<string, string>;
|
|
7
|
+
payload: Buffer;
|
|
8
|
+
normalized?: Record<string, unknown>;
|
|
9
|
+
requestId?: string;
|
|
10
|
+
installationId?: string;
|
|
11
|
+
logId?: string;
|
|
12
|
+
client?: unknown;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
package/dist/event.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event_log_status.d.ts","sourceRoot":"","sources":["../src/event_log_status.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,cAAc,CAAC;AACnD,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAC/C,eAAO,MAAM,oBAAoB,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event_log_status.js","sourceRoot":"","sources":["../src/event_log_status.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,WAAW,CAAC;AACnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from "./codec.js";
|
|
2
|
+
export * from "./api.js";
|
|
3
|
+
export * from "./client.js";
|
|
4
|
+
export * from "./config.js";
|
|
5
|
+
export * from "./context.js";
|
|
6
|
+
export * from "./driver_config.js";
|
|
7
|
+
export * from "./event.js";
|
|
8
|
+
export * from "./event_log_status.js";
|
|
9
|
+
export * from "./listener.js";
|
|
10
|
+
export * from "./metadata.js";
|
|
11
|
+
export * from "./oauth2.js";
|
|
12
|
+
export * from "./retry.js";
|
|
13
|
+
export * from "./subscriber.js";
|
|
14
|
+
export * from "./types.js";
|
|
15
|
+
export * from "./worker.js";
|
|
16
|
+
export { RemoteSCMClientProvider, NewRemoteSCMClientProvider, GitHubClient, GitLabClient, BitbucketClient, } from "./scm_client_provider.js";
|
|
17
|
+
export { GitHubClientFromEvent, GitLabClientFromEvent, BitbucketClientFromEvent, newProviderClient, GitHubClient as GitHubSCMClient, GitLabClient as GitLabSCMClient, BitbucketClient as BitbucketSCMClient, type SCMClient, } from "./scm_clients.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAE5B,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,YAAY,EACZ,YAAY,EACZ,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,IAAI,eAAe,EAC/B,YAAY,IAAI,eAAe,EAC/B,eAAe,IAAI,kBAAkB,EACrC,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from "./codec.js";
|
|
2
|
+
export * from "./api.js";
|
|
3
|
+
export * from "./client.js";
|
|
4
|
+
export * from "./config.js";
|
|
5
|
+
export * from "./context.js";
|
|
6
|
+
export * from "./driver_config.js";
|
|
7
|
+
export * from "./event.js";
|
|
8
|
+
export * from "./event_log_status.js";
|
|
9
|
+
export * from "./listener.js";
|
|
10
|
+
export * from "./metadata.js";
|
|
11
|
+
export * from "./oauth2.js";
|
|
12
|
+
export * from "./retry.js";
|
|
13
|
+
export * from "./subscriber.js";
|
|
14
|
+
export * from "./types.js";
|
|
15
|
+
export * from "./worker.js";
|
|
16
|
+
export { RemoteSCMClientProvider, NewRemoteSCMClientProvider, GitHubClient, GitLabClient, BitbucketClient, } from "./scm_client_provider.js";
|
|
17
|
+
export { GitHubClientFromEvent, GitLabClientFromEvent, BitbucketClientFromEvent, newProviderClient, GitHubClient as GitHubSCMClient, GitLabClient as GitLabSCMClient, BitbucketClient as BitbucketSCMClient, } from "./scm_clients.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAE5B,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,YAAY,EACZ,YAAY,EACZ,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,IAAI,eAAe,EAC/B,YAAY,IAAI,eAAe,EAC/B,eAAe,IAAI,kBAAkB,GAEtC,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WorkerContext } from "./context.js";
|
|
2
|
+
import type { Event } from "./event.js";
|
|
3
|
+
export interface Listener {
|
|
4
|
+
onStart?: (ctx: WorkerContext) => void;
|
|
5
|
+
onExit?: (ctx: WorkerContext) => void;
|
|
6
|
+
onMessageStart?: (ctx: WorkerContext, evt: Event) => void;
|
|
7
|
+
onMessageFinish?: (ctx: WorkerContext, evt: Event, err?: Error) => void;
|
|
8
|
+
onError?: (ctx: WorkerContext, evt: Event | undefined, err: Error) => void;
|
|
9
|
+
OnStart?: (ctx: WorkerContext) => void;
|
|
10
|
+
OnExit?: (ctx: WorkerContext) => void;
|
|
11
|
+
OnMessageStart?: (ctx: WorkerContext, evt: Event) => void;
|
|
12
|
+
OnMessageFinish?: (ctx: WorkerContext, evt: Event, err?: Error) => void;
|
|
13
|
+
OnError?: (ctx: WorkerContext, evt: Event | undefined, err: Error) => void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1D,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACxE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC3E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1D,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACxE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5E"}
|
package/dist/listener.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const MetadataKeyLogID = "log_id";
|
|
2
|
+
export declare const MetadataKeyProvider = "provider";
|
|
3
|
+
export declare const MetadataKeyEvent = "event";
|
|
4
|
+
export declare const MetadataKeyTopic = "topic";
|
|
5
|
+
export declare const MetadataKeyDriver = "driver";
|
|
6
|
+
export declare const MetadataKeyInstallationID = "installation_id";
|
|
7
|
+
export declare const MetadataKeyProviderInstanceKey = "provider_instance_key";
|
|
8
|
+
export declare const MetadataKeyRequestID = "request_id";
|
|
9
|
+
export declare const MetadataKeyJobID = "job_id";
|
|
10
|
+
export declare const MetadataKeyQueue = "queue";
|
|
11
|
+
export declare const MetadataKeyKind = "kind";
|
|
12
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAC1C,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AAC3D,eAAO,MAAM,8BAA8B,0BAA0B,CAAC;AACtE,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,eAAe,SAAS,CAAC"}
|
package/dist/metadata.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const MetadataKeyLogID = "log_id";
|
|
2
|
+
export const MetadataKeyProvider = "provider";
|
|
3
|
+
export const MetadataKeyEvent = "event";
|
|
4
|
+
export const MetadataKeyTopic = "topic";
|
|
5
|
+
export const MetadataKeyDriver = "driver";
|
|
6
|
+
export const MetadataKeyInstallationID = "installation_id";
|
|
7
|
+
export const MetadataKeyProviderInstanceKey = "provider_instance_key";
|
|
8
|
+
export const MetadataKeyRequestID = "request_id";
|
|
9
|
+
export const MetadataKeyJobID = "job_id";
|
|
10
|
+
export const MetadataKeyQueue = "queue";
|
|
11
|
+
export const MetadataKeyKind = "kind";
|
|
12
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAC3D,MAAM,CAAC,MAAM,8BAA8B,GAAG,uBAAuB,CAAC;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC"}
|
package/dist/oauth2.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WorkerContext } from "./context.js";
|
|
2
|
+
export interface OAuth2Config {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
issuer?: string;
|
|
5
|
+
audience?: string;
|
|
6
|
+
requiredScopes?: string[];
|
|
7
|
+
requiredRoles?: string[];
|
|
8
|
+
requiredGroups?: string[];
|
|
9
|
+
mode?: string;
|
|
10
|
+
clientId?: string;
|
|
11
|
+
clientSecret?: string;
|
|
12
|
+
scopes?: string[];
|
|
13
|
+
redirectUrl?: string;
|
|
14
|
+
authorizeUrl?: string;
|
|
15
|
+
tokenUrl?: string;
|
|
16
|
+
jwksUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function resolveOAuth2Config(explicit?: OAuth2Config): OAuth2Config | undefined;
|
|
19
|
+
export declare function oauth2TokenFromConfig(ctx: WorkerContext | undefined, cfg: OAuth2Config | undefined): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=oauth2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2.d.ts","sourceRoot":"","sources":["../src/oauth2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CAgBrF;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,aAAa,GAAG,SAAS,EAC9B,GAAG,EAAE,YAAY,GAAG,SAAS,GAC5B,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
|
package/dist/oauth2.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const tokenCache = new Map();
|
|
2
|
+
export function resolveOAuth2Config(explicit) {
|
|
3
|
+
if (explicit) {
|
|
4
|
+
return explicit;
|
|
5
|
+
}
|
|
6
|
+
const tokenUrl = envValue("GITHOOK_OAUTH2_TOKEN_URL");
|
|
7
|
+
if (!tokenUrl) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
enabled: true,
|
|
12
|
+
tokenUrl,
|
|
13
|
+
clientId: envValue("GITHOOK_OAUTH2_CLIENT_ID"),
|
|
14
|
+
clientSecret: envValue("GITHOOK_OAUTH2_CLIENT_SECRET"),
|
|
15
|
+
scopes: splitCSV(envValue("GITHOOK_OAUTH2_SCOPES")),
|
|
16
|
+
audience: envValue("GITHOOK_OAUTH2_AUDIENCE"),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function oauth2TokenFromConfig(ctx, cfg) {
|
|
20
|
+
if (!cfg || cfg.enabled === false) {
|
|
21
|
+
return "";
|
|
22
|
+
}
|
|
23
|
+
const tokenUrl = (cfg.tokenUrl ?? "").trim();
|
|
24
|
+
const clientId = (cfg.clientId ?? "").trim();
|
|
25
|
+
const clientSecret = (cfg.clientSecret ?? "").trim();
|
|
26
|
+
if (!tokenUrl || !clientId || !clientSecret) {
|
|
27
|
+
return "";
|
|
28
|
+
}
|
|
29
|
+
const cacheKey = buildCacheKey(cfg);
|
|
30
|
+
const cached = tokenCache.get(cacheKey);
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
if (cached && cached.token && cached.expiresAt > now + 30000) {
|
|
33
|
+
return cached.token;
|
|
34
|
+
}
|
|
35
|
+
const body = new URLSearchParams();
|
|
36
|
+
body.set("grant_type", "client_credentials");
|
|
37
|
+
body.set("client_id", clientId);
|
|
38
|
+
body.set("client_secret", clientSecret);
|
|
39
|
+
if (cfg.scopes && cfg.scopes.length > 0) {
|
|
40
|
+
body.set("scope", cfg.scopes.join(" "));
|
|
41
|
+
}
|
|
42
|
+
if (cfg.audience) {
|
|
43
|
+
body.set("audience", cfg.audience);
|
|
44
|
+
}
|
|
45
|
+
const resp = await fetch(tokenUrl, {
|
|
46
|
+
method: "POST",
|
|
47
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
48
|
+
body,
|
|
49
|
+
signal: ctx?.signal,
|
|
50
|
+
});
|
|
51
|
+
if (!resp.ok) {
|
|
52
|
+
const text = await resp.text().catch(() => "");
|
|
53
|
+
throw new Error(`oauth2 token failed (${resp.status}): ${text}`);
|
|
54
|
+
}
|
|
55
|
+
const payload = (await resp.json());
|
|
56
|
+
const token = (payload.access_token ?? "").trim();
|
|
57
|
+
if (!token) {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
const expiresIn = payload.expires_in ?? 1800;
|
|
61
|
+
tokenCache.set(cacheKey, {
|
|
62
|
+
token,
|
|
63
|
+
expiresAt: now + expiresIn * 1000,
|
|
64
|
+
});
|
|
65
|
+
return token;
|
|
66
|
+
}
|
|
67
|
+
function buildCacheKey(cfg) {
|
|
68
|
+
return [
|
|
69
|
+
(cfg.tokenUrl ?? "").trim(),
|
|
70
|
+
(cfg.clientId ?? "").trim(),
|
|
71
|
+
(cfg.scopes ?? []).join(" "),
|
|
72
|
+
(cfg.audience ?? "").trim(),
|
|
73
|
+
].join("|");
|
|
74
|
+
}
|
|
75
|
+
function envValue(key) {
|
|
76
|
+
return (process.env[key] ?? "").trim();
|
|
77
|
+
}
|
|
78
|
+
function splitCSV(value) {
|
|
79
|
+
return value
|
|
80
|
+
.split(",")
|
|
81
|
+
.map((entry) => entry.trim())
|
|
82
|
+
.filter((entry) => entry.length > 0);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=oauth2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2.js","sourceRoot":"","sources":["../src/oauth2.ts"],"names":[],"mappings":"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"}
|
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WorkerContext } from "./context.js";
|
|
2
|
+
import type { Event } from "./event.js";
|
|
3
|
+
export interface RetryDecision {
|
|
4
|
+
retry?: boolean;
|
|
5
|
+
nack?: boolean;
|
|
6
|
+
Retry?: boolean;
|
|
7
|
+
Nack?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface RetryPolicy {
|
|
10
|
+
onError?: (ctx: WorkerContext, evt: Event | undefined, err: Error) => RetryDecision;
|
|
11
|
+
OnError?: (ctx: WorkerContext, evt: Event | undefined, err: Error) => RetryDecision;
|
|
12
|
+
}
|
|
13
|
+
export declare class NoRetry implements RetryPolicy {
|
|
14
|
+
onError(_ctx: WorkerContext, _evt: Event | undefined, _err: Error): RetryDecision;
|
|
15
|
+
}
|
|
16
|
+
export declare function normalizeRetryDecision(decision: RetryDecision): {
|
|
17
|
+
retry: boolean;
|
|
18
|
+
nack: boolean;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,KAAK,aAAa,CAAC;IACpF,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,KAAK,aAAa,CAAC;CACrF;AAED,qBAAa,OAAQ,YAAW,WAAW;IACzC,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,aAAa;CAGlF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAKjG"}
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class NoRetry {
|
|
2
|
+
onError(_ctx, _evt, _err) {
|
|
3
|
+
return { retry: false, nack: true };
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export function normalizeRetryDecision(decision) {
|
|
7
|
+
return {
|
|
8
|
+
retry: Boolean(decision.retry ?? decision.Retry),
|
|
9
|
+
nack: Boolean(decision.nack ?? decision.Nack),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,OAAO;IAClB,OAAO,CAAC,IAAmB,EAAE,IAAuB,EAAE,IAAW;QAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAuB;IAC5D,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;QAChD,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { APIClientOptions } from "./api.js";
|
|
2
|
+
import type { ClientProvider } from "./client.js";
|
|
3
|
+
import type { Event } from "./event.js";
|
|
4
|
+
import type { WorkerContext } from "./context.js";
|
|
5
|
+
import type { OAuth2Config } from "./oauth2.js";
|
|
6
|
+
export interface RemoteSCMClientProviderOptions {
|
|
7
|
+
endpoint?: string;
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
oauth2Config?: OAuth2Config;
|
|
10
|
+
cacheSize?: number;
|
|
11
|
+
cacheSkewMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class RemoteSCMClientProvider implements ClientProvider {
|
|
14
|
+
private endpoint;
|
|
15
|
+
private apiKey;
|
|
16
|
+
private oauth2Config?;
|
|
17
|
+
private cache;
|
|
18
|
+
private cacheSkewMs;
|
|
19
|
+
constructor(opts?: RemoteSCMClientProviderOptions);
|
|
20
|
+
bindAPIClient(opts: APIClientOptions): void;
|
|
21
|
+
BindAPIClient(opts: APIClientOptions): void;
|
|
22
|
+
client(ctx: WorkerContext, evt: Event): Promise<unknown>;
|
|
23
|
+
Client(ctx: WorkerContext, evt: Event): Promise<unknown>;
|
|
24
|
+
}
|
|
25
|
+
export declare function NewRemoteSCMClientProvider(opts?: RemoteSCMClientProviderOptions): RemoteSCMClientProvider;
|
|
26
|
+
export declare function GitHubClient(evt: {
|
|
27
|
+
client?: unknown;
|
|
28
|
+
}): import("./scm_clients.js").GitHubClient | undefined;
|
|
29
|
+
export declare function GitLabClient(evt: {
|
|
30
|
+
client?: unknown;
|
|
31
|
+
}): import("./scm_clients.js").GitLabClient | undefined;
|
|
32
|
+
export declare function BitbucketClient(evt: {
|
|
33
|
+
client?: unknown;
|
|
34
|
+
}): import("./scm_clients.js").BitbucketClient | undefined;
|
|
35
|
+
//# sourceMappingURL=scm_client_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scm_client_provider.d.ts","sourceRoot":"","sources":["../src/scm_client_provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,GAAE,8BAAmC;IASrD,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAY3C,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAIrC,MAAM,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxD,MAAM,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;CAiC/D;AAED,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,8BAAmC,GAAG,uBAAuB,CAE7G;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,uDAErD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,uDAErD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,0DAExD"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { SCMClientsClient } from "./api.js";
|
|
2
|
+
import { MetadataKeyInstallationID, MetadataKeyProviderInstanceKey } from "./metadata.js";
|
|
3
|
+
import { newProviderClient, GitHubClientFromEvent, GitLabClientFromEvent, BitbucketClientFromEvent } from "./scm_clients.js";
|
|
4
|
+
import { resolveOAuth2Config } from "./oauth2.js";
|
|
5
|
+
const defaultCacheSize = 10;
|
|
6
|
+
const defaultCacheSkewMs = 30000;
|
|
7
|
+
export class RemoteSCMClientProvider {
|
|
8
|
+
constructor(opts = {}) {
|
|
9
|
+
this.endpoint = resolveEndpoint(opts.endpoint);
|
|
10
|
+
this.apiKey = (opts.apiKey ?? "").trim();
|
|
11
|
+
this.oauth2Config = resolveOAuth2Config(opts.oauth2Config);
|
|
12
|
+
const skew = opts.cacheSkewMs ?? defaultCacheSkewMs;
|
|
13
|
+
this.cacheSkewMs = skew < 0 ? 0 : skew;
|
|
14
|
+
this.cache = new SCMClientCache(opts.cacheSize ?? defaultCacheSize);
|
|
15
|
+
}
|
|
16
|
+
bindAPIClient(opts) {
|
|
17
|
+
if (opts.baseUrl) {
|
|
18
|
+
this.endpoint = resolveEndpoint(opts.baseUrl);
|
|
19
|
+
}
|
|
20
|
+
if (opts.apiKey) {
|
|
21
|
+
this.apiKey = opts.apiKey;
|
|
22
|
+
}
|
|
23
|
+
if (opts.oauth2Config) {
|
|
24
|
+
this.oauth2Config = opts.oauth2Config;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
BindAPIClient(opts) {
|
|
28
|
+
this.bindAPIClient(opts);
|
|
29
|
+
}
|
|
30
|
+
async client(ctx, evt) {
|
|
31
|
+
return this.Client(ctx, evt);
|
|
32
|
+
}
|
|
33
|
+
async Client(ctx, evt) {
|
|
34
|
+
if (!evt) {
|
|
35
|
+
throw new Error("event is required");
|
|
36
|
+
}
|
|
37
|
+
const provider = (evt.provider ?? "").trim();
|
|
38
|
+
if (!provider) {
|
|
39
|
+
throw new Error("provider is required");
|
|
40
|
+
}
|
|
41
|
+
const installationId = (evt.metadata?.[MetadataKeyInstallationID] ?? "").trim();
|
|
42
|
+
if (!installationId) {
|
|
43
|
+
throw new Error("installation_id missing from metadata");
|
|
44
|
+
}
|
|
45
|
+
const instanceKey = (evt.metadata?.[MetadataKeyProviderInstanceKey] ?? "").trim();
|
|
46
|
+
const cacheKey = [provider, installationId, instanceKey].join("|");
|
|
47
|
+
const cached = this.cache.get(cacheKey, this.cacheSkewMs);
|
|
48
|
+
if (cached) {
|
|
49
|
+
return cached;
|
|
50
|
+
}
|
|
51
|
+
const client = new SCMClientsClient({
|
|
52
|
+
baseUrl: this.endpoint,
|
|
53
|
+
apiKey: this.apiKey,
|
|
54
|
+
oauth2Config: this.oauth2Config,
|
|
55
|
+
tenantId: ctx.tenantId,
|
|
56
|
+
});
|
|
57
|
+
const record = await client.getSCMClient(provider, installationId, instanceKey, ctx);
|
|
58
|
+
if (!record.accessToken) {
|
|
59
|
+
throw new Error("scm access token missing");
|
|
60
|
+
}
|
|
61
|
+
const created = newProviderClient(record.provider, record.accessToken, record.apiBaseUrl);
|
|
62
|
+
this.cache.set(cacheKey, created, record.expiresAt);
|
|
63
|
+
return created;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function NewRemoteSCMClientProvider(opts = {}) {
|
|
67
|
+
return new RemoteSCMClientProvider(opts);
|
|
68
|
+
}
|
|
69
|
+
export function GitHubClient(evt) {
|
|
70
|
+
return GitHubClientFromEvent(evt);
|
|
71
|
+
}
|
|
72
|
+
export function GitLabClient(evt) {
|
|
73
|
+
return GitLabClientFromEvent(evt);
|
|
74
|
+
}
|
|
75
|
+
export function BitbucketClient(evt) {
|
|
76
|
+
return BitbucketClientFromEvent(evt);
|
|
77
|
+
}
|
|
78
|
+
class SCMClientCache {
|
|
79
|
+
constructor(maxSize) {
|
|
80
|
+
this.maxSize = maxSize;
|
|
81
|
+
this.store = new Map();
|
|
82
|
+
}
|
|
83
|
+
get(key, skewMs) {
|
|
84
|
+
const entry = this.store.get(key);
|
|
85
|
+
if (!entry) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
if (entry.expiresAt && entry.expiresAt.getTime() - skewMs <= Date.now()) {
|
|
89
|
+
this.store.delete(key);
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
this.store.delete(key);
|
|
93
|
+
this.store.set(key, entry);
|
|
94
|
+
return entry.client;
|
|
95
|
+
}
|
|
96
|
+
set(key, client, expiresAt) {
|
|
97
|
+
if (!client) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (this.store.has(key)) {
|
|
101
|
+
this.store.delete(key);
|
|
102
|
+
}
|
|
103
|
+
this.store.set(key, { client, expiresAt });
|
|
104
|
+
if (this.store.size <= Math.max(1, this.maxSize)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const oldestKey = this.store.keys().next().value;
|
|
108
|
+
if (oldestKey) {
|
|
109
|
+
this.store.delete(oldestKey);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function resolveEndpoint(explicit) {
|
|
114
|
+
const trimmed = (explicit ?? "").trim();
|
|
115
|
+
if (trimmed) {
|
|
116
|
+
return trimmed.replace(/\/+$/, "");
|
|
117
|
+
}
|
|
118
|
+
const envEndpoint = envValue("GITHOOK_ENDPOINT");
|
|
119
|
+
if (envEndpoint) {
|
|
120
|
+
return envEndpoint;
|
|
121
|
+
}
|
|
122
|
+
const envBase = envValue("GITHOOK_API_BASE_URL");
|
|
123
|
+
if (envBase) {
|
|
124
|
+
return envBase;
|
|
125
|
+
}
|
|
126
|
+
return "http://localhost:8080";
|
|
127
|
+
}
|
|
128
|
+
function envValue(key) {
|
|
129
|
+
return (process.env[key] ?? "").trim();
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=scm_client_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scm_client_provider.js","sourceRoot":"","sources":["../src/scm_client_provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface SCMClient {
|
|
2
|
+
request(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<Response>;
|
|
3
|
+
requestJSON<T = unknown>(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
|
|
4
|
+
}
|
|
5
|
+
export declare class GitHubClient implements SCMClient {
|
|
6
|
+
private readonly token;
|
|
7
|
+
private readonly baseUrl;
|
|
8
|
+
constructor(token: string, baseUrl: string);
|
|
9
|
+
request(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<Response>;
|
|
10
|
+
requestJSON<T>(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
|
|
11
|
+
}
|
|
12
|
+
export declare class GitLabClient implements SCMClient {
|
|
13
|
+
private readonly token;
|
|
14
|
+
private readonly baseUrl;
|
|
15
|
+
constructor(token: string, baseUrl: string);
|
|
16
|
+
request(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<Response>;
|
|
17
|
+
requestJSON<T>(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
|
|
18
|
+
}
|
|
19
|
+
export declare class BitbucketClient implements SCMClient {
|
|
20
|
+
private readonly token;
|
|
21
|
+
private readonly baseUrl;
|
|
22
|
+
constructor(token: string, baseUrl: string);
|
|
23
|
+
request(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<Response>;
|
|
24
|
+
requestJSON<T>(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
|
|
25
|
+
}
|
|
26
|
+
export declare function GitHubClientFromEvent(evt: {
|
|
27
|
+
client?: unknown;
|
|
28
|
+
}): GitHubClient | undefined;
|
|
29
|
+
export declare function GitLabClientFromEvent(evt: {
|
|
30
|
+
client?: unknown;
|
|
31
|
+
}): GitLabClient | undefined;
|
|
32
|
+
export declare function BitbucketClientFromEvent(evt: {
|
|
33
|
+
client?: unknown;
|
|
34
|
+
}): BitbucketClient | undefined;
|
|
35
|
+
export declare function newProviderClient(provider: string, token: string, baseUrl: string): SCMClient;
|
|
36
|
+
//# sourceMappingURL=scm_clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scm_clients.d.ts","sourceRoot":"","sources":["../src/scm_clients.ts"],"names":[],"mappings":"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"}
|