@relaymesh/githook 0.0.7
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/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# TypeScript Worker SDK
|
|
2
|
+
|
|
3
|
+
This SDK consumes githook events from Relaybus and decodes the protobuf
|
|
4
|
+
`EventPayload` into a usable `Event` object.
|
|
5
|
+
|
|
6
|
+
Supported drivers: amqp, kafka, nats.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install @relaymesh/githook
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Install the Relaybus adapter(s) you plan to use:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npm install @relaymesh/relaybus-amqp
|
|
18
|
+
npm install @relaymesh/relaybus-kafka
|
|
19
|
+
npm install @relaymesh/relaybus-nats
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Githook Worker Example (rule-id only)
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import * as worker from "@relaymesh/githook";
|
|
26
|
+
|
|
27
|
+
async function main() {
|
|
28
|
+
const wk = worker.New(
|
|
29
|
+
worker.WithEndpoint("http://localhost:8080"),
|
|
30
|
+
);
|
|
31
|
+
wk.HandleRule("rule-id", (ctx, event) => {
|
|
32
|
+
console.log(ctx.tenantId, event.provider, event.type, event.topic);
|
|
33
|
+
console.log(event.payload.toString("utf8"));
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
await wk.Run();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
main().catch(console.error);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Go-style example
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import * as worker from "@relaymesh/githook";
|
|
46
|
+
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
process.on("SIGINT", () => controller.abort());
|
|
49
|
+
process.on("SIGTERM", () => controller.abort());
|
|
50
|
+
|
|
51
|
+
const wk = worker.New(
|
|
52
|
+
worker.WithEndpoint("https://githook-app.vercel.app/api/connect"),
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
wk.HandleRule("85101e9f-3bcf-4ed0-b561-750c270ef6c3", (ctx, evt) => {
|
|
56
|
+
if (!evt) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
console.log(
|
|
60
|
+
`topic=${evt.topic} provider=${evt.provider} type=${evt.type} installation=${evt.metadata["installation_id"]}`,
|
|
61
|
+
);
|
|
62
|
+
if (evt.payload.length > 0) {
|
|
63
|
+
console.log(`payload bytes=${evt.payload.length}`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await wk.Run(controller.signal);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## API-driven drivers
|
|
71
|
+
|
|
72
|
+
Rule handlers are the recommended way to subscribe. If you need to bind handlers
|
|
73
|
+
to explicit topics or driver IDs, you can still do so.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import * as worker from "@relaymesh/githook";
|
|
77
|
+
|
|
78
|
+
async function main() {
|
|
79
|
+
const subscriber = worker.buildSubscriber({
|
|
80
|
+
driver: "amqp",
|
|
81
|
+
amqp: { url: "amqp://guest:guest@localhost:5672/" },
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const wk = worker.New(
|
|
85
|
+
worker.WithSubscriber(subscriber),
|
|
86
|
+
worker.WithEndpoint("http://localhost:8080"),
|
|
87
|
+
worker.WithAPIKey(process.env.GITHOOK_API_KEY ?? ""),
|
|
88
|
+
worker.WithTopics("pr.opened.ready"),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
wk.HandleTopic("pr.opened.ready", "driver-id", (ctx, event) => {
|
|
92
|
+
console.log(ctx.requestId, event.topic);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
await wk.Run();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
main().catch(console.error);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Rule handlers
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
const wk = worker.New();
|
|
105
|
+
|
|
106
|
+
wk.HandleRule("rule-id", (ctx, event) => {
|
|
107
|
+
console.log(event.topic, event.provider);
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## OAuth2 for API calls
|
|
112
|
+
|
|
113
|
+
If you use OAuth2 instead of API keys for control-plane calls:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
const wk = worker.New(
|
|
117
|
+
worker.WithEndpoint("http://localhost:8080"),
|
|
118
|
+
worker.WithOAuth2Config({
|
|
119
|
+
enabled: true,
|
|
120
|
+
clientId: process.env.GITHOOK_OAUTH2_CLIENT_ID ?? "",
|
|
121
|
+
clientSecret: process.env.GITHOOK_OAUTH2_CLIENT_SECRET ?? "",
|
|
122
|
+
tokenUrl: process.env.GITHOOK_OAUTH2_TOKEN_URL ?? "",
|
|
123
|
+
scopes: ["githook.read", "githook.write"],
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Server-resolved SCM clients
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const wk = worker.New(
|
|
132
|
+
worker.WithEndpoint("http://localhost:8080"),
|
|
133
|
+
worker.WithClientProvider(worker.NewRemoteSCMClientProvider()),
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
wk.HandleRule("rule-id", async (_ctx, evt) => {
|
|
137
|
+
const gh = worker.GitHubClient(evt);
|
|
138
|
+
if (gh) {
|
|
139
|
+
const repo = await gh.requestJSON("GET", "/repos/org/repo");
|
|
140
|
+
console.log(repo);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
```
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { WorkerContext } from "./context.js";
|
|
2
|
+
import type { OAuth2Config } from "./oauth2.js";
|
|
3
|
+
export interface RuleRecord {
|
|
4
|
+
id: string;
|
|
5
|
+
when: string;
|
|
6
|
+
emit: string[];
|
|
7
|
+
driverId: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DriverRecord {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
configJson: string;
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface APIClientOptions {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
oauth2Config?: OAuth2Config;
|
|
19
|
+
tenantId?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class RulesClient {
|
|
22
|
+
private readonly opts;
|
|
23
|
+
constructor(opts: APIClientOptions);
|
|
24
|
+
listRules(ctx?: WorkerContext): Promise<RuleRecord[]>;
|
|
25
|
+
getRule(id: string, ctx?: WorkerContext): Promise<RuleRecord>;
|
|
26
|
+
}
|
|
27
|
+
export declare class DriversClient {
|
|
28
|
+
private readonly opts;
|
|
29
|
+
constructor(opts: APIClientOptions);
|
|
30
|
+
listDrivers(ctx?: WorkerContext): Promise<DriverRecord[]>;
|
|
31
|
+
getDriverById(id: string, ctx?: WorkerContext): Promise<DriverRecord | undefined>;
|
|
32
|
+
}
|
|
33
|
+
export declare class EventLogsClient {
|
|
34
|
+
private readonly opts;
|
|
35
|
+
constructor(opts: APIClientOptions);
|
|
36
|
+
updateStatus(logId: string, status: string, errorMessage?: string, ctx?: WorkerContext): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export interface InstallationRecord {
|
|
39
|
+
provider: string;
|
|
40
|
+
accountId: string;
|
|
41
|
+
accountName: string;
|
|
42
|
+
installationId: string;
|
|
43
|
+
providerInstanceKey: string;
|
|
44
|
+
enterpriseId?: string;
|
|
45
|
+
enterpriseSlug?: string;
|
|
46
|
+
enterpriseName?: string;
|
|
47
|
+
accessToken?: string;
|
|
48
|
+
refreshToken?: string;
|
|
49
|
+
expiresAt?: Date;
|
|
50
|
+
}
|
|
51
|
+
export declare class InstallationsClient {
|
|
52
|
+
private readonly opts;
|
|
53
|
+
constructor(opts: APIClientOptions);
|
|
54
|
+
getByInstallationId(provider: string, installationId: string, ctx?: WorkerContext): Promise<InstallationRecord | undefined>;
|
|
55
|
+
}
|
|
56
|
+
export interface SCMClientRecord {
|
|
57
|
+
provider: string;
|
|
58
|
+
apiBaseUrl: string;
|
|
59
|
+
accessToken: string;
|
|
60
|
+
providerInstanceKey: string;
|
|
61
|
+
expiresAt?: Date;
|
|
62
|
+
}
|
|
63
|
+
export declare class SCMClientsClient {
|
|
64
|
+
private readonly opts;
|
|
65
|
+
constructor(opts: APIClientOptions);
|
|
66
|
+
getSCMClient(provider: string, installationId: string, providerInstanceKey?: string, ctx?: WorkerContext): Promise<SCMClientRecord>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { oauth2TokenFromConfig } from "./oauth2.js";
|
|
2
|
+
export class RulesClient {
|
|
3
|
+
constructor(opts) {
|
|
4
|
+
this.opts = opts;
|
|
5
|
+
}
|
|
6
|
+
async listRules(ctx) {
|
|
7
|
+
const payload = await postJSON(this.opts, "/cloud.v1.RulesService/ListRules", {}, ctx);
|
|
8
|
+
const rawRules = readArray(payload, "rules");
|
|
9
|
+
return rawRules.map((record) => ({
|
|
10
|
+
id: readString(record, "id"),
|
|
11
|
+
when: readString(record, "when"),
|
|
12
|
+
emit: readStringArray(record, "emit"),
|
|
13
|
+
driverId: readString(record, "driver_id", "driverId"),
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
async getRule(id, ctx) {
|
|
17
|
+
const trimmed = (id ?? "").trim();
|
|
18
|
+
if (!trimmed) {
|
|
19
|
+
throw new Error("rule id is required");
|
|
20
|
+
}
|
|
21
|
+
const payload = await postJSON(this.opts, "/cloud.v1.RulesService/GetRule", { id: trimmed }, ctx);
|
|
22
|
+
const record = readObject(payload, "rule");
|
|
23
|
+
if (!record) {
|
|
24
|
+
throw new Error(`rule not found: ${trimmed}`);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
id: readString(record, "id"),
|
|
28
|
+
when: readString(record, "when"),
|
|
29
|
+
emit: readStringArray(record, "emit"),
|
|
30
|
+
driverId: readString(record, "driver_id", "driverId"),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class DriversClient {
|
|
35
|
+
constructor(opts) {
|
|
36
|
+
this.opts = opts;
|
|
37
|
+
}
|
|
38
|
+
async listDrivers(ctx) {
|
|
39
|
+
const payload = await postJSON(this.opts, "/cloud.v1.DriversService/ListDrivers", {}, ctx);
|
|
40
|
+
const rawDrivers = readArray(payload, "drivers");
|
|
41
|
+
return rawDrivers.map((record) => normalizeDriver(record));
|
|
42
|
+
}
|
|
43
|
+
async getDriverById(id, ctx) {
|
|
44
|
+
const trimmed = (id ?? "").trim();
|
|
45
|
+
if (!trimmed) {
|
|
46
|
+
throw new Error("driver id is required");
|
|
47
|
+
}
|
|
48
|
+
const drivers = await this.listDrivers(ctx);
|
|
49
|
+
return drivers.find((record) => record.id === trimmed);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class EventLogsClient {
|
|
53
|
+
constructor(opts) {
|
|
54
|
+
this.opts = opts;
|
|
55
|
+
}
|
|
56
|
+
async updateStatus(logId, status, errorMessage, ctx) {
|
|
57
|
+
const trimmed = (logId ?? "").trim();
|
|
58
|
+
if (!trimmed) {
|
|
59
|
+
throw new Error("log id is required");
|
|
60
|
+
}
|
|
61
|
+
const statusVal = (status ?? "").trim();
|
|
62
|
+
if (!statusVal) {
|
|
63
|
+
throw new Error("status is required");
|
|
64
|
+
}
|
|
65
|
+
await postJSON(this.opts, "/cloud.v1.EventLogsService/UpdateEventLogStatus", {
|
|
66
|
+
log_id: trimmed,
|
|
67
|
+
status: statusVal,
|
|
68
|
+
error_message: (errorMessage ?? "").trim(),
|
|
69
|
+
}, ctx);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export class InstallationsClient {
|
|
73
|
+
constructor(opts) {
|
|
74
|
+
this.opts = opts;
|
|
75
|
+
}
|
|
76
|
+
async getByInstallationId(provider, installationId, ctx) {
|
|
77
|
+
const trimmedProvider = (provider ?? "").trim();
|
|
78
|
+
const trimmedID = (installationId ?? "").trim();
|
|
79
|
+
if (!trimmedProvider) {
|
|
80
|
+
throw new Error("provider is required");
|
|
81
|
+
}
|
|
82
|
+
if (!trimmedID) {
|
|
83
|
+
throw new Error("installation_id is required");
|
|
84
|
+
}
|
|
85
|
+
const payload = await postJSON(this.opts, "/cloud.v1.InstallationsService/GetInstallationByID", { provider: trimmedProvider, installation_id: trimmedID }, ctx);
|
|
86
|
+
const record = readObject(payload, "installation");
|
|
87
|
+
if (!record) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
return normalizeInstallation(record);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export class SCMClientsClient {
|
|
94
|
+
constructor(opts) {
|
|
95
|
+
this.opts = opts;
|
|
96
|
+
}
|
|
97
|
+
async getSCMClient(provider, installationId, providerInstanceKey, ctx) {
|
|
98
|
+
const trimmedProvider = (provider ?? "").trim();
|
|
99
|
+
const trimmedID = (installationId ?? "").trim();
|
|
100
|
+
if (!trimmedProvider) {
|
|
101
|
+
throw new Error("provider is required");
|
|
102
|
+
}
|
|
103
|
+
if (!trimmedID) {
|
|
104
|
+
throw new Error("installation_id is required");
|
|
105
|
+
}
|
|
106
|
+
const payload = await postJSON(this.opts, "/cloud.v1.SCMService/GetSCMClient", {
|
|
107
|
+
provider: trimmedProvider,
|
|
108
|
+
installation_id: trimmedID,
|
|
109
|
+
provider_instance_key: (providerInstanceKey ?? "").trim(),
|
|
110
|
+
}, ctx);
|
|
111
|
+
const record = readObject(payload, "client");
|
|
112
|
+
if (!record) {
|
|
113
|
+
throw new Error("scm client missing in response");
|
|
114
|
+
}
|
|
115
|
+
return normalizeSCMClient(record);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function normalizeDriver(record) {
|
|
119
|
+
return {
|
|
120
|
+
id: readString(record, "id"),
|
|
121
|
+
name: readString(record, "name"),
|
|
122
|
+
configJson: readString(record, "config_json", "configJson"),
|
|
123
|
+
enabled: readBool(record, "enabled"),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function postJSON(opts, path, body, ctx) {
|
|
127
|
+
const baseUrl = normalizeBaseUrl(opts.baseUrl);
|
|
128
|
+
if (!baseUrl) {
|
|
129
|
+
throw new Error("base url is required");
|
|
130
|
+
}
|
|
131
|
+
const url = `${baseUrl}${path}`;
|
|
132
|
+
const headers = {
|
|
133
|
+
"Content-Type": "application/json",
|
|
134
|
+
};
|
|
135
|
+
await applyAuthHeaders(headers, opts, ctx);
|
|
136
|
+
const tenantId = (ctx?.tenantId ?? opts.tenantId ?? "").trim();
|
|
137
|
+
if (tenantId) {
|
|
138
|
+
headers["X-Tenant-ID"] = tenantId;
|
|
139
|
+
}
|
|
140
|
+
const resp = await fetch(url, {
|
|
141
|
+
method: "POST",
|
|
142
|
+
headers,
|
|
143
|
+
body: JSON.stringify(body ?? {}),
|
|
144
|
+
signal: ctx?.signal,
|
|
145
|
+
});
|
|
146
|
+
if (!resp.ok) {
|
|
147
|
+
const text = await resp.text().catch(() => "");
|
|
148
|
+
throw new Error(`request failed (${resp.status}): ${text}`);
|
|
149
|
+
}
|
|
150
|
+
const text = await resp.text();
|
|
151
|
+
if (!text) {
|
|
152
|
+
return {};
|
|
153
|
+
}
|
|
154
|
+
return JSON.parse(text);
|
|
155
|
+
}
|
|
156
|
+
async function applyAuthHeaders(headers, opts, ctx) {
|
|
157
|
+
const apiKey = (opts.apiKey ?? "").trim();
|
|
158
|
+
if (apiKey) {
|
|
159
|
+
headers["x-api-key"] = apiKey;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const token = await oauth2TokenFromConfig(ctx, opts.oauth2Config);
|
|
164
|
+
if (token) {
|
|
165
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function normalizeBaseUrl(baseUrl) {
|
|
173
|
+
return (baseUrl ?? "").trim().replace(/\/+$/, "");
|
|
174
|
+
}
|
|
175
|
+
function readArray(payload, key) {
|
|
176
|
+
if (!payload) {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
const value = payload[key];
|
|
180
|
+
if (!Array.isArray(value)) {
|
|
181
|
+
return [];
|
|
182
|
+
}
|
|
183
|
+
return value.filter((entry) => entry && typeof entry === "object");
|
|
184
|
+
}
|
|
185
|
+
function readObject(payload, key) {
|
|
186
|
+
if (!payload) {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
const value = payload[key];
|
|
190
|
+
if (value && typeof value === "object") {
|
|
191
|
+
return value;
|
|
192
|
+
}
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
function readString(record, ...keys) {
|
|
196
|
+
for (const key of keys) {
|
|
197
|
+
const value = record[key];
|
|
198
|
+
if (typeof value === "string") {
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return "";
|
|
203
|
+
}
|
|
204
|
+
function readBool(record, key) {
|
|
205
|
+
const value = record[key];
|
|
206
|
+
if (typeof value === "boolean") {
|
|
207
|
+
return value;
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
function readStringArray(record, key) {
|
|
212
|
+
const value = record[key];
|
|
213
|
+
if (!Array.isArray(value)) {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
return value.filter((entry) => typeof entry === "string");
|
|
217
|
+
}
|
|
218
|
+
function normalizeInstallation(record) {
|
|
219
|
+
return {
|
|
220
|
+
provider: readString(record, "provider"),
|
|
221
|
+
accountId: readString(record, "account_id", "accountId"),
|
|
222
|
+
accountName: readString(record, "account_name", "accountName"),
|
|
223
|
+
installationId: readString(record, "installation_id", "installationId"),
|
|
224
|
+
providerInstanceKey: readString(record, "provider_instance_key", "providerInstanceKey"),
|
|
225
|
+
enterpriseId: readString(record, "enterprise_id", "enterpriseId"),
|
|
226
|
+
enterpriseSlug: readString(record, "enterprise_slug", "enterpriseSlug"),
|
|
227
|
+
enterpriseName: readString(record, "enterprise_name", "enterpriseName"),
|
|
228
|
+
accessToken: readString(record, "access_token", "accessToken"),
|
|
229
|
+
refreshToken: readString(record, "refresh_token", "refreshToken"),
|
|
230
|
+
expiresAt: parseDate(record, "expires_at", "expiresAt"),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function normalizeSCMClient(record) {
|
|
234
|
+
return {
|
|
235
|
+
provider: readString(record, "provider"),
|
|
236
|
+
apiBaseUrl: readString(record, "api_base_url", "apiBaseUrl"),
|
|
237
|
+
accessToken: readString(record, "access_token", "accessToken"),
|
|
238
|
+
providerInstanceKey: readString(record, "provider_instance_key", "providerInstanceKey"),
|
|
239
|
+
expiresAt: parseDate(record, "expires_at", "expiresAt"),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function parseDate(record, ...keys) {
|
|
243
|
+
for (const key of keys) {
|
|
244
|
+
const value = record[key];
|
|
245
|
+
if (typeof value === "string" && value) {
|
|
246
|
+
const date = new Date(value);
|
|
247
|
+
if (!Number.isNaN(date.getTime())) {
|
|
248
|
+
return date;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (value && typeof value === "object" && "seconds" in value) {
|
|
252
|
+
const seconds = Number(value.seconds);
|
|
253
|
+
if (!Number.isNaN(seconds)) {
|
|
254
|
+
return new Date(seconds * 1000);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAyBpD,MAAM,OAAO,WAAW;IACtB,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,SAAS,CAAC,GAAmB;QACjC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,IAAI,EACT,kCAAkC,EAClC,EAAE,EACF,GAAG,CACJ,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;YAC5B,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;YAChC,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;YACrC,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC;SACtD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,GAAmB;QAC3C,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,IAAI,EACT,gCAAgC,EAChC,EAAE,EAAE,EAAE,OAAO,EAAE,EACf,GAAG,CACJ,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;YACL,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;YAC5B,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;YAChC,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;YACrC,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC;SACtD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IACxB,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,GAAmB;QACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,IAAI,EACT,sCAAsC,EACtC,EAAE,EACF,GAAG,CACJ,CAAC;QACF,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU,EAAE,GAAmB;QACjD,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAC1B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,MAAc,EAAE,YAAqB,EAAE,GAAmB;QAC1F,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,QAAQ,CACZ,IAAI,CAAC,IAAI,EACT,iDAAiD,EACjD;YACE,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SAC3C,EACD,GAAG,CACJ,CAAC;IACJ,CAAC;CACF;AAgBD,MAAM,OAAO,mBAAmB;IAC9B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,mBAAmB,CACvB,QAAgB,EAChB,cAAsB,EACtB,GAAmB;QAEnB,MAAM,eAAe,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,IAAI,EACT,oDAAoD,EACpD,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,EACzD,GAAG,CACJ,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;CACF;AAUD,MAAM,OAAO,gBAAgB;IAC3B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,cAAsB,EACtB,mBAA4B,EAC5B,GAAmB;QAEnB,MAAM,eAAe,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,IAAI,EACT,mCAAmC,EACnC;YACE,QAAQ,EAAE,eAAe;YACzB,eAAe,EAAE,SAAS;YAC1B,qBAAqB,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SAC1D,EACD,GAAG,CACJ,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACF;AAED,SAAS,eAAe,CAAC,MAA+B;IACtD,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5B,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;QAChC,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC;QAC3D,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,IAAsB,EACtB,IAAY,EACZ,IAA6B,EAC7B,GAAmB;IAEnB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;IACpC,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,EAAE,MAAM;KACpB,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAA+B,EAC/B,IAAsB,EACtB,GAAmB;IAEnB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,OAA4C,EAAE,GAAW;IAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAmC,CAAC;AACvG,CAAC;AAED,SAAS,UAAU,CAAC,OAA4C,EAAE,GAAW;IAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,KAAgC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,MAA+B,EAAE,GAAG,IAAc;IACpE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,MAA+B,EAAE,GAAW;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B,EAAE,GAAW;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAa,CAAC;AACxE,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA+B;IAC5D,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC;QACxC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC;QACxD,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;QAC9D,cAAc,EAAE,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;QACvE,mBAAmB,EAAE,UAAU,CAAC,MAAM,EAAE,uBAAuB,EAAE,qBAAqB,CAAC;QACvF,YAAY,EAAE,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC;QACjE,cAAc,EAAE,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;QACvE,cAAc,EAAE,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;QACvE,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;QAC9D,YAAY,EAAE,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC;QACjE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA+B;IACzD,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC;QACxC,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,CAAC;QAC5D,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;QAC9D,mBAAmB,EAAE,UAAU,CAAC,MAAM,EAAE,uBAAuB,EAAE,qBAAqB,CAAC;QACvF,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAA+B,EAAE,GAAG,IAAc;IACnE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,CAAE,KAAuC,CAAC,OAAO,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WorkerContext } from "./context.js";
|
|
2
|
+
import type { Event } from "./event.js";
|
|
3
|
+
export interface ClientProvider {
|
|
4
|
+
client?: (ctx: WorkerContext, evt: Event) => Promise<unknown> | unknown;
|
|
5
|
+
Client?: (ctx: WorkerContext, evt: Event) => Promise<unknown> | unknown;
|
|
6
|
+
}
|
|
7
|
+
export type ClientProviderFunc = (ctx: WorkerContext, evt: Event) => Promise<unknown> | unknown;
|
|
8
|
+
export declare function clientProviderFunc(fn: ClientProviderFunc): ClientProvider;
|
|
9
|
+
export declare function ClientProviderFunc(fn: ClientProviderFunc): ClientProvider;
|
|
10
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACxE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzE;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhG,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,GAAG,cAAc,CAKzE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,GAAG,cAAc,CAEzE"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,kBAAkB,CAAC,EAAsB;IACvD,OAAO;QACL,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAsB;IACvD,OAAO,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/codec.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Event } from "./event.js";
|
|
2
|
+
import type { RelaybusMessage } from "./types.js";
|
|
3
|
+
export interface Codec {
|
|
4
|
+
decode(topic: string | undefined, msg: RelaybusMessage): Event;
|
|
5
|
+
}
|
|
6
|
+
export declare class DefaultCodec implements Codec {
|
|
7
|
+
decode(topic: string | undefined, msg: RelaybusMessage): Event;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,KAAK;IACpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,KAAK,CAAC;CAChE;AAED,qBAAa,YAAa,YAAW,KAAK;IACxC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,KAAK;CA0D/D"}
|
package/dist/codec.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { EventPayload } from "../gen/cloud/v1/githooks_pb.js";
|
|
3
|
+
import { MetadataKeyEvent, MetadataKeyInstallationID, MetadataKeyLogID, MetadataKeyProvider, MetadataKeyRequestID, } from "./metadata.js";
|
|
4
|
+
export class DefaultCodec {
|
|
5
|
+
decode(topic, msg) {
|
|
6
|
+
if (!msg || !msg.payload) {
|
|
7
|
+
throw new Error("message payload is required");
|
|
8
|
+
}
|
|
9
|
+
const payloadBytes = toUint8Array(msg.payload);
|
|
10
|
+
let provider = "";
|
|
11
|
+
let eventName = "";
|
|
12
|
+
let rawPayload = Buffer.from(payloadBytes);
|
|
13
|
+
let normalized;
|
|
14
|
+
try {
|
|
15
|
+
const env = EventPayload.fromBinary(payloadBytes);
|
|
16
|
+
provider = env.provider ?? "";
|
|
17
|
+
eventName = env.name ?? "";
|
|
18
|
+
rawPayload = Buffer.from(env.payload ?? new Uint8Array());
|
|
19
|
+
normalized = parseJSONObject(rawPayload);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const legacy = parseJSONValue(payloadBytes);
|
|
23
|
+
if (legacy && typeof legacy === "object") {
|
|
24
|
+
if ("provider" in legacy && typeof legacy.provider === "string") {
|
|
25
|
+
provider = legacy.provider;
|
|
26
|
+
}
|
|
27
|
+
if ("name" in legacy && typeof legacy.name === "string") {
|
|
28
|
+
eventName = legacy.name;
|
|
29
|
+
}
|
|
30
|
+
if ("data" in legacy && legacy.data && typeof legacy.data === "object") {
|
|
31
|
+
normalized = legacy.data;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!normalized) {
|
|
35
|
+
normalized = parseJSONObject(rawPayload);
|
|
36
|
+
}
|
|
37
|
+
if (!normalized && err instanceof Error) {
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const metadata = { ...(msg.metadata ?? {}) };
|
|
42
|
+
if (!provider) {
|
|
43
|
+
provider = metadata[MetadataKeyProvider] ?? "";
|
|
44
|
+
}
|
|
45
|
+
if (!eventName) {
|
|
46
|
+
eventName = metadata[MetadataKeyEvent] ?? "";
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
provider,
|
|
50
|
+
type: eventName,
|
|
51
|
+
topic: resolveTopic(topic, msg),
|
|
52
|
+
metadata,
|
|
53
|
+
payload: rawPayload,
|
|
54
|
+
normalized,
|
|
55
|
+
requestId: metadata[MetadataKeyRequestID],
|
|
56
|
+
installationId: metadata[MetadataKeyInstallationID],
|
|
57
|
+
logId: metadata[MetadataKeyLogID],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function resolveTopic(topic, msg) {
|
|
62
|
+
const trimmed = (topic ?? "").trim();
|
|
63
|
+
if (trimmed) {
|
|
64
|
+
return trimmed;
|
|
65
|
+
}
|
|
66
|
+
return (msg.topic ?? "").toString();
|
|
67
|
+
}
|
|
68
|
+
function parseJSONObject(data) {
|
|
69
|
+
const value = parseJSONValue(data);
|
|
70
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
function parseJSONValue(data) {
|
|
76
|
+
if (!data || data.length === 0) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(Buffer.from(data).toString("utf8"));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function toUint8Array(input) {
|
|
87
|
+
if (input instanceof Uint8Array) {
|
|
88
|
+
return input;
|
|
89
|
+
}
|
|
90
|
+
return new Uint8Array(input);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type Driver = "amqp" | "kafka" | "nats";
|
|
2
|
+
export interface SubscriberConfig {
|
|
3
|
+
driver?: Driver;
|
|
4
|
+
drivers?: Driver[];
|
|
5
|
+
amqp?: AmqpConfig;
|
|
6
|
+
kafka?: KafkaConfig;
|
|
7
|
+
nats?: NatsConfig;
|
|
8
|
+
}
|
|
9
|
+
export interface AmqpConfig {
|
|
10
|
+
url: string;
|
|
11
|
+
exchange?: string;
|
|
12
|
+
routingKeyTemplate?: string;
|
|
13
|
+
queue?: string;
|
|
14
|
+
autoAck?: boolean;
|
|
15
|
+
maxMessages?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface KafkaConfig {
|
|
18
|
+
brokers?: string[];
|
|
19
|
+
broker?: string;
|
|
20
|
+
groupId?: string;
|
|
21
|
+
topicPrefix?: string;
|
|
22
|
+
maxMessages?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface NatsConfig {
|
|
25
|
+
url: string;
|
|
26
|
+
subjectPrefix?: string;
|
|
27
|
+
maxMessages?: number;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|