@@ -2,18 +2,22 @@ import assert from "node:assert";
2
2
import { createId } from "@paralleldrive/cuid2" ;
3
3
import type { KafkaProducer } from "./kafka.js" ;
4
4
5
+ /**
6
+ * The event schema for webhook events.
7
+ * See more: https://github.com/thirdweb-dev/api-server/blob/dev/docs/webhooks.md
8
+ */
5
9
interface WebhookEvent extends Record < string , unknown > {
6
- id ?: `evt_${string } `;
7
- teamId : string ;
8
- projectId ?: string ;
9
- /**
10
- * The timestamp your event was triggered at.
11
- */
12
- createdAt ?: Date ;
13
- /**
14
- * An array of your model ( defined in api-server). Must not be empty .
15
- */
16
- payload : Record < string , unknown > [ ] ;
10
+ id ?: `evt_${string } `;
11
+ teamId : string ;
12
+ projectId ?: string ;
13
+ /**
14
+ * The timestamp your event was triggered at.
15
+ */
16
+ createdAt ?: Date ;
17
+ /**
18
+ * Your model defined in api-server.
19
+ */
20
+ data : Record < string , unknown > ;
17
21
}
18
22
19
23
/**
@@ -27,39 +31,38 @@ interface WebhookEvent extends Record<string, unknown> {
27
31
* ```
28
32
*/
29
33
export class WebhookEventProducer {
30
- private kafkaProducer : KafkaProducer ;
34
+ private kafkaProducer : KafkaProducer ;
31
35
32
- constructor ( config : { kafkaProducer : KafkaProducer } ) {
33
- this . kafkaProducer = config . kafkaProducer ;
34
- }
36
+ constructor ( config : { kafkaProducer : KafkaProducer } ) {
37
+ this . kafkaProducer = config . kafkaProducer ;
38
+ }
35
39
36
- /**
37
- * Emit a webhook event.
38
- * This method may throw. To call this non-blocking:
39
- * ```ts
40
- * void webhookProducer.sendEvents(events).catch((e) => console.error(e))
41
- * ```
42
- */
43
- async sendEvents ( topic : string , events : WebhookEvent [ ] ) : Promise < void > {
44
- const parsedEvents : WebhookEvent [ ] = events . map ( ( event ) => {
45
- assert ( event . payload . length > 0 , "payload must not be empty" ) ;
46
- assert (
47
- event . teamId . startsWith ( "team_" ) ,
48
- "teamId must start with 'team_'" ,
49
- ) ;
50
- assert (
51
- ! event . projectId || event . projectId . startsWith ( "prj_" ) ,
52
- "projectId must start with 'prj_'" ,
53
- ) ;
40
+ /**
41
+ * Emit a webhook event.
42
+ * This method may throw. To call this non-blocking:
43
+ * ```ts
44
+ * void webhookProducer.sendEvents(events).catch((e) => console.error(e))
45
+ * ```
46
+ */
47
+ async sendEvents ( topic : string , events : WebhookEvent [ ] ) : Promise < void > {
48
+ const parsedEvents : WebhookEvent [ ] = events . map ( ( event ) => {
49
+ assert (
50
+ event . teamId . startsWith ( "team_" ) ,
51
+ "teamId must start with 'team_'" ,
52
+ ) ;
53
+ assert (
54
+ ! event . projectId || event . projectId . startsWith ( "prj_" ) ,
55
+ "projectId must start with 'prj_'" ,
56
+ ) ;
54
57
55
- return {
56
- ...event ,
57
- // Default to now.
58
- createdAt : event . createdAt ?? new Date ( ) ,
59
- // Default to a generated UUID.
60
- id : event . id ?? `evt_${ createId ( ) } ` ,
61
- } ;
62
- } ) ;
63
- await this . kafkaProducer . send ( topic , parsedEvents ) ;
64
- }
58
+ return {
59
+ ...event ,
60
+ // Default to now.
61
+ createdAt : event . createdAt ?? new Date ( ) ,
62
+ // Default to a generated UUID.
63
+ id : event . id ?? `evt_${ createId ( ) } ` ,
64
+ } ;
65
+ } ) ;
66
+ await this . kafkaProducer . send ( topic , parsedEvents ) ;
67
+ }
65
68
}
0 commit comments