@openmeter/sdk 1.0.0-beta.13 → 1.0.0-beta.131

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 (86) hide show
  1. package/README.md +224 -46
  2. package/dist/cjs/clients/client.cjs +120 -0
  3. package/dist/cjs/clients/client.d.cts +37 -0
  4. package/dist/cjs/clients/client.js.map +1 -0
  5. package/dist/cjs/clients/entitlement.cjs +39 -0
  6. package/dist/cjs/clients/entitlement.d.cts +32 -0
  7. package/dist/cjs/clients/entitlement.js.map +1 -0
  8. package/dist/cjs/clients/event.cjs +71 -0
  9. package/dist/cjs/clients/event.d.cts +79 -0
  10. package/dist/cjs/clients/event.js.map +1 -0
  11. package/dist/cjs/clients/feature.cjs +80 -0
  12. package/dist/cjs/clients/feature.d.cts +46 -0
  13. package/dist/cjs/clients/feature.js.map +1 -0
  14. package/dist/cjs/clients/grant.cjs +41 -0
  15. package/dist/cjs/clients/grant.d.cts +24 -0
  16. package/dist/cjs/clients/grant.js.map +1 -0
  17. package/dist/cjs/clients/meter.cjs +83 -0
  18. package/dist/cjs/clients/meter.d.cts +79 -0
  19. package/dist/cjs/clients/meter.js.map +1 -0
  20. package/dist/cjs/clients/pagination.cjs +3 -0
  21. package/dist/cjs/clients/pagination.d.cts +6 -0
  22. package/dist/cjs/clients/pagination.js.map +1 -0
  23. package/dist/cjs/clients/portal.cjs +41 -0
  24. package/dist/cjs/clients/portal.d.cts +22 -0
  25. package/dist/cjs/clients/portal.js.map +1 -0
  26. package/dist/cjs/clients/subject.cjs +242 -0
  27. package/dist/cjs/clients/subject.d.cts +125 -0
  28. package/dist/cjs/clients/subject.js.map +1 -0
  29. package/dist/cjs/index.cjs +33 -0
  30. package/dist/cjs/index.d.cts +21 -0
  31. package/dist/cjs/index.js.map +1 -0
  32. package/dist/cjs/schemas/openapi.cjs +7 -0
  33. package/dist/cjs/schemas/openapi.d.cts +3032 -0
  34. package/dist/cjs/schemas/openapi.js.map +1 -0
  35. package/dist/cjs/test/agent.cjs +485 -0
  36. package/dist/cjs/test/agent.d.cts +2 -0
  37. package/dist/cjs/test/agent.js.map +1 -0
  38. package/dist/cjs/test/mocks.cjs +153 -0
  39. package/dist/cjs/test/mocks.d.cts +25 -0
  40. package/dist/cjs/test/mocks.js.map +1 -0
  41. package/dist/cjs/tsconfig.229eb452.tsbuildinfo +1 -0
  42. package/dist/cjs/tsconfig.b2052a4e.tsbuildinfo +1 -0
  43. package/dist/clients/client.d.ts +1 -4
  44. package/dist/clients/client.js +12 -1
  45. package/dist/clients/client.js.map +1 -0
  46. package/dist/clients/entitlement.d.ts +32 -0
  47. package/dist/clients/entitlement.js +35 -0
  48. package/dist/clients/entitlement.js.map +1 -0
  49. package/dist/clients/event.d.ts +5 -5
  50. package/dist/clients/event.js +29 -18
  51. package/dist/clients/event.js.map +1 -0
  52. package/dist/clients/feature.d.ts +46 -0
  53. package/dist/clients/feature.js +76 -0
  54. package/dist/clients/feature.js.map +1 -0
  55. package/dist/clients/grant.d.ts +24 -0
  56. package/dist/clients/grant.js +37 -0
  57. package/dist/clients/grant.js.map +1 -0
  58. package/dist/clients/meter.d.ts +13 -30
  59. package/dist/clients/meter.js +15 -0
  60. package/dist/clients/meter.js.map +1 -0
  61. package/dist/clients/pagination.d.ts +6 -0
  62. package/dist/clients/pagination.js +2 -0
  63. package/dist/clients/pagination.js.map +1 -0
  64. package/dist/clients/portal.d.ts +22 -0
  65. package/dist/clients/portal.js +37 -0
  66. package/dist/clients/portal.js.map +1 -0
  67. package/dist/clients/subject.d.ts +125 -0
  68. package/dist/clients/subject.js +238 -0
  69. package/dist/clients/subject.js.map +1 -0
  70. package/dist/index.d.ts +11 -2
  71. package/dist/index.js +16 -1
  72. package/dist/index.js.map +1 -0
  73. package/dist/schemas/openapi.d.ts +2790 -164
  74. package/dist/schemas/openapi.js +1 -0
  75. package/dist/schemas/openapi.js.map +1 -0
  76. package/dist/test/agent.js +327 -29
  77. package/dist/test/agent.js.map +1 -0
  78. package/dist/test/mocks.d.ts +13 -0
  79. package/dist/test/mocks.js +118 -0
  80. package/dist/test/mocks.js.map +1 -0
  81. package/dist/tsconfig.tsbuildinfo +1 -1
  82. package/package.json +40 -30
  83. package/dist/next.d.ts +0 -15
  84. package/dist/next.js +0 -46
  85. package/index.ts +0 -19
  86. package/next.ts +0 -76
package/README.md CHANGED
@@ -54,6 +54,12 @@ const event: Event = {
54
54
  await openmeter.events.ingest(event)
55
55
  ```
56
56
 
57
+ ### batch ingest
58
+
59
+ ```ts
60
+ await openmeter.events.ingest([event1, event2, event3])
61
+ ```
62
+
57
63
  #### list
58
64
 
59
65
  Retrieve latest raw events. Useful for debugging.
@@ -96,7 +102,7 @@ const values = await openmeter.meters.query('my-meter-slug', {
96
102
  })
97
103
  ```
98
104
 
99
- #### subjects
105
+ #### meter subjects
100
106
 
101
107
  List meter subjects.
102
108
 
@@ -104,57 +110,229 @@ List meter subjects.
104
110
  const subjects = await openmeter.meters.subjects('my-meter-slug')
105
111
  ```
106
112
 
107
- ## Helpers
113
+ ### Portal
114
+
115
+ #### createToken
116
+
117
+ Create subject-specific tokens.
118
+ Useful to build consumer dashboards.
119
+
120
+ ```ts
121
+ const token = await openmeter.portal.createToken({ subject: 'customer-1' })
122
+ ```
123
+
124
+ #### invalidateTokens
125
+
126
+ Invalidate portal tokens for all or specific subjects.
127
+
128
+ ```ts
129
+ await openmeter.portal.invalidateTokens()
130
+ ```
131
+
132
+ ### Subject
108
133
 
109
- ### Vercel AI SDK / Next.js
134
+ Subject mappings. Like display name and metadata.
135
+
136
+ #### upsert
137
+
138
+ Upsert subjects.
139
+
140
+ ```ts
141
+ const subjects = await openmeter.subjects.upsert([
142
+ {
143
+ key: 'customer-1',
144
+ displayName: 'ACME',
145
+ },
146
+ ])
147
+ ```
148
+
149
+ #### list
150
+
151
+ List subjects.
152
+
153
+ ```ts
154
+ const subjects = await openmeter.subjects.list()
155
+ ```
156
+
157
+ #### get
110
158
 
111
- The OpenAI streaming API used by the Vercel AI SDK doesn't return token usage metadata by default.
112
- The OpenMeter `createOpenAIStreamCallback` helper function decorates the callback with a `onUsage`
113
- callback which you can use to report usage to OpenMeter.
159
+ Get subject by key.
114
160
 
115
161
  ```ts
116
- import OpenAI from 'openai'
117
- import { OpenAIStream, StreamingTextResponse } from 'ai'
118
- import { createOpenAIStreamCallback } from '@openmeter/sdk'
162
+ const subjects = await openmeter.subjects.get('customer-1')
163
+ ```
164
+
165
+ #### delete
166
+
167
+ Delete subject by key.
168
+ It doesn't delete corresponding usage.
169
+
170
+ ```ts
171
+ await openmeter.subjects.delete('customer-1')
172
+ ```
173
+
174
+ #### createEntitlement
175
+
176
+ Create entitlement for a subject.
177
+ Entitlements allow you to manage subject feature access, balances, and usage limits.
178
+
179
+ ```ts
180
+ // Issue 10,000,000 tokens every month
181
+ const entitlement = await openmeter.subjects.createEntitlement('customer-1', {
182
+ type: 'metered',
183
+ featureKey: 'ai_tokens',
184
+ usagePeriod: {
185
+ interval: 'MONTH',
186
+ },
187
+ issueAfterReset: 10000000,
188
+ })
189
+ ```
190
+
191
+ #### listEntitlements
192
+
193
+ List subject entitlements.
194
+
195
+ ```ts
196
+ const entitlement = await openmeter.subjects.listEntitlements('customer-1')
197
+ ```
198
+
199
+ #### getEntitlement
200
+
201
+ Get a subject entitlement by ID by Feature ID or by Feature Key.
202
+
203
+ ```ts
204
+ const entitlement = await openmeter.subjects.getEntitlement(
205
+ 'customer-1',
206
+ 'ai_tokens'
207
+ )
208
+ ```
209
+
210
+ #### deleteEntitlement
211
+
212
+ Delete a subject entitlement by ID by Feature ID or by Feature Key.
213
+
214
+ ```ts
215
+ await openmeter.subjects.deleteEntitlement('customer-1', 'ai_tokens')
216
+ ```
119
217
 
120
- export async function POST(req: Request) {
121
- const { messages } = await req.json()
122
- const model = 'gpt-3.5-turbo'
218
+ #### getEntitlementValue
123
219
 
124
- const response = await openai.chat.completions.create({
125
- model,
126
- messages,
127
- stream: true,
128
- })
220
+ Get entitlement value by ID by Feature ID or by Feature Key.
129
221
 
130
- const streamCallbacks = await createOpenAIStreamCallback(
131
- {
132
- model,
133
- prompts: messages.map(({ content }) => content),
222
+ ```ts
223
+ const value = await openmeter.subjects.getEntitlementValue(
224
+ 'customer-1',
225
+ 'ai_tokens'
226
+ )
227
+ ```
228
+
229
+ #### getEntitlementHistory
230
+
231
+ Get entitlement history by ID by Feature ID or by Feature Key
232
+
233
+ ```ts
234
+ const entitlement = await openmeter.subjects.getEntitlementHistory(
235
+ 'customer-1',
236
+ 'ai_tokens'
237
+ )
238
+ ```
239
+
240
+ #### resetEntitlementUsage
241
+
242
+ Reset the entitlement usage and start a new period. Eligible grants will be rolled over.
243
+
244
+ ```ts
245
+ const entitlement = await openmeter.subjects.resetEntitlementUsage(
246
+ 'customer-1',
247
+ {
248
+ retainAnchor: true,
249
+ }
250
+ )
251
+ ```
252
+
253
+ #### createEntitlementGrant
254
+
255
+ Create a grant for an entitlement.
256
+
257
+ ```ts
258
+ const grant = await openmeter.subjects.createEntitlementGrant(
259
+ 'customer-1',
260
+ 'ai_tokens',
261
+ {
262
+ amount: 100,
263
+ priority: 1,
264
+ effectiveAt: '2023-01-01T00:00:00Z',
265
+ expiration: {
266
+ duration: 'HOUR',
267
+ count: 12,
134
268
  },
135
- {
136
- // onToken() => {...}
137
- // onFinal() => {...}
138
- async onUsage(usage) {
139
- try {
140
- await openmeter.events.ingest({
141
- source: 'my-app',
142
- type: 'my-event-type',
143
- subject: 'my-customer-id',
144
- data: {
145
- // Usage is { total_tokens, prompt_tokens, completion_tokens }
146
- ...usage,
147
- model,
148
- },
149
- })
150
- } catch (err) {
151
- console.error('failed to ingest usage', err)
152
- }
153
- },
154
- }
155
- )
156
-
157
- const stream = OpenAIStream(response, streamCallbacks)
158
- return new StreamingTextResponse(stream)
159
- }
269
+ minRolloverAmount: 100,
270
+ maxRolloverAmount: 100,
271
+ recurrence: {
272
+ interval: 'MONTH',
273
+ anchor: '2024-06-28T18:29:44.867Z',
274
+ },
275
+ }
276
+ )
277
+ ```
278
+
279
+ #### listEntitlementGrants
280
+
281
+ List entitlement grants
282
+
283
+ ```ts
284
+ const entitlement = await openmeter.subjects.listEntitlementGrants('customer-1', 'ai_tokens)
285
+ ```
286
+
287
+ ## Features
288
+
289
+ Features are the building blocks of your entitlements, part of your product offering.
290
+
291
+ #### create
292
+
293
+ Upsert subjects.
294
+
295
+ ```ts
296
+ const feature = await openmeter.features.create({
297
+ key: 'ai_tokens',
298
+ name: 'AI Tokens',
299
+ // optional
300
+ meterSlug: 'tokens_total',
301
+ })
302
+ ```
303
+
304
+ #### list
305
+
306
+ List features.
307
+
308
+ ```ts
309
+ const features = await openmeter.features.list()
310
+ ```
311
+
312
+ #### get
313
+
314
+ Get feature by key.
315
+
316
+ ```ts
317
+ const feature = await openmeter.features.get('ai_tokens')
318
+ ```
319
+
320
+ #### delete
321
+
322
+ Delete feature by key.
323
+
324
+ ```ts
325
+ await openmeter.features.delete('ai_tokens')
326
+ ```
327
+
328
+ ## Grants
329
+
330
+ Entitlement grants allow to issue of additional one-time or recurring allowances on a subject's entitlement.
331
+
332
+ #### list
333
+
334
+ List grants.
335
+
336
+ ```ts
337
+ const grants = await openmeter.grants.list()
160
338
  ```
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpError = exports.BaseClient = void 0;
4
+ const undici_1 = require("undici");
5
+ class BaseClient {
6
+ config;
7
+ constructor(config) {
8
+ this.config = config;
9
+ }
10
+ async request({ path, method, searchParams, headers, body, options, }) {
11
+ // Building URL
12
+ const url = this.getUrl(path, searchParams);
13
+ // Request options
14
+ const reqHeaders = {
15
+ Accept: 'application/json',
16
+ ...headers,
17
+ ...this.getAuthHeaders(),
18
+ ...this.config.headers,
19
+ ...options?.headers,
20
+ };
21
+ const reqOpts = {
22
+ method,
23
+ headers: reqHeaders,
24
+ };
25
+ // Optional body
26
+ if (body) {
27
+ if (!reqHeaders['Content-Type'] && !reqHeaders['content-type']) {
28
+ throw new Error('Content Type is required with body');
29
+ }
30
+ reqOpts.body = body;
31
+ }
32
+ const resp = await (0, undici_1.request)(url, reqOpts);
33
+ // Error handling
34
+ if (resp.statusCode > 399) {
35
+ if (resp.headers['content-type'] === 'application/problem+json') {
36
+ const problem = (await resp.body.json());
37
+ throw new HttpError({
38
+ statusCode: resp.statusCode,
39
+ problem,
40
+ });
41
+ }
42
+ // Requests can fail before API, in this case we only have a status code
43
+ throw new HttpError({
44
+ statusCode: resp.statusCode,
45
+ });
46
+ }
47
+ // Response parsing
48
+ if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {
49
+ return undefined;
50
+ }
51
+ if (resp.headers['content-type'] === 'application/json') {
52
+ return (await resp.body.json());
53
+ }
54
+ if (!resp.headers['content-type']) {
55
+ throw new Error('Missing content type');
56
+ }
57
+ throw new Error(`Unknown content type: ${resp.headers['content-type']}`);
58
+ }
59
+ getUrl(path, searchParams) {
60
+ let qs = searchParams ? searchParams.toString() : '';
61
+ qs = qs.length > 0 ? `?${qs}` : '';
62
+ const url = new URL(`${path}${qs}`, this.config.baseUrl);
63
+ return url;
64
+ }
65
+ getAuthHeaders() {
66
+ if (this.config.token) {
67
+ return {
68
+ authorization: `Bearer ${this.config.token}`,
69
+ };
70
+ }
71
+ if (this.config.username && this.config.password) {
72
+ const encoded = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');
73
+ return {
74
+ authorization: `Basic ${encoded}`,
75
+ };
76
+ }
77
+ return {};
78
+ }
79
+ static toURLSearchParams(params) {
80
+ const searchParams = new URLSearchParams();
81
+ for (const [key, value] of Object.entries(params)) {
82
+ if (value === undefined) {
83
+ continue;
84
+ }
85
+ if (Array.isArray(value)) {
86
+ for (const item of value) {
87
+ searchParams.append(key, item);
88
+ }
89
+ }
90
+ else if (typeof value === 'boolean') {
91
+ searchParams.append(key, value.toString());
92
+ }
93
+ else if (value instanceof Date) {
94
+ searchParams.append(key, value.toISOString());
95
+ }
96
+ else if (typeof value === 'object') {
97
+ Object.entries(value).forEach(([k, v]) => {
98
+ searchParams.append(`${key}[${k}]`, v);
99
+ });
100
+ }
101
+ else {
102
+ searchParams.append(key, value.toString());
103
+ }
104
+ }
105
+ return searchParams;
106
+ }
107
+ }
108
+ exports.BaseClient = BaseClient;
109
+ class HttpError extends Error {
110
+ statusCode;
111
+ problem;
112
+ constructor({ statusCode, problem, }) {
113
+ super(problem?.type || 'unexpected status code');
114
+ this.name = 'HttpError';
115
+ this.statusCode = statusCode;
116
+ this.problem = problem;
117
+ }
118
+ }
119
+ exports.HttpError = HttpError;
120
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,37 @@
1
+ import { IncomingHttpHeaders } from 'http';
2
+ import { Dispatcher } from 'undici';
3
+ import { components } from '../schemas/openapi.cjs';
4
+ export type OpenMeterConfig = {
5
+ baseUrl: string;
6
+ token?: string;
7
+ username?: string;
8
+ password?: string;
9
+ headers?: IncomingHttpHeaders;
10
+ };
11
+ export type RequestOptions = {
12
+ headers?: IncomingHttpHeaders;
13
+ };
14
+ export type Problem = components['schemas']['Problem'];
15
+ export declare class BaseClient {
16
+ protected config: OpenMeterConfig;
17
+ constructor(config: OpenMeterConfig);
18
+ protected request<T>({ path, method, searchParams, headers, body, options, }: {
19
+ path: string;
20
+ method: Dispatcher.HttpMethod;
21
+ searchParams?: URLSearchParams;
22
+ headers?: IncomingHttpHeaders;
23
+ body?: string | Buffer | Uint8Array;
24
+ options?: RequestOptions;
25
+ }): Promise<T>;
26
+ protected getUrl(path: string, searchParams?: URLSearchParams): import("url").URL;
27
+ protected getAuthHeaders(): IncomingHttpHeaders;
28
+ protected static toURLSearchParams(params: Record<string, string | boolean | number | Date | string[] | Record<string, string> | undefined>): URLSearchParams;
29
+ }
30
+ export declare class HttpError extends Error {
31
+ statusCode: number;
32
+ problem?: Problem;
33
+ constructor({ statusCode, problem, }: {
34
+ statusCode: number;
35
+ problem?: Problem;
36
+ });
37
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../clients/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntitlementClient = void 0;
4
+ const client_js_1 = require("./client.cjs");
5
+ class EntitlementClient extends client_js_1.BaseClient {
6
+ constructor(config) {
7
+ super(config);
8
+ }
9
+ /**
10
+ * List all entitlements regardless of subject.
11
+ * @example
12
+ * const entitlement = await openmeter.entitlements.list()
13
+ */
14
+ async list(params, options) {
15
+ const searchParams = params
16
+ ? client_js_1.BaseClient.toURLSearchParams(params)
17
+ : undefined;
18
+ return await this.request({
19
+ path: '/api/v1/entitlements',
20
+ method: 'GET',
21
+ searchParams,
22
+ options,
23
+ });
24
+ }
25
+ /**
26
+ * List all entitlements regardless of subject.
27
+ * @example
28
+ * const entitlement = await openmeter.entitlements.list()
29
+ */
30
+ async get(id, options) {
31
+ return await this.request({
32
+ path: `/api/v1/entitlements/${id}`,
33
+ method: 'GET',
34
+ options,
35
+ });
36
+ }
37
+ }
38
+ exports.EntitlementClient = EntitlementClient;
39
+ //# sourceMappingURL=entitlement.js.map
@@ -0,0 +1,32 @@
1
+ import { components, operations } from '../schemas/openapi.cjs';
2
+ import { RequestOptions, BaseClient, OpenMeterConfig } from './client.cjs';
3
+ import { Paginated } from './pagination.cjs';
4
+ export type Entitlement = EntitlementMetered | EntitlementStatic | EntitlementBoolean;
5
+ export type EntitlementMetered = components['schemas']['EntitlementMetered'];
6
+ export type EntitlementStatic = components['schemas']['EntitlementStatic'];
7
+ export type EntitlementBoolean = components['schemas']['EntitlementBoolean'];
8
+ export type RecurringPeriodEnum = components['schemas']['RecurringPeriodEnum'];
9
+ export type EntitlementValue = components['schemas']['EntitlementValue'];
10
+ export type WindowedBalanceHistory = components['schemas']['WindowedBalanceHistory'];
11
+ export type EntitlementCreateInputs = EntitlementMeteredCreateInputs | EntitlementStaticCreateInputs | EntitlementBooleanCreateInputs;
12
+ export type EntitlementMeteredCreateInputs = components['schemas']['EntitlementMeteredCreateInputs'];
13
+ export type EntitlementStaticCreateInputs = components['schemas']['EntitlementStaticCreateInputs'];
14
+ export type EntitlementBooleanCreateInputs = components['schemas']['EntitlementBooleanCreateInputs'];
15
+ export type EntitlementResetInputs = operations['resetEntitlementUsage']['requestBody']['content']['application/json'];
16
+ export type ListEntitlementQueryParams = operations['listEntitlements']['parameters']['query'];
17
+ export type GetEntitlementHistoryQueryParams = operations['getEntitlementHistory']['parameters']['query'];
18
+ export declare class EntitlementClient extends BaseClient {
19
+ constructor(config: OpenMeterConfig);
20
+ /**
21
+ * List all entitlements regardless of subject.
22
+ * @example
23
+ * const entitlement = await openmeter.entitlements.list()
24
+ */
25
+ list(params?: ListEntitlementQueryParams, options?: RequestOptions): Promise<Entitlement[] | Paginated<Entitlement>>;
26
+ /**
27
+ * List all entitlements regardless of subject.
28
+ * @example
29
+ * const entitlement = await openmeter.entitlements.list()
30
+ */
31
+ get(id: string, options?: RequestOptions): Promise<Entitlement>;
32
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../../../clients/entitlement.ts"],"names":[],"mappings":";;;AACA,2CAAyE;AA+BzE,MAAa,iBAAkB,SAAQ,sBAAU;IAC/C,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAI,CACf,MAAmC,EACnC,OAAwB;QAExB,MAAM,YAAY,GAAG,MAAM;YACzB,CAAC,CAAC,sBAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,SAAS,CAAA;QACb,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,KAAK;YACb,YAAY;YACZ,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,OAAwB;QACnD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,wBAAwB,EAAE,EAAE;YAClC,MAAM,EAAE,KAAK;YACb,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF;AArCD,8CAqCC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EventsClient = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const client_js_1 = require("./client.cjs");
9
+ class EventsClient extends client_js_1.BaseClient {
10
+ constructor(config) {
11
+ super(config);
12
+ }
13
+ /**
14
+ * Ingest usage event in a CloudEvents format
15
+ * @see https://cloudevents.io
16
+ */
17
+ async ingest(usageEvent, options) {
18
+ const isBatch = Array.isArray(usageEvent);
19
+ const cloudEvents = (isBatch ? usageEvent : [usageEvent]).map((ev) => {
20
+ // Validate content type
21
+ if (ev.datacontenttype && ev.datacontenttype !== 'application/json') {
22
+ throw new TypeError(`Unsupported datacontenttype: ${ev.datacontenttype}`);
23
+ }
24
+ // We default where we can to lower the barrier to use CloudEvents
25
+ const cloudEvent = {
26
+ specversion: ev.specversion ?? '1.0',
27
+ id: ev.id ?? crypto_1.default.randomUUID(),
28
+ source: ev.source ?? '@openmeter/sdk',
29
+ type: ev.type,
30
+ subject: ev.subject,
31
+ time: ev.time?.toISOString(),
32
+ datacontenttype: ev.datacontenttype,
33
+ dataschema: ev.dataschema,
34
+ data: ev.data,
35
+ };
36
+ return cloudEvent;
37
+ });
38
+ const contentType = isBatch
39
+ ? 'application/cloudevents-batch+json'
40
+ : 'application/cloudevents+json';
41
+ const body = isBatch
42
+ ? JSON.stringify(cloudEvents)
43
+ : JSON.stringify(cloudEvents[0]);
44
+ // Making Request
45
+ return await this.request({
46
+ path: '/api/v1/events',
47
+ method: 'POST',
48
+ body,
49
+ headers: {
50
+ 'Content-Type': contentType,
51
+ },
52
+ options,
53
+ });
54
+ }
55
+ /**
56
+ * List raw events
57
+ */
58
+ async list(params, options) {
59
+ const searchParams = params
60
+ ? client_js_1.BaseClient.toURLSearchParams(params)
61
+ : undefined;
62
+ return this.request({
63
+ method: 'GET',
64
+ path: `/api/v1/events`,
65
+ searchParams,
66
+ options,
67
+ });
68
+ }
69
+ }
70
+ exports.EventsClient = EventsClient;
71
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1,79 @@
1
+ import { components } from '../schemas/openapi.cjs';
2
+ import { RequestOptions, BaseClient, OpenMeterConfig } from './client.cjs';
3
+ export type CloudEvent = components['schemas']['Event'];
4
+ export type IngestedEvent = components['schemas']['IngestedEvent'];
5
+ export type EventsQueryParams = {
6
+ /**
7
+ * @description Limit number of results. Max: 100
8
+ * @example 25
9
+ */
10
+ limit?: number;
11
+ };
12
+ /**
13
+ * Usage Event
14
+ */
15
+ export type Event = {
16
+ /**
17
+ * @description The version of the CloudEvents specification which the event uses.
18
+ * @example 1.0
19
+ */
20
+ specversion?: string;
21
+ /**
22
+ * @description Unique identifier for the event, defaults to uuid v4.
23
+ * @example "5c10fade-1c9e-4d6c-8275-c52c36731d3c"
24
+ */
25
+ id?: string;
26
+ /**
27
+ * Format: uri-reference
28
+ * @description Identifies the context in which an event happened, defaults to: @openmeter/sdk
29
+ * @example services/service-0
30
+ */
31
+ source?: string;
32
+ /**
33
+ * @description Describes the type of event related to the originating occurrence.
34
+ * @example "api_request"
35
+ */
36
+ type: string;
37
+ /**
38
+ * @description Describes the subject of the event in the context of the event producer (identified by source).
39
+ * @example "customer_id"
40
+ */
41
+ subject: string;
42
+ /**
43
+ * Format: date-time
44
+ * @description Date of when the occurrence happened.
45
+ * @example new Date('2023-01-01T01:01:01.001Z')
46
+ */
47
+ time?: Date;
48
+ /**
49
+ * Format: uri
50
+ * @description Identifies the schema that data adheres to.
51
+ */
52
+ dataschema?: string;
53
+ /**
54
+ * @description Content type of the data value. Must adhere to RFC 2046 format.
55
+ * @example application/json
56
+ * @enum {string|null}
57
+ */
58
+ datacontenttype?: 'application/json';
59
+ /**
60
+ * @description The event payload.
61
+ * @example {
62
+ * "duration_ms": "12",
63
+ * "path": "/hello"
64
+ * }
65
+ */
66
+ data: Record<string, unknown>;
67
+ };
68
+ export declare class EventsClient extends BaseClient {
69
+ constructor(config: OpenMeterConfig);
70
+ /**
71
+ * Ingest usage event in a CloudEvents format
72
+ * @see https://cloudevents.io
73
+ */
74
+ ingest(usageEvent: Event | Event[], options?: RequestOptions): Promise<void>;
75
+ /**
76
+ * List raw events
77
+ */
78
+ list(params?: EventsQueryParams, options?: RequestOptions): Promise<IngestedEvent[]>;
79
+ }