@thirdweb-dev/service-utils 0.6.1-nightly-69b1ee9176a34211eb8877d97f06a602b676635d-20250123000320 → 0.7.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.
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendUsageV2Events = sendUsageV2Events;
4
+ /**
5
+ * Send events to Kafka.
6
+ * This method may throw. To call this non-blocking:
7
+ *
8
+ * ```ts
9
+ * void sendUsageV2Events(events, {
10
+ * environment: "production",
11
+ * serviceKey: "..."
12
+ * }).catch(console.error)
13
+ * ```
14
+ *
15
+ * @param events - The events to send.
16
+ * @param options.environment - The environment the service is running in.
17
+ * @param options.serviceKey - The service key required for authentication.
18
+ */
19
+ async function sendUsageV2Events(events, options) {
20
+ const baseUrl = options.environment === "production"
21
+ ? "https://u.thirdweb.com"
22
+ : "https://u.thirdweb-dev.com";
23
+ const resp = await fetch(`${baseUrl}/usage-v2/raw-events`, {
24
+ method: "POST",
25
+ headers: {
26
+ "Content-Type": "application/json",
27
+ "x-service-api-key": options.serviceKey,
28
+ },
29
+ body: JSON.stringify({ events }),
30
+ });
31
+ if (!resp.ok) {
32
+ throw new Error(`[UsageV2] unexpected response ${resp.status}: ${await resp.text()}`);
33
+ }
34
+ resp.body?.cancel();
35
+ }
36
+ //# sourceMappingURL=usageV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.js","sourceRoot":"","sources":["../../../src/cf-worker/usageV2.ts"],"names":[],"mappings":";;AAiBA,8CA2BC;AA1CD;;;;;;;;;;;;;;GAcG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAAsB,EACtB,OAGC;IAED,MAAM,OAAO,GACX,OAAO,CAAC,WAAW,KAAK,YAAY;QAClC,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,4BAA4B,CAAC;IAEnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;QACzD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,mBAAmB,EAAE,OAAO,CAAC,UAAU;SACxC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=usageV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.js","sourceRoot":"","sources":["../../../src/core/usageV2.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UsageV2Producer = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const node_tls_1 = require("node:tls");
6
+ const kafkajs_1 = require("kafkajs");
7
+ const TOPIC_USAGE_V2 = "usage_v2.raw_events";
8
+ /**
9
+ * Creates a UsageV2Producer which opens a persistent TCP connection.
10
+ * This class is thread-safe so your service should re-use one instance.
11
+ *
12
+ * Example:
13
+ * ```ts
14
+ * usageV2 = new UsageV2Producer(..)
15
+ * await usageV2.init()
16
+ * await usageV2.sendEvents(events)
17
+ * // Non-blocking:
18
+ * // void usageV2.sendEvents(events).catch(console.error)
19
+ * ```
20
+ */
21
+ class UsageV2Producer {
22
+ constructor(config) {
23
+ Object.defineProperty(this, "kafka", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ Object.defineProperty(this, "producer", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: null
34
+ });
35
+ this.kafka = new kafkajs_1.Kafka({
36
+ clientId: `${config.producerName}-${config.environment}`,
37
+ brokers: config.environment === "production"
38
+ ? ["warpstream.thirdweb.xyz:9092"]
39
+ : ["warpstream-dev.thirdweb.xyz:9092"],
40
+ ssl: {
41
+ checkServerIdentity(hostname, cert) {
42
+ return (0, node_tls_1.checkServerIdentity)(hostname.toLowerCase(), cert);
43
+ },
44
+ },
45
+ sasl: {
46
+ mechanism: "plain",
47
+ username: config.username,
48
+ password: config.password,
49
+ },
50
+ });
51
+ }
52
+ /**
53
+ * Connect the producer.
54
+ * This must be called before calling `sendEvents()`.
55
+ */
56
+ async init() {
57
+ this.producer = this.kafka.producer({
58
+ allowAutoTopicCreation: false,
59
+ });
60
+ await this.producer.connect();
61
+ }
62
+ /**
63
+ * Send usageV2 events.
64
+ * This method may throw. To call this non-blocking:
65
+ *
66
+ * ```ts
67
+ * usageV2 = new UsageV2Producer(...)
68
+ * void usageV2.sendEvents(events).catch(console.error)
69
+ *
70
+ * @param events - The events to send.
71
+ */
72
+ async sendEvents(events) {
73
+ if (!this.producer) {
74
+ throw new Error("Producer not initialized. Call `init()` first.");
75
+ }
76
+ const parsedEvents = events.map((event) => {
77
+ return {
78
+ id: event.id ?? (0, node_crypto_1.randomUUID)(),
79
+ created_at: event.created_at ?? new Date(),
80
+ source: event.source,
81
+ action: event.action,
82
+ // Remove the "team_" prefix, if any.
83
+ team_id: event.team_id.startsWith("team_")
84
+ ? event.team_id.slice(5)
85
+ : event.team_id,
86
+ client_id: event.client_id,
87
+ sdk_name: event.sdk_name,
88
+ sdk_platform: event.sdk_platform,
89
+ sdk_version: event.sdk_version,
90
+ sdk_os: event.sdk_os,
91
+ product_name: event.product_name,
92
+ product_version: event.product_version,
93
+ data: JSON.stringify(event.data),
94
+ };
95
+ });
96
+ await this.producer.send({
97
+ topic: TOPIC_USAGE_V2,
98
+ messages: parsedEvents.map((event) => ({
99
+ value: JSON.stringify(event),
100
+ })),
101
+ });
102
+ }
103
+ /**
104
+ * Disconnects UsageV2Producer.
105
+ * Useful when shutting down the service to flush in-flight events.
106
+ */
107
+ async disconnect() {
108
+ if (this.producer) {
109
+ await this.producer.disconnect();
110
+ this.producer = null;
111
+ }
112
+ }
113
+ }
114
+ exports.UsageV2Producer = UsageV2Producer;
115
+ //# sourceMappingURL=usageV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.js","sourceRoot":"","sources":["../../../src/node/usageV2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Send events to Kafka.
3
+ * This method may throw. To call this non-blocking:
4
+ *
5
+ * ```ts
6
+ * void sendUsageV2Events(events, {
7
+ * environment: "production",
8
+ * serviceKey: "..."
9
+ * }).catch(console.error)
10
+ * ```
11
+ *
12
+ * @param events - The events to send.
13
+ * @param options.environment - The environment the service is running in.
14
+ * @param options.serviceKey - The service key required for authentication.
15
+ */
16
+ export async function sendUsageV2Events(events, options) {
17
+ const baseUrl = options.environment === "production"
18
+ ? "https://u.thirdweb.com"
19
+ : "https://u.thirdweb-dev.com";
20
+ const resp = await fetch(`${baseUrl}/usage-v2/raw-events`, {
21
+ method: "POST",
22
+ headers: {
23
+ "Content-Type": "application/json",
24
+ "x-service-api-key": options.serviceKey,
25
+ },
26
+ body: JSON.stringify({ events }),
27
+ });
28
+ if (!resp.ok) {
29
+ throw new Error(`[UsageV2] unexpected response ${resp.status}: ${await resp.text()}`);
30
+ }
31
+ resp.body?.cancel();
32
+ }
33
+ //# sourceMappingURL=usageV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.js","sourceRoot":"","sources":["../../../src/cf-worker/usageV2.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAsB,EACtB,OAGC;IAED,MAAM,OAAO,GACX,OAAO,CAAC,WAAW,KAAK,YAAY;QAClC,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,4BAA4B,CAAC;IAEnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;QACzD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,mBAAmB,EAAE,OAAO,CAAC,UAAU;SACxC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=usageV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.js","sourceRoot":"","sources":["../../../src/core/usageV2.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { checkServerIdentity } from "node:tls";
3
+ import { Kafka } from "kafkajs";
4
+ const TOPIC_USAGE_V2 = "usage_v2.raw_events";
5
+ /**
6
+ * Creates a UsageV2Producer which opens a persistent TCP connection.
7
+ * This class is thread-safe so your service should re-use one instance.
8
+ *
9
+ * Example:
10
+ * ```ts
11
+ * usageV2 = new UsageV2Producer(..)
12
+ * await usageV2.init()
13
+ * await usageV2.sendEvents(events)
14
+ * // Non-blocking:
15
+ * // void usageV2.sendEvents(events).catch(console.error)
16
+ * ```
17
+ */
18
+ export class UsageV2Producer {
19
+ constructor(config) {
20
+ Object.defineProperty(this, "kafka", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ Object.defineProperty(this, "producer", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: null
31
+ });
32
+ this.kafka = new Kafka({
33
+ clientId: `${config.producerName}-${config.environment}`,
34
+ brokers: config.environment === "production"
35
+ ? ["warpstream.thirdweb.xyz:9092"]
36
+ : ["warpstream-dev.thirdweb.xyz:9092"],
37
+ ssl: {
38
+ checkServerIdentity(hostname, cert) {
39
+ return checkServerIdentity(hostname.toLowerCase(), cert);
40
+ },
41
+ },
42
+ sasl: {
43
+ mechanism: "plain",
44
+ username: config.username,
45
+ password: config.password,
46
+ },
47
+ });
48
+ }
49
+ /**
50
+ * Connect the producer.
51
+ * This must be called before calling `sendEvents()`.
52
+ */
53
+ async init() {
54
+ this.producer = this.kafka.producer({
55
+ allowAutoTopicCreation: false,
56
+ });
57
+ await this.producer.connect();
58
+ }
59
+ /**
60
+ * Send usageV2 events.
61
+ * This method may throw. To call this non-blocking:
62
+ *
63
+ * ```ts
64
+ * usageV2 = new UsageV2Producer(...)
65
+ * void usageV2.sendEvents(events).catch(console.error)
66
+ *
67
+ * @param events - The events to send.
68
+ */
69
+ async sendEvents(events) {
70
+ if (!this.producer) {
71
+ throw new Error("Producer not initialized. Call `init()` first.");
72
+ }
73
+ const parsedEvents = events.map((event) => {
74
+ return {
75
+ id: event.id ?? randomUUID(),
76
+ created_at: event.created_at ?? new Date(),
77
+ source: event.source,
78
+ action: event.action,
79
+ // Remove the "team_" prefix, if any.
80
+ team_id: event.team_id.startsWith("team_")
81
+ ? event.team_id.slice(5)
82
+ : event.team_id,
83
+ client_id: event.client_id,
84
+ sdk_name: event.sdk_name,
85
+ sdk_platform: event.sdk_platform,
86
+ sdk_version: event.sdk_version,
87
+ sdk_os: event.sdk_os,
88
+ product_name: event.product_name,
89
+ product_version: event.product_version,
90
+ data: JSON.stringify(event.data),
91
+ };
92
+ });
93
+ await this.producer.send({
94
+ topic: TOPIC_USAGE_V2,
95
+ messages: parsedEvents.map((event) => ({
96
+ value: JSON.stringify(event),
97
+ })),
98
+ });
99
+ }
100
+ /**
101
+ * Disconnects UsageV2Producer.
102
+ * Useful when shutting down the service to flush in-flight events.
103
+ */
104
+ async disconnect() {
105
+ if (this.producer) {
106
+ await this.producer.disconnect();
107
+ this.producer = null;
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=usageV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.js","sourceRoot":"","sources":["../../../src/node/usageV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAiB,MAAM,SAAS,CAAC;AAG/C,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,eAAe;IAI1B,YAAY,MAYX;QAfO;;;;;WAAa;QACb;;;;mBAA4B,IAAI;WAAC;QAevC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC;YACrB,QAAQ,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE;YACxD,OAAO,EACL,MAAM,CAAC,WAAW,KAAK,YAAY;gBACjC,CAAC,CAAC,CAAC,8BAA8B,CAAC;gBAClC,CAAC,CAAC,CAAC,kCAAkC,CAAC;YAC1C,GAAG,EAAE;gBACH,mBAAmB,CAAC,QAAQ,EAAE,IAAI;oBAChC,OAAO,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC3D,CAAC;aACF;YACD,IAAI,EAAE;gBACJ,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClC,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CAAC,MAAsB;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACxC,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,UAAU,EAAE;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE;gBAC1C,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,qCAAqC;gBACrC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;oBACxC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBACxB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;aACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;aAC7B,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { UsageV2Event } from "../core/usageV2.js";
2
+ /**
3
+ * Send events to Kafka.
4
+ * This method may throw. To call this non-blocking:
5
+ *
6
+ * ```ts
7
+ * void sendUsageV2Events(events, {
8
+ * environment: "production",
9
+ * serviceKey: "..."
10
+ * }).catch(console.error)
11
+ * ```
12
+ *
13
+ * @param events - The events to send.
14
+ * @param options.environment - The environment the service is running in.
15
+ * @param options.serviceKey - The service key required for authentication.
16
+ */
17
+ export declare function sendUsageV2Events(events: UsageV2Event[], options: {
18
+ environment: "development" | "production";
19
+ serviceKey: string;
20
+ }): Promise<void>;
21
+ //# sourceMappingURL=usageV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/usageV2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,EAAE;IACP,WAAW,EAAE,aAAa,GAAG,YAAY,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -0,0 +1,57 @@
1
+ export interface UsageV2Event {
2
+ /**
3
+ * A unique identifier for the event. Defaults to a random UUID.
4
+ * Useful if your service retries sending events.
5
+ */
6
+ id?: `${string}-${string}-${string}-${string}-${string}`;
7
+ /**
8
+ * The event timestamp. Defaults to now().
9
+ */
10
+ created_at?: Date;
11
+ /**
12
+ * The source of the event. Example: "storage"
13
+ */
14
+ source: string;
15
+ /**
16
+ * The action of the event. Example: "upload"
17
+ */
18
+ action: string;
19
+ /**
20
+ * The team ID.
21
+ */
22
+ team_id: string;
23
+ /**
24
+ * The client ID, if available.
25
+ */
26
+ client_id?: string;
27
+ /**
28
+ * The SDK name, if available.
29
+ */
30
+ sdk_name?: string;
31
+ /**
32
+ * The SDK platform, if available.
33
+ */
34
+ sdk_platform?: string;
35
+ /**
36
+ * The SDK version, if available.
37
+ */
38
+ sdk_version?: string;
39
+ /**
40
+ * The SDK OS, if available.
41
+ */
42
+ sdk_os?: string;
43
+ /**
44
+ * The product name, if available.
45
+ */
46
+ product_name?: string;
47
+ /**
48
+ * The product version, if available.
49
+ */
50
+ product_version?: string;
51
+ /**
52
+ * An object of service-specific data. Example: "file_size_bytes"
53
+ * It is safe to pass any new JSON-serializable data here before updating the usageV2 schema.
54
+ */
55
+ data: Record<string, unknown>;
56
+ }
57
+ //# sourceMappingURL=usageV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.d.ts","sourceRoot":"","sources":["../../../src/core/usageV2.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,EAAE,CAAC,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IACzD;;OAEG;IACH,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B"}
@@ -0,0 +1,52 @@
1
+ import type { UsageV2Event } from "../core/usageV2.js";
2
+ /**
3
+ * Creates a UsageV2Producer which opens a persistent TCP connection.
4
+ * This class is thread-safe so your service should re-use one instance.
5
+ *
6
+ * Example:
7
+ * ```ts
8
+ * usageV2 = new UsageV2Producer(..)
9
+ * await usageV2.init()
10
+ * await usageV2.sendEvents(events)
11
+ * // Non-blocking:
12
+ * // void usageV2.sendEvents(events).catch(console.error)
13
+ * ```
14
+ */
15
+ export declare class UsageV2Producer {
16
+ private kafka;
17
+ private producer;
18
+ constructor(config: {
19
+ /**
20
+ * A descriptive name for your service. Example: "storage-server"
21
+ */
22
+ producerName: string;
23
+ /**
24
+ * The environment the service is running in.
25
+ */
26
+ environment: "development" | "production";
27
+ username: string;
28
+ password: string;
29
+ });
30
+ /**
31
+ * Connect the producer.
32
+ * This must be called before calling `sendEvents()`.
33
+ */
34
+ init(): Promise<void>;
35
+ /**
36
+ * Send usageV2 events.
37
+ * This method may throw. To call this non-blocking:
38
+ *
39
+ * ```ts
40
+ * usageV2 = new UsageV2Producer(...)
41
+ * void usageV2.sendEvents(events).catch(console.error)
42
+ *
43
+ * @param events - The events to send.
44
+ */
45
+ sendEvents(events: UsageV2Event[]): Promise<void>;
46
+ /**
47
+ * Disconnects UsageV2Producer.
48
+ * Useful when shutting down the service to flush in-flight events.
49
+ */
50
+ disconnect(): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=usageV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageV2.d.ts","sourceRoot":"","sources":["../../../src/node/usageV2.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE;QAClB;;WAEG;QACH,YAAY,EAAE,MAAM,CAAC;QACrB;;WAEG;QACH,WAAW,EAAE,aAAa,GAAG,YAAY,CAAC;QAE1C,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAoBD;;;OAGG;IACG,IAAI;IAOV;;;;;;;;;OASG;IACG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCvD;;;OAGG;IACG,UAAU;CAMjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thirdweb-dev/service-utils",
3
- "version": "0.6.1-nightly-69b1ee9176a34211eb8877d97f06a602b676635d-20250123000320",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -46,6 +46,7 @@
46
46
  "sideEffects": false,
47
47
  "dependencies": {
48
48
  "aws4fetch": "1.0.20",
49
+ "kafkajs": "2.2.4",
49
50
  "zod": "3.24.1"
50
51
  },
51
52
  "devDependencies": {