@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.
Files changed (76) hide show
  1. package/README.md +143 -0
  2. package/dist/api.d.ts +68 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +260 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/client.d.ts +10 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +10 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/codec.d.ts +9 -0
  11. package/dist/codec.d.ts.map +1 -0
  12. package/dist/codec.js +92 -0
  13. package/dist/codec.js.map +1 -0
  14. package/dist/config.d.ts +29 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +2 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/context.d.ts +8 -0
  19. package/dist/context.d.ts.map +1 -0
  20. package/dist/context.js +2 -0
  21. package/dist/context.js.map +1 -0
  22. package/dist/driver_config.d.ts +3 -0
  23. package/dist/driver_config.d.ts.map +1 -0
  24. package/dist/driver_config.js +36 -0
  25. package/dist/driver_config.js.map +1 -0
  26. package/dist/event.d.ts +14 -0
  27. package/dist/event.d.ts.map +1 -0
  28. package/dist/event.js +2 -0
  29. package/dist/event.js.map +1 -0
  30. package/dist/event_log_status.d.ts +4 -0
  31. package/dist/event_log_status.d.ts.map +1 -0
  32. package/dist/event_log_status.js +4 -0
  33. package/dist/event_log_status.js.map +1 -0
  34. package/dist/index.d.ts +18 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +18 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/listener.d.ts +15 -0
  39. package/dist/listener.d.ts.map +1 -0
  40. package/dist/listener.js +2 -0
  41. package/dist/listener.js.map +1 -0
  42. package/dist/metadata.d.ts +12 -0
  43. package/dist/metadata.d.ts.map +1 -0
  44. package/dist/metadata.js +12 -0
  45. package/dist/metadata.js.map +1 -0
  46. package/dist/oauth2.d.ts +20 -0
  47. package/dist/oauth2.d.ts.map +1 -0
  48. package/dist/oauth2.js +84 -0
  49. package/dist/oauth2.js.map +1 -0
  50. package/dist/retry.d.ts +20 -0
  51. package/dist/retry.d.ts.map +1 -0
  52. package/dist/retry.js +12 -0
  53. package/dist/retry.js.map +1 -0
  54. package/dist/scm_client_provider.d.ts +35 -0
  55. package/dist/scm_client_provider.d.ts.map +1 -0
  56. package/dist/scm_client_provider.js +131 -0
  57. package/dist/scm_client_provider.js.map +1 -0
  58. package/dist/scm_clients.d.ts +36 -0
  59. package/dist/scm_clients.d.ts.map +1 -0
  60. package/dist/scm_clients.js +129 -0
  61. package/dist/scm_clients.js.map +1 -0
  62. package/dist/subscriber.d.ts +8 -0
  63. package/dist/subscriber.d.ts.map +1 -0
  64. package/dist/subscriber.js +185 -0
  65. package/dist/subscriber.js.map +1 -0
  66. package/dist/types.d.ts +8 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/worker.d.ts +112 -0
  71. package/dist/worker.d.ts.map +1 -0
  72. package/dist/worker.js +726 -0
  73. package/dist/worker.js.map +1 -0
  74. package/gen/cloud/v1/githooks_pb.d.ts +2661 -0
  75. package/gen/cloud/v1/githooks_pb.js +921 -0
  76. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -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,10 @@
1
+ export function clientProviderFunc(fn) {
2
+ return {
3
+ client: fn,
4
+ Client: fn,
5
+ };
6
+ }
7
+ export function ClientProviderFunc(fn) {
8
+ return clientProviderFunc(fn);
9
+ }
10
+ //# sourceMappingURL=client.js.map
@@ -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"}
@@ -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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"}
@@ -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"}